Down integrate to Github
diff --git a/cmake/libprotobuf-lite.cmake b/cmake/libprotobuf-lite.cmake
index 890074f..81a091f 100644
--- a/cmake/libprotobuf-lite.cmake
+++ b/cmake/libprotobuf-lite.cmake
@@ -7,6 +7,7 @@
   ${protobuf_source_dir}/src/google/protobuf/implicit_weak_message.cc
   ${protobuf_source_dir}/src/google/protobuf/parse_context.cc
   ${protobuf_source_dir}/src/google/protobuf/io/coded_stream.cc
+  ${protobuf_source_dir}/src/google/protobuf/io/io_win32.cc
   ${protobuf_source_dir}/src/google/protobuf/io/strtod.cc
   ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream.cc
   ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
@@ -15,7 +16,6 @@
   ${protobuf_source_dir}/src/google/protobuf/stubs/bytestream.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/common.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/int128.cc
-  ${protobuf_source_dir}/src/google/protobuf/stubs/io_win32.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/status.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/statusor.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/stringpiece.cc
diff --git a/cmake/tests.cmake b/cmake/tests.cmake
index f4679d1..7226961 100644
--- a/cmake/tests.cmake
+++ b/cmake/tests.cmake
@@ -156,6 +156,7 @@
   ${protobuf_source_dir}/src/google/protobuf/extension_set_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/generated_message_reflection_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/io/coded_stream_unittest.cc
+  ${protobuf_source_dir}/src/google/protobuf/io/io_win32_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/io/printer_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/io/tokenizer_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream_unittest.cc
@@ -175,7 +176,6 @@
   ${protobuf_source_dir}/src/google/protobuf/stubs/bytestream_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/common_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/int128_unittest.cc
-  ${protobuf_source_dir}/src/google/protobuf/stubs/io_win32_unittest.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/status_test.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/statusor_test.cc
   ${protobuf_source_dir}/src/google/protobuf/stubs/stringpiece_unittest.cc
diff --git a/conformance/text_format_conformance_suite.cc b/conformance/text_format_conformance_suite.cc
index 76f398c..97b7b90 100644
--- a/conformance/text_format_conformance_suite.cc
+++ b/conformance/text_format_conformance_suite.cc
@@ -236,7 +236,7 @@
   RunValidTextFormatTest("FloatFieldWithVeryPreciseNumber", REQUIRED,
                          "optional_float: 3.123456789123456789");
   RunValidTextFormatTest("FloatFieldMaxValue", REQUIRED,
-                         "optional_float: 3.40282e+38");
+                         "optional_float: 3.4028235e+38");
   RunValidTextFormatTest("FloatFieldMinValue", REQUIRED,
                          "optional_float: 1.17549e-38");
   RunValidTextFormatTest("FloatFieldNaNValue", REQUIRED,
@@ -286,6 +286,31 @@
   message.add_repeated_int32(2);
   message.add_repeated_int32(3);
   RunValidUnknownTextFormatTest("RepeatedUnknownFields", message);
+
+  // Any fields
+  RunValidTextFormatTest("AnyField", REQUIRED,
+                         R"(
+      optional_any: {
+        [type.googleapis.com/protobuf_test_messages.proto3.TestAllTypesProto3] {
+          optional_int32: 12345
+        }
+      }
+      )");
+  RunValidTextFormatTest("AnyFieldWithRawBytes", REQUIRED,
+                         R"(
+      optional_any: {
+        type_url: "type.googleapis.com/protobuf_test_messages.proto3.TestAllTypesProto3"
+        value: "\b\271`"
+      }
+      )");
+  ExpectParseFailure("AnyFieldWithInvalidType", REQUIRED,
+                     R"(
+      optional_any: {
+        [type.googleapis.com/unknown] {
+          optional_int32: 12345
+        }
+      }
+      )");
 }
 
 }  // namespace protobuf
diff --git a/conformance/text_format_failure_list_java.txt b/conformance/text_format_failure_list_java.txt
index 4902d46..81433b4 100755
--- a/conformance/text_format_failure_list_java.txt
+++ b/conformance/text_format_failure_list_java.txt
@@ -2,3 +2,5 @@
 Recommended.Proto3.ProtobufInput.MessageUnknownFields_Drop.TextFormatOutput
 Recommended.Proto3.ProtobufInput.RepeatedUnknownFields_Drop.TextFormatOutput
 Recommended.Proto3.ProtobufInput.ScalarUnknownFields_Drop.TextFormatOutput
+Required.Proto3.TextFormatInput.AnyField.ProtobufOutput
+Required.Proto3.TextFormatInput.AnyField.TextFormatOutput
diff --git a/conformance/text_format_failure_list_python.txt b/conformance/text_format_failure_list_python.txt
index 9a8709d..b2db95e 100644
--- a/conformance/text_format_failure_list_python.txt
+++ b/conformance/text_format_failure_list_python.txt
@@ -1,3 +1,5 @@
 # This is the list of text format conformance tests that are known to fail right
 # now.
 # TODO: These should be fixed.
+Required.Proto3.TextFormatInput.FloatFieldMaxValue.ProtobufOutput
+Required.Proto3.TextFormatInput.FloatFieldMaxValue.TextFormatOutput
diff --git a/java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java b/java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java
index 1720575..ba0138a 100644
--- a/java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java
+++ b/java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java
@@ -106,6 +106,56 @@
   }
 
 
+  @ExperimentalApi
+  protected final boolean isInitializedInternal() {
+    return Protobuf.getInstance().schemaFor(this).isInitialized(this);
+  }
+
+  @ExperimentalApi
+  protected final int getSerializedSizeInternal() {
+    return Protobuf.getInstance().schemaFor(this).getSerializedSize(this);
+  }
+
+  int getSerializedSize(Schema schema) {
+    int memoizedSerializedSize = getMemoizedSerializedSize();
+    if (memoizedSerializedSize == -1) {
+      memoizedSerializedSize = schema.getSerializedSize(this);
+      setMemoizedSerializedSize(memoizedSerializedSize);
+    }
+    return memoizedSerializedSize;
+  }
+
+  @ExperimentalApi
+  protected final void writeToInternal(CodedOutputStream output) throws IOException {
+    Protobuf.getInstance()
+        .schemaFor(getClassInternal())
+        .writeTo(this, CodedOutputStreamWriter.forCodedOutput(output));
+  }
+
+  @ExperimentalApi
+  protected void mergeFromInternal(CodedInputStream input, ExtensionRegistryLite extensionRegistry)
+      throws InvalidProtocolBufferException {
+    try {
+      Protobuf.getInstance()
+          .schemaFor(getClassInternal())
+          .mergeFrom(this, CodedInputStreamReader.forCodedInput(input), extensionRegistry);
+    } catch (InvalidProtocolBufferException e) {
+      throw e.setUnfinishedMessage(this);
+    } catch (IOException e) {
+      throw new InvalidProtocolBufferException(e).setUnfinishedMessage(this);
+    }
+  }
+
+  @ExperimentalApi
+  protected void makeImmutableInternal() {
+    Protobuf.getInstance().schemaFor(getClassInternal()).makeImmutable(this);
+  }
+
+  @SuppressWarnings("unchecked")
+  private Class<AbstractMessageLite<MessageType, BuilderType>> getClassInternal() {
+    return (Class<AbstractMessageLite<MessageType, BuilderType>>) getClass();
+  }
+
   /** Package private helper method for AbstractParser to create UninitializedMessageException. */
   UninitializedMessageException newUninitializedMessageException() {
     return new UninitializedMessageException(this);
diff --git a/java/core/src/main/java/com/google/protobuf/AllocatedBuffer.java b/java/core/src/main/java/com/google/protobuf/AllocatedBuffer.java
new file mode 100755
index 0000000..a01a6c1
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/AllocatedBuffer.java
@@ -0,0 +1,263 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.Internal.checkNotNull;
+
+import java.nio.ByteBuffer;
+
+/**
+ * A buffer that was allocated by a {@link BufferAllocator}. For every buffer, it is guaranteed that
+ * at least one of {@link #hasArray()} or {@link #hasNioBuffer()} will be {@code true}.
+ */
+@ExperimentalApi
+abstract class AllocatedBuffer {
+  /**
+   * Indicates whether this buffer contains a backing {@link ByteBuffer} (i.e. it is safe to call
+   * {@link #nioBuffer()}).
+   */
+  public abstract boolean hasNioBuffer();
+
+  /**
+   * Indicates whether this buffer contains a backing array (i.e. it is safe to call {@link
+   * #array()}).
+   */
+  public abstract boolean hasArray();
+
+  /**
+   * Returns the {@link ByteBuffer} that backs this buffer <i>(optional operation)</i>.
+   *
+   * <p>Call {@link #hasNioBuffer()} before invoking this method in order to ensure that this buffer
+   * has a backing {@link ByteBuffer}.
+   *
+   * @return The {@link ByteBuffer} that backs this buffer
+   * @throws UnsupportedOperationException If this buffer is not backed by a {@link ByteBuffer}.
+   */
+  public abstract ByteBuffer nioBuffer();
+
+  /**
+   * Returns the byte array that backs this buffer <i>(optional operation)</i>.
+   *
+   * <p>Call {@link #hasArray()} before invoking this method in order to ensure that this buffer has
+   * an accessible backing array.
+   *
+   * @return The array that backs this buffer
+   * @throws java.nio.ReadOnlyBufferException If this buffer is backed by an array but is read-only
+   * @throws UnsupportedOperationException If this buffer is not backed by an accessible array
+   */
+  public abstract byte[] array();
+
+  /**
+   * Returns the offset within this buffer's backing array of the first element of the buffer
+   * <i>(optional operation)</i>.
+   *
+   * <p>If this buffer is backed by an array then {@link #position()} corresponds to the array index
+   * {@link #position()} {@code +} {@link #arrayOffset()}.
+   *
+   * <p>Invoke the {@link #hasArray hasArray} method before invoking this method in order to ensure
+   * that this buffer has an accessible backing array.
+   *
+   * @return The offset within this buffer's array of the first element of the buffer
+   * @throws java.nio.ReadOnlyBufferException If this buffer is backed by an array but is read-only
+   * @throws UnsupportedOperationException If this buffer is not backed by an accessible array
+   */
+  public abstract int arrayOffset();
+
+  /**
+   * Returns this buffer's position.
+   *
+   * @return The position of this buffer
+   */
+  public abstract int position();
+
+  /**
+   * Sets this buffer's position.
+   *
+   * @param position The new position value; must be non-negative and no larger than the current
+   *     limit
+   * @return This buffer
+   * @throws IllegalArgumentException If the preconditions on {@code position} do not hold
+   */
+  public abstract AllocatedBuffer position(int position);
+
+  /**
+   * Returns this buffer's limit.
+   *
+   * @return The limit of this buffer
+   */
+  public abstract int limit();
+
+  /**
+   * Returns the number of elements between the current {@link #position()} and the {@link #limit()}
+   * .
+   *
+   * @return The number of elements remaining in this buffer
+   */
+  public abstract int remaining();
+
+  /**
+   * Creates a new {@link AllocatedBuffer} that is backed by the given array. The returned buffer
+   * will have {@link #hasArray} == {@code true}, {@link #arrayOffset()} == {@code 0}, {@link
+   * #position()} == {@code 0} and {@link #limit()} equal to the length of {@code bytes}.
+   */
+  public static AllocatedBuffer wrap(byte[] bytes) {
+    return wrapNoCheck(bytes, 0, bytes.length);
+  }
+
+  /**
+   * Creates a new {@link AllocatedBuffer} that is backed by the given array. The returned buffer
+   * will have {@link #hasArray} == {@code true}, {@link #arrayOffset()} == {@code offset}, {@link
+   * #position()} == {@code 0} and {@link #limit()} == {@code length}.
+   */
+  public static AllocatedBuffer wrap(final byte[] bytes, final int offset, final int length) {
+    if (offset < 0 || length < 0 || (offset + length) > bytes.length) {
+      throw new IndexOutOfBoundsException(
+          String.format("bytes.length=%d, offset=%d, length=%d", bytes.length, offset, length));
+    }
+
+    return wrapNoCheck(bytes, offset, length);
+  }
+
+  /**
+   * Creates a new {@link AllocatedBuffer} that is backed by the given {@link ByteBuffer}. The
+   * returned buffer will have {@link #hasNioBuffer} == {@code true}.
+   */
+  public static AllocatedBuffer wrap(final ByteBuffer buffer) {
+    checkNotNull(buffer, "buffer");
+
+    return new AllocatedBuffer() {
+
+      @Override
+      public boolean hasNioBuffer() {
+        return true;
+      }
+
+      @Override
+      public ByteBuffer nioBuffer() {
+        return buffer;
+      }
+
+      @Override
+      public boolean hasArray() {
+        return buffer.hasArray();
+      }
+
+      @Override
+      public byte[] array() {
+        return buffer.array();
+      }
+
+      @Override
+      public int arrayOffset() {
+        return buffer.arrayOffset();
+      }
+
+      @Override
+      public int position() {
+        return buffer.position();
+      }
+
+      @Override
+      public AllocatedBuffer position(int position) {
+        buffer.position(position);
+        return this;
+      }
+
+      @Override
+      public int limit() {
+        return buffer.limit();
+      }
+
+      @Override
+      public int remaining() {
+        return buffer.remaining();
+      }
+    };
+  }
+
+  private static AllocatedBuffer wrapNoCheck(
+      final byte[] bytes, final int offset, final int length) {
+    return new AllocatedBuffer() {
+      // Relative to offset.
+      private int position;
+
+      @Override
+      public boolean hasNioBuffer() {
+        return false;
+      }
+
+      @Override
+      public ByteBuffer nioBuffer() {
+        throw new UnsupportedOperationException();
+      }
+
+      @Override
+      public boolean hasArray() {
+        return true;
+      }
+
+      @Override
+      public byte[] array() {
+        return bytes;
+      }
+
+      @Override
+      public int arrayOffset() {
+        return offset;
+      }
+
+      @Override
+      public int position() {
+        return position;
+      }
+
+      @Override
+      public AllocatedBuffer position(int position) {
+        if (position < 0 || position > length) {
+          throw new IllegalArgumentException("Invalid position: " + position);
+        }
+        this.position = position;
+        return this;
+      }
+
+      @Override
+      public int limit() {
+        // Relative to offset.
+        return length;
+      }
+
+      @Override
+      public int remaining() {
+        return length - position;
+      }
+    };
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/ArrayDecoders.java b/java/core/src/main/java/com/google/protobuf/ArrayDecoders.java
new file mode 100755
index 0000000..a969c04
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/ArrayDecoders.java
@@ -0,0 +1,1076 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.MessageSchema.getMutableUnknownFields;
+
+import com.google.protobuf.Internal.ProtobufList;
+import java.io.IOException;
+
+/**
+ * Helper functions to decode protobuf wire format from a byte array.
+ *
+ * <p>Note that these functions don't do boundary check on the byte array but instead rely on Java
+ * VM to check it. That means parsing rountines utilizing these functions must catch
+ * IndexOutOfBoundsException and convert it to protobuf's InvalidProtocolBufferException when
+ * crossing protobuf public API boundaries.
+ */
+final class ArrayDecoders {
+  /**
+   * A helper used to return multiple values in a Java function. Java doesn't natively support
+   * returning multiple values in a function. Creating a new Object to hold the return values will
+   * be too expensive. Instead, we pass a Registers instance to functions that want to return
+   * multiple values and let the function set the return value in this Registers instance instead.
+   *
+   * <p>TODO(xiaofeng): This could be merged into CodedInputStream or CodedInputStreamReader which
+   * is already being passed through all the parsing rountines.
+   */
+  static final class Registers {
+    public int int1;
+    public long long1;
+    public Object object1;
+    public final ExtensionRegistryLite extensionRegistry;
+
+    Registers() {
+      this.extensionRegistry = ExtensionRegistryLite.getEmptyRegistry();
+    }
+
+    Registers(ExtensionRegistryLite extensionRegistry) {
+      if (extensionRegistry == null) {
+        throw new NullPointerException();
+      }
+      this.extensionRegistry = extensionRegistry;
+    }
+  }
+
+  /**
+   * Decodes a varint. Returns the position after the varint. The decoded varint is stored in
+   * registers.int1.
+   */
+  static int decodeVarint32(byte[] data, int position, Registers registers) {
+    int value = data[position++];
+    if (value >= 0) {
+      registers.int1 = value;
+      return position;
+    }
+    return decodeVarint32(value, data, position, registers);
+  }
+
+  /** Like decodeVarint32 except that the first byte is already read. */
+  static int decodeVarint32(int firstByte, byte[] data, int position, Registers registers) {
+    int value = firstByte & 0x7F;
+    final byte b2 = data[position++];
+    if (b2 >= 0) {
+      registers.int1 = value | ((int) b2 << 7);
+      return position;
+    }
+    value |= (b2 & 0x7F) << 7;
+
+    final byte b3 = data[position++];
+    if (b3 >= 0) {
+      registers.int1 = value | ((int) b3 << 14);
+      return position;
+    }
+    value |= (b3 & 0x7F) << 14;
+
+    final byte b4 = data[position++];
+    if (b4 >= 0) {
+      registers.int1 = value | ((int) b4 << 21);
+      return position;
+    }
+    value |= (b4 & 0x7F) << 21;
+
+    final byte b5 = data[position++];
+    if (b5 >= 0) {
+      registers.int1 = value | ((int) b5 << 28);
+      return position;
+    }
+    value |= (b5 & 0x7F) << 28;
+
+    while (data[position++] < 0) {}
+
+    registers.int1 = value;
+    return position;
+  }
+
+  /**
+   * Decodes a varint. Returns the position after the varint. The decoded varint is stored in
+   * registers.long1.
+   */
+  static int decodeVarint64(byte[] data, int position, Registers registers) {
+    long value = data[position++];
+    if (value >= 0) {
+      registers.long1 = value;
+      return position;
+    } else {
+      return decodeVarint64(value, data, position, registers);
+    }
+  }
+
+  /** Like decodeVarint64 except that the first byte is already read. */
+  static int decodeVarint64(long firstByte, byte[] data, int position, Registers registers) {
+    long value = firstByte & 0x7F;
+    byte next = data[position++];
+    int shift = 7;
+    value |= (long) (next & 0x7F) << 7;
+    while (next < 0) {
+      next = data[position++];
+      shift += 7;
+      value |= (long) (next & 0x7F) << shift;
+    }
+    registers.long1 = value;
+    return position;
+  }
+
+  /** Decodes and returns a fixed32 value. */
+  static int decodeFixed32(byte[] data, int position) {
+    return (data[position] & 0xff)
+        | ((data[position + 1] & 0xff) << 8)
+        | ((data[position + 2] & 0xff) << 16)
+        | ((data[position + 3] & 0xff) << 24);
+  }
+
+  /** Decodes and returns a fixed64 value. */
+  static long decodeFixed64(byte[] data, int position) {
+    return (data[position] & 0xffL)
+        | ((data[position + 1] & 0xffL) << 8)
+        | ((data[position + 2] & 0xffL) << 16)
+        | ((data[position + 3] & 0xffL) << 24)
+        | ((data[position + 4] & 0xffL) << 32)
+        | ((data[position + 5] & 0xffL) << 40)
+        | ((data[position + 6] & 0xffL) << 48)
+        | ((data[position + 7] & 0xffL) << 56);
+  }
+
+  /** Decodes and returns a double value. */
+  static double decodeDouble(byte[] data, int position) {
+    return Double.longBitsToDouble(decodeFixed64(data, position));
+  }
+
+  /** Decodes and returns a float value. */
+  static float decodeFloat(byte[] data, int position) {
+    return Float.intBitsToFloat(decodeFixed32(data, position));
+  }
+
+  /** Decodes a string value. */
+  static int decodeString(byte[] data, int position, Registers registers)
+      throws InvalidProtocolBufferException {
+    position = decodeVarint32(data, position, registers);
+    final int length = registers.int1;
+    if (length < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    } else if (length == 0) {
+      registers.object1 = "";
+      return position;
+    } else {
+      registers.object1 = new String(data, position, length, Internal.UTF_8);
+      return position + length;
+    }
+  }
+
+  /** Decodes a string value with utf8 check. */
+  static int decodeStringRequireUtf8(byte[] data, int position, Registers registers)
+      throws InvalidProtocolBufferException {
+    position = decodeVarint32(data, position, registers);
+    final int length = registers.int1;
+    if (length < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    } else if (length == 0) {
+      registers.object1 = "";
+      return position;
+    } else {
+      registers.object1 = Utf8.decodeUtf8(data, position, length);
+      return position + length;
+    }
+  }
+
+  /** Decodes a bytes value. */
+  static int decodeBytes(byte[] data, int position, Registers registers)
+      throws InvalidProtocolBufferException {
+    position = decodeVarint32(data, position, registers);
+    final int length = registers.int1;
+    if (length < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    } else if (length > data.length - position) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    } else if (length == 0) {
+      registers.object1 = ByteString.EMPTY;
+      return position;
+    } else {
+      registers.object1 = ByteString.copyFrom(data, position, length);
+      return position + length;
+    }
+  }
+
+  /** Decodes a message value. */
+  @SuppressWarnings({"unchecked", "rawtypes"})
+  static int decodeMessageField(
+      Schema schema, byte[] data, int position, int limit, Registers registers) throws IOException {
+    int length = data[position++];
+    if (length < 0) {
+      position = decodeVarint32(length, data, position, registers);
+      length = registers.int1;
+    }
+    if (length < 0 || length > limit - position) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    Object result = schema.newInstance();
+    schema.mergeFrom(result, data, position, position + length, registers);
+    schema.makeImmutable(result);
+    registers.object1 = result;
+    return position + length;
+  }
+
+  /** Decodes a group value. */
+  @SuppressWarnings({"unchecked", "rawtypes"})
+  static int decodeGroupField(
+      Schema schema, byte[] data, int position, int limit, int endGroup, Registers registers)
+      throws IOException {
+    // A group field must has a MessageSchema (the only other subclass of Schema is MessageSetSchema
+    // and it can't be used in group fields).
+    final MessageSchema messageSchema = (MessageSchema) schema;
+    Object result = messageSchema.newInstance();
+    // It's OK to directly use parseProto2Message since proto3 doesn't have group.
+    final int endPosition =
+        messageSchema.parseProto2Message(result, data, position, limit, endGroup, registers);
+    messageSchema.makeImmutable(result);
+    registers.object1 = result;
+    return endPosition;
+  }
+
+  /** Decodes a repeated 32-bit varint field. Returns the position after all read values. */
+  static int decodeVarint32List(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers) {
+    final IntArrayList output = (IntArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    output.addInt(registers.int1);
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      position = decodeVarint32(data, nextPosition, registers);
+      output.addInt(registers.int1);
+    }
+    return position;
+  }
+
+  /** Decodes a repeated 64-bit varint field. Returns the position after all read values. */
+  static int decodeVarint64List(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers) {
+    final LongArrayList output = (LongArrayList) list;
+    position = decodeVarint64(data, position, registers);
+    output.addLong(registers.long1);
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      position = decodeVarint64(data, nextPosition, registers);
+      output.addLong(registers.long1);
+    }
+    return position;
+  }
+
+  /** Decodes a repeated fixed32 field. Returns the position after all read values. */
+  static int decodeFixed32List(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers) {
+    final IntArrayList output = (IntArrayList) list;
+    output.addInt(decodeFixed32(data, position));
+    position += 4;
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      output.addInt(decodeFixed32(data, nextPosition));
+      position = nextPosition + 4;
+    }
+    return position;
+  }
+
+  /** Decodes a repeated fixed64 field. Returns the position after all read values. */
+  static int decodeFixed64List(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers) {
+    final LongArrayList output = (LongArrayList) list;
+    output.addLong(decodeFixed64(data, position));
+    position += 8;
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      output.addLong(decodeFixed64(data, nextPosition));
+      position = nextPosition + 8;
+    }
+    return position;
+  }
+
+  /** Decodes a repeated float field. Returns the position after all read values. */
+  static int decodeFloatList(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers) {
+    final FloatArrayList output = (FloatArrayList) list;
+    output.addFloat(decodeFloat(data, position));
+    position += 4;
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      output.addFloat(decodeFloat(data, nextPosition));
+      position = nextPosition + 4;
+    }
+    return position;
+  }
+
+  /** Decodes a repeated double field. Returns the position after all read values. */
+  static int decodeDoubleList(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers) {
+    final DoubleArrayList output = (DoubleArrayList) list;
+    output.addDouble(decodeDouble(data, position));
+    position += 8;
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      output.addDouble(decodeDouble(data, nextPosition));
+      position = nextPosition + 8;
+    }
+    return position;
+  }
+
+  /** Decodes a repeated boolean field. Returns the position after all read values. */
+  static int decodeBoolList(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers) {
+    final BooleanArrayList output = (BooleanArrayList) list;
+    position = decodeVarint64(data, position, registers);
+    output.addBoolean(registers.long1 != 0);
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      position = decodeVarint64(data, nextPosition, registers);
+      output.addBoolean(registers.long1 != 0);
+    }
+    return position;
+  }
+
+  /** Decodes a repeated sint32 field. Returns the position after all read values. */
+  static int decodeSInt32List(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers) {
+    final IntArrayList output = (IntArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    output.addInt(CodedInputStream.decodeZigZag32(registers.int1));
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      position = decodeVarint32(data, nextPosition, registers);
+      output.addInt(CodedInputStream.decodeZigZag32(registers.int1));
+    }
+    return position;
+  }
+
+  /** Decodes a repeated sint64 field. Returns the position after all read values. */
+  static int decodeSInt64List(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers) {
+    final LongArrayList output = (LongArrayList) list;
+    position = decodeVarint64(data, position, registers);
+    output.addLong(CodedInputStream.decodeZigZag64(registers.long1));
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      position = decodeVarint64(data, nextPosition, registers);
+      output.addLong(CodedInputStream.decodeZigZag64(registers.long1));
+    }
+    return position;
+  }
+
+  /** Decodes a packed 32-bit varint field. Returns the position after all read values. */
+  static int decodePackedVarint32List(
+      byte[] data, int position, ProtobufList<?> list, Registers registers) throws IOException {
+    final IntArrayList output = (IntArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    final int fieldLimit = position + registers.int1;
+    while (position < fieldLimit) {
+      position = decodeVarint32(data, position, registers);
+      output.addInt(registers.int1);
+    }
+    if (position != fieldLimit) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return position;
+  }
+
+  /** Decodes a packed 64-bit varint field. Returns the position after all read values. */
+  static int decodePackedVarint64List(
+      byte[] data, int position, ProtobufList<?> list, Registers registers) throws IOException {
+    final LongArrayList output = (LongArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    final int fieldLimit = position + registers.int1;
+    while (position < fieldLimit) {
+      position = decodeVarint64(data, position, registers);
+      output.addLong(registers.long1);
+    }
+    if (position != fieldLimit) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return position;
+  }
+
+  /** Decodes a packed fixed32 field. Returns the position after all read values. */
+  static int decodePackedFixed32List(
+      byte[] data, int position, ProtobufList<?> list, Registers registers) throws IOException {
+    final IntArrayList output = (IntArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    final int fieldLimit = position + registers.int1;
+    while (position < fieldLimit) {
+      output.addInt(decodeFixed32(data, position));
+      position += 4;
+    }
+    if (position != fieldLimit) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return position;
+  }
+
+  /** Decodes a packed fixed64 field. Returns the position after all read values. */
+  static int decodePackedFixed64List(
+      byte[] data, int position, ProtobufList<?> list, Registers registers) throws IOException {
+    final LongArrayList output = (LongArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    final int fieldLimit = position + registers.int1;
+    while (position < fieldLimit) {
+      output.addLong(decodeFixed64(data, position));
+      position += 8;
+    }
+    if (position != fieldLimit) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return position;
+  }
+
+  /** Decodes a packed float field. Returns the position after all read values. */
+  static int decodePackedFloatList(
+      byte[] data, int position, ProtobufList<?> list, Registers registers) throws IOException {
+    final FloatArrayList output = (FloatArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    final int fieldLimit = position + registers.int1;
+    while (position < fieldLimit) {
+      output.addFloat(decodeFloat(data, position));
+      position += 4;
+    }
+    if (position != fieldLimit) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return position;
+  }
+
+  /** Decodes a packed double field. Returns the position after all read values. */
+  static int decodePackedDoubleList(
+      byte[] data, int position, ProtobufList<?> list, Registers registers) throws IOException {
+    final DoubleArrayList output = (DoubleArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    final int fieldLimit = position + registers.int1;
+    while (position < fieldLimit) {
+      output.addDouble(decodeDouble(data, position));
+      position += 8;
+    }
+    if (position != fieldLimit) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return position;
+  }
+
+  /** Decodes a packed boolean field. Returns the position after all read values. */
+  static int decodePackedBoolList(
+      byte[] data, int position, ProtobufList<?> list, Registers registers) throws IOException {
+    final BooleanArrayList output = (BooleanArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    final int fieldLimit = position + registers.int1;
+    while (position < fieldLimit) {
+      position = decodeVarint64(data, position, registers);
+      output.addBoolean(registers.long1 != 0);
+    }
+    if (position != fieldLimit) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return position;
+  }
+
+  /** Decodes a packed sint32 field. Returns the position after all read values. */
+  static int decodePackedSInt32List(
+      byte[] data, int position, ProtobufList<?> list, Registers registers) throws IOException {
+    final IntArrayList output = (IntArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    final int fieldLimit = position + registers.int1;
+    while (position < fieldLimit) {
+      position = decodeVarint32(data, position, registers);
+      output.addInt(CodedInputStream.decodeZigZag32(registers.int1));
+    }
+    if (position != fieldLimit) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return position;
+  }
+
+  /** Decodes a packed sint64 field. Returns the position after all read values. */
+  @SuppressWarnings("unchecked")
+  static int decodePackedSInt64List(
+      byte[] data, int position, ProtobufList<?> list, Registers registers) throws IOException {
+    final LongArrayList output = (LongArrayList) list;
+    position = decodeVarint32(data, position, registers);
+    final int fieldLimit = position + registers.int1;
+    while (position < fieldLimit) {
+      position = decodeVarint64(data, position, registers);
+      output.addLong(CodedInputStream.decodeZigZag64(registers.long1));
+    }
+    if (position != fieldLimit) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    return position;
+  }
+
+  /** Decodes a repeated string field. Returns the position after all read values. */
+  @SuppressWarnings("unchecked")
+  static int decodeStringList(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers)
+      throws InvalidProtocolBufferException {
+    final ProtobufList<String> output = (ProtobufList<String>) list;
+    position = decodeVarint32(data, position, registers);
+    final int length = registers.int1;
+    if (length < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    } else if (length == 0) {
+      output.add("");
+    } else {
+      String value = new String(data, position, length, Internal.UTF_8);
+      output.add(value);
+      position += length;
+    }
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      position = decodeVarint32(data, nextPosition, registers);
+      final int nextLength = registers.int1;
+      if (nextLength < 0) {
+        throw InvalidProtocolBufferException.negativeSize();
+      } else if (nextLength == 0) {
+        output.add("");
+      } else {
+        String value = new String(data, position, nextLength, Internal.UTF_8);
+        output.add(value);
+        position += nextLength;
+      }
+    }
+    return position;
+  }
+
+  /**
+   * Decodes a repeated string field with utf8 check. Returns the position after all read values.
+   */
+  @SuppressWarnings("unchecked")
+  static int decodeStringListRequireUtf8(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers)
+      throws InvalidProtocolBufferException {
+    final ProtobufList<String> output = (ProtobufList<String>) list;
+    position = decodeVarint32(data, position, registers);
+    final int length = registers.int1;
+    if (length < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    } else if (length == 0) {
+      output.add("");
+    } else {
+      if (!Utf8.isValidUtf8(data, position, position + length)) {
+        throw InvalidProtocolBufferException.invalidUtf8();
+      }
+      String value = new String(data, position, length, Internal.UTF_8);
+      output.add(value);
+      position += length;
+    }
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      position = decodeVarint32(data, nextPosition, registers);
+      final int nextLength = registers.int1;
+      if (nextLength < 0) {
+        throw InvalidProtocolBufferException.negativeSize();
+      } else if (nextLength == 0) {
+        output.add("");
+      } else {
+        if (!Utf8.isValidUtf8(data, position, position + nextLength)) {
+          throw InvalidProtocolBufferException.invalidUtf8();
+        }
+        String value = new String(data, position, nextLength, Internal.UTF_8);
+        output.add(value);
+        position += nextLength;
+      }
+    }
+    return position;
+  }
+
+  /** Decodes a repeated bytes field. Returns the position after all read values. */
+  @SuppressWarnings("unchecked")
+  static int decodeBytesList(
+      int tag, byte[] data, int position, int limit, ProtobufList<?> list, Registers registers)
+      throws InvalidProtocolBufferException {
+    final ProtobufList<ByteString> output = (ProtobufList<ByteString>) list;
+    position = decodeVarint32(data, position, registers);
+    final int length = registers.int1;
+    if (length < 0) {
+      throw InvalidProtocolBufferException.negativeSize();
+    } else if (length > data.length - position) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    } else if (length == 0) {
+      output.add(ByteString.EMPTY);
+    } else {
+      output.add(ByteString.copyFrom(data, position, length));
+      position += length;
+    }
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      position = decodeVarint32(data, nextPosition, registers);
+      final int nextLength = registers.int1;
+      if (nextLength < 0) {
+        throw InvalidProtocolBufferException.negativeSize();
+      } else if (nextLength > data.length - position) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      } else if (nextLength == 0) {
+        output.add(ByteString.EMPTY);
+      } else {
+        output.add(ByteString.copyFrom(data, position, nextLength));
+        position += nextLength;
+      }
+    }
+    return position;
+  }
+
+  /**
+   * Decodes a repeated message field
+   *
+   * @return The position of after read all messages
+   */
+  @SuppressWarnings({"unchecked"})
+  static int decodeMessageList(
+      Schema<?> schema,
+      int tag,
+      byte[] data,
+      int position,
+      int limit,
+      ProtobufList<?> list,
+      Registers registers)
+      throws IOException {
+    final ProtobufList<Object> output = (ProtobufList<Object>) list;
+    position = decodeMessageField(schema, data, position, limit, registers);
+    output.add(registers.object1);
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      position = decodeMessageField(schema, data, nextPosition, limit, registers);
+      output.add(registers.object1);
+    }
+    return position;
+  }
+
+  /**
+   * Decodes a repeated group field
+   *
+   * @return The position of after read all groups
+   */
+  @SuppressWarnings({"unchecked", "rawtypes"})
+  static int decodeGroupList(
+      Schema schema,
+      int tag,
+      byte[] data,
+      int position,
+      int limit,
+      ProtobufList<?> list,
+      Registers registers)
+      throws IOException {
+    final ProtobufList<Object> output = (ProtobufList<Object>) list;
+    final int endgroup = (tag & ~0x7) | WireFormat.WIRETYPE_END_GROUP;
+    position = decodeGroupField(schema, data, position, limit, endgroup, registers);
+    output.add(registers.object1);
+    while (position < limit) {
+      int nextPosition = decodeVarint32(data, position, registers);
+      if (tag != registers.int1) {
+        break;
+      }
+      position = decodeGroupField(schema, data, nextPosition, limit, endgroup, registers);
+      output.add(registers.object1);
+    }
+    return position;
+  }
+
+  static int decodeExtensionOrUnknownField(
+      int tag, byte[] data, int position, int limit,
+      Object message,
+      MessageLite defaultInstance,
+      UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite> unknownFieldSchema,
+      Registers registers)
+      throws IOException {
+    final int number = tag >>> 3;
+    GeneratedMessageLite.GeneratedExtension extension =
+        registers.extensionRegistry.findLiteExtensionByNumber(defaultInstance, number);
+    if (extension == null) {
+      return decodeUnknownField(
+          tag, data, position, limit, getMutableUnknownFields(message), registers);
+    } else  {
+      ((GeneratedMessageLite.ExtendableMessage<?, ?>) message).ensureExtensionsAreMutable();
+      return decodeExtension(
+          tag, data, position, limit, (GeneratedMessageLite.ExtendableMessage) message,
+          extension, unknownFieldSchema, registers);
+    }
+  }
+
+  static int decodeExtension(
+      int tag,
+      byte[] data,
+      int position,
+      int limit,
+      GeneratedMessageLite.ExtendableMessage<?, ?> message,
+      GeneratedMessageLite.GeneratedExtension<?, ?> extension,
+      UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite> unknownFieldSchema,
+      Registers registers)
+      throws IOException {
+    final FieldSet<GeneratedMessageLite.ExtensionDescriptor> extensions = message.extensions;
+    final int fieldNumber = tag >>> 3;
+    if (extension.descriptor.isRepeated() && extension.descriptor.isPacked()) {
+      switch (extension.getLiteType()) {
+        case DOUBLE:
+        {
+          DoubleArrayList list = new DoubleArrayList();
+          position = decodePackedDoubleList(data, position, list, registers);
+          extensions.setField(extension.descriptor, list);
+          break;
+        }
+        case FLOAT:
+        {
+          FloatArrayList list = new FloatArrayList();
+          position = decodePackedFloatList(data, position, list, registers);
+          extensions.setField(extension.descriptor, list);
+          break;
+        }
+        case INT64:
+        case UINT64:
+        {
+          LongArrayList list = new LongArrayList();
+          position = decodePackedVarint64List(data, position, list, registers);
+          extensions.setField(extension.descriptor, list);
+          break;
+        }
+        case INT32:
+        case UINT32:
+        {
+          IntArrayList list = new IntArrayList();
+          position = decodePackedVarint32List(data, position, list, registers);
+          extensions.setField(extension.descriptor, list);
+          break;
+        }
+        case FIXED64:
+        case SFIXED64:
+        {
+          LongArrayList list = new LongArrayList();
+          position = decodePackedFixed64List(data, position, list, registers);
+          extensions.setField(extension.descriptor, list);
+          break;
+        }
+        case FIXED32:
+        case SFIXED32:
+        {
+          IntArrayList list = new IntArrayList();
+          position = decodePackedFixed32List(data, position, list, registers);
+          extensions.setField(extension.descriptor, list);
+          break;
+        }
+        case BOOL:
+        {
+          BooleanArrayList list = new BooleanArrayList();
+          position = decodePackedBoolList(data, position, list, registers);
+          extensions.setField(extension.descriptor, list);
+          break;
+        }
+        case SINT32:
+        {
+          IntArrayList list = new IntArrayList();
+          position = decodePackedSInt32List(data, position, list, registers);
+          extensions.setField(extension.descriptor, list);
+          break;
+        }
+        case SINT64:
+        {
+          LongArrayList list = new LongArrayList();
+          position = decodePackedSInt64List(data, position, list, registers);
+          extensions.setField(extension.descriptor, list);
+          break;
+        }
+        case ENUM:
+        {
+          IntArrayList list = new IntArrayList();
+          position = decodePackedVarint32List(data, position, list, registers);
+          UnknownFieldSetLite unknownFields = message.unknownFields;
+          if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
+            unknownFields = null;
+          }
+          unknownFields =
+              SchemaUtil.filterUnknownEnumList(
+                  fieldNumber,
+                  list,
+                  extension.descriptor.getEnumType(),
+                  unknownFields,
+                  unknownFieldSchema);
+          if (unknownFields != null) {
+            message.unknownFields = unknownFields;
+          }
+          extensions.setField(extension.descriptor, list);
+          break;
+        }
+        default:
+          throw new IllegalStateException(
+              "Type cannot be packed: " + extension.descriptor.getLiteType());
+      }
+    } else {
+      Object value = null;
+      // Enum is a special case becasue unknown enum values will be put into UnknownFieldSetLite.
+      if (extension.getLiteType() == WireFormat.FieldType.ENUM) {
+        position = decodeVarint32(data, position, registers);
+        Object enumValue = extension.descriptor.getEnumType().findValueByNumber(registers.int1);
+        if (enumValue == null) {
+          UnknownFieldSetLite unknownFields = ((GeneratedMessageLite) message).unknownFields;
+          if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
+            unknownFields = UnknownFieldSetLite.newInstance();
+            ((GeneratedMessageLite) message).unknownFields = unknownFields;
+          }
+          SchemaUtil.storeUnknownEnum(
+              fieldNumber, registers.int1, unknownFields, unknownFieldSchema);
+          return position;
+        }
+        // Note, we store the integer value instead of the actual enum object in FieldSet.
+        // This is also different from full-runtime where we store EnumValueDescriptor.
+        value = registers.int1;
+      } else {
+        switch (extension.getLiteType()) {
+          case DOUBLE:
+            value = decodeDouble(data, position);
+            position += 8;
+            break;
+          case FLOAT:
+            value = decodeFloat(data, position);
+            position += 4;
+            break;
+          case INT64:
+          case UINT64:
+            position = decodeVarint64(data, position, registers);
+            value = registers.long1;
+            break;
+          case INT32:
+          case UINT32:
+            position = decodeVarint32(data, position, registers);
+            value = registers.int1;
+            break;
+          case FIXED64:
+          case SFIXED64:
+            value = decodeFixed64(data, position);
+            position += 8;
+            break;
+          case FIXED32:
+          case SFIXED32:
+            value = decodeFixed32(data, position);
+            position += 4;
+            break;
+          case BOOL:
+            position = decodeVarint64(data, position, registers);
+            value = (registers.long1 != 0);
+            break;
+          case BYTES:
+            position = decodeBytes(data, position, registers);
+            value = registers.object1;
+            break;
+          case SINT32:
+            position = decodeVarint32(data, position, registers);
+            value = CodedInputStream.decodeZigZag32(registers.int1);
+            break;
+          case SINT64:
+            position = decodeVarint64(data, position, registers);
+            value = CodedInputStream.decodeZigZag64(registers.long1);
+            break;
+          case STRING:
+            position = decodeString(data, position, registers);
+            value = registers.object1;
+            break;
+          case GROUP:
+            final int endTag = (fieldNumber << 3) | WireFormat.WIRETYPE_END_GROUP;
+            position = decodeGroupField(
+                Protobuf.getInstance().schemaFor(extension.getMessageDefaultInstance().getClass()),
+                data, position, limit, endTag, registers);
+            value = registers.object1;
+            break;
+
+          case MESSAGE:
+            position = decodeMessageField(
+                Protobuf.getInstance().schemaFor(extension.getMessageDefaultInstance().getClass()),
+                data, position, limit, registers);
+            value = registers.object1;
+            break;
+
+          case ENUM:
+            throw new IllegalStateException("Shouldn't reach here.");
+        }
+      }
+      if (extension.isRepeated()) {
+        extensions.addRepeatedField(extension.descriptor, value);
+      } else {
+        switch (extension.getLiteType()) {
+          case MESSAGE:
+          case GROUP:
+            Object oldValue = extensions.getField(extension.descriptor);
+            if (oldValue != null) {
+              value = Internal.mergeMessage(oldValue, value);
+            }
+            break;
+          default:
+            break;
+        }
+        extensions.setField(extension.descriptor, value);
+      }
+    }
+    return position;
+  }
+
+  /** Decodes an unknown field. */
+  static int decodeUnknownField(
+      int tag,
+      byte[] data,
+      int position,
+      int limit,
+      UnknownFieldSetLite unknownFields,
+      Registers registers)
+      throws InvalidProtocolBufferException {
+    if (WireFormat.getTagFieldNumber(tag) == 0) {
+      throw InvalidProtocolBufferException.invalidTag();
+    }
+    switch (WireFormat.getTagWireType(tag)) {
+      case WireFormat.WIRETYPE_VARINT:
+        position = decodeVarint64(data, position, registers);
+        unknownFields.storeField(tag, registers.long1);
+        return position;
+      case WireFormat.WIRETYPE_FIXED32:
+        unknownFields.storeField(tag, decodeFixed32(data, position));
+        return position + 4;
+      case WireFormat.WIRETYPE_FIXED64:
+        unknownFields.storeField(tag, decodeFixed64(data, position));
+        return position + 8;
+      case WireFormat.WIRETYPE_LENGTH_DELIMITED:
+        position = decodeVarint32(data, position, registers);
+        final int length = registers.int1;
+        if (length < 0) {
+          throw InvalidProtocolBufferException.negativeSize();
+        } else if (length > data.length - position) {
+          throw InvalidProtocolBufferException.truncatedMessage();
+        } else if (length == 0) {
+          unknownFields.storeField(tag, ByteString.EMPTY);
+        } else {
+          unknownFields.storeField(tag, ByteString.copyFrom(data, position, length));
+        }
+        return position + length;
+      case WireFormat.WIRETYPE_START_GROUP:
+        final UnknownFieldSetLite child = UnknownFieldSetLite.newInstance();
+        final int endGroup = (tag & ~0x7) | WireFormat.WIRETYPE_END_GROUP;
+        int lastTag = 0;
+        while (position < limit) {
+          position = decodeVarint32(data, position, registers);
+          lastTag = registers.int1;
+          if (lastTag == endGroup) {
+            break;
+          }
+          position = decodeUnknownField(lastTag, data, position, limit, child, registers);
+        }
+        if (position > limit || lastTag != endGroup) {
+          throw InvalidProtocolBufferException.parseFailure();
+        }
+        unknownFields.storeField(tag, child);
+        return position;
+      default:
+        throw InvalidProtocolBufferException.invalidTag();
+    }
+  }
+
+  /** Skips an unknown field. */
+  static int skipField(int tag, byte[] data, int position, int limit, Registers registers)
+      throws InvalidProtocolBufferException {
+    if (WireFormat.getTagFieldNumber(tag) == 0) {
+      throw InvalidProtocolBufferException.invalidTag();
+    }
+    switch (WireFormat.getTagWireType(tag)) {
+      case WireFormat.WIRETYPE_VARINT:
+        position = decodeVarint64(data, position, registers);
+        return position;
+      case WireFormat.WIRETYPE_FIXED32:
+        return position + 4;
+      case WireFormat.WIRETYPE_FIXED64:
+        return position + 8;
+      case WireFormat.WIRETYPE_LENGTH_DELIMITED:
+        position = decodeVarint32(data, position, registers);
+        return position + registers.int1;
+      case WireFormat.WIRETYPE_START_GROUP:
+        final int endGroup = (tag & ~0x7) | WireFormat.WIRETYPE_END_GROUP;
+        int lastTag = 0;
+        while (position < limit) {
+          position = decodeVarint32(data, position, registers);
+          lastTag = registers.int1;
+          if (lastTag == endGroup) {
+            break;
+          }
+          position = skipField(lastTag, data, position, limit, registers);
+        }
+        if (position > limit || lastTag != endGroup) {
+          throw InvalidProtocolBufferException.parseFailure();
+        }
+        return position;
+      default:
+        throw InvalidProtocolBufferException.invalidTag();
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/BinaryReader.java b/java/core/src/main/java/com/google/protobuf/BinaryReader.java
new file mode 100755
index 0000000..d64574c
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/BinaryReader.java
@@ -0,0 +1,1729 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.WireFormat.FIXED32_SIZE;
+import static com.google.protobuf.WireFormat.FIXED64_SIZE;
+import static com.google.protobuf.WireFormat.WIRETYPE_END_GROUP;
+import static com.google.protobuf.WireFormat.WIRETYPE_FIXED32;
+import static com.google.protobuf.WireFormat.WIRETYPE_FIXED64;
+import static com.google.protobuf.WireFormat.WIRETYPE_LENGTH_DELIMITED;
+import static com.google.protobuf.WireFormat.WIRETYPE_START_GROUP;
+import static com.google.protobuf.WireFormat.WIRETYPE_VARINT;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A {@link Reader} that reads from a buffer containing a message serialized with the binary
+ * protocol.
+ */
+@ExperimentalApi
+abstract class BinaryReader implements Reader {
+  private static final int FIXED32_MULTIPLE_MASK = FIXED32_SIZE - 1;
+  private static final int FIXED64_MULTIPLE_MASK = FIXED64_SIZE - 1;
+
+  /**
+   * Creates a new reader using the given {@code buffer} as input.
+   *
+   * @param buffer the input buffer. The buffer (including position, limit, etc.) will not be
+   *     modified. To increment the buffer position after the read completes, use the value returned
+   *     by {@link #getTotalBytesRead()}.
+   * @param bufferIsImmutable if {@code true} the reader assumes that the content of {@code buffer}
+   *     will never change and any allocated {@link ByteString} instances will by directly wrap
+   *     slices of {@code buffer}.
+   * @return the reader
+   */
+  public static BinaryReader newInstance(ByteBuffer buffer, boolean bufferIsImmutable) {
+    if (buffer.hasArray()) {
+      // TODO(nathanmittler): Add support for unsafe operations.
+      return new SafeHeapReader(buffer, bufferIsImmutable);
+    }
+    // TODO(nathanmittler): Add support for direct buffers
+    throw new IllegalArgumentException("Direct buffers not yet supported");
+  }
+
+  /** Only allow subclassing for inner classes. */
+  private BinaryReader() {}
+
+  /** Returns the total number of bytes read so far from the input buffer. */
+  public abstract int getTotalBytesRead();
+
+  @Override
+  public boolean shouldDiscardUnknownFields() {
+    return false;
+  }
+
+  /**
+   * A {@link BinaryReader} implementation that operates on a heap {@link ByteBuffer}. Uses only
+   * safe operations on the underlying array.
+   */
+  private static final class SafeHeapReader extends BinaryReader {
+    private final boolean bufferIsImmutable;
+    private final byte[] buffer;
+    private int pos;
+    private final int initialPos;
+    private int limit;
+    private int tag;
+    private int endGroupTag;
+
+    public SafeHeapReader(ByteBuffer bytebuf, boolean bufferIsImmutable) {
+      this.bufferIsImmutable = bufferIsImmutable;
+      buffer = bytebuf.array();
+      initialPos = pos = bytebuf.arrayOffset() + bytebuf.position();
+      limit = bytebuf.arrayOffset() + bytebuf.limit();
+    }
+
+    private boolean isAtEnd() {
+      return pos == limit;
+    }
+
+    @Override
+    public int getTotalBytesRead() {
+      return pos - initialPos;
+    }
+
+    @Override
+    public int getFieldNumber() throws IOException {
+      if (isAtEnd()) {
+        return Reader.READ_DONE;
+      }
+      tag = readVarint32();
+      if (tag == endGroupTag) {
+        return Reader.READ_DONE;
+      }
+      return WireFormat.getTagFieldNumber(tag);
+    }
+
+    @Override
+    public int getTag() {
+      return tag;
+    }
+
+    @Override
+    public boolean skipField() throws IOException {
+      if (isAtEnd() || tag == endGroupTag) {
+        return false;
+      }
+
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_VARINT:
+          skipVarint();
+          return true;
+        case WIRETYPE_FIXED64:
+          skipBytes(FIXED64_SIZE);
+          return true;
+        case WIRETYPE_LENGTH_DELIMITED:
+          skipBytes(readVarint32());
+          return true;
+        case WIRETYPE_FIXED32:
+          skipBytes(FIXED32_SIZE);
+          return true;
+        case WIRETYPE_START_GROUP:
+          skipGroup();
+          return true;
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+
+    @Override
+    public double readDouble() throws IOException {
+      requireWireType(WIRETYPE_FIXED64);
+      return Double.longBitsToDouble(readLittleEndian64());
+    }
+
+    @Override
+    public float readFloat() throws IOException {
+      requireWireType(WIRETYPE_FIXED32);
+      return Float.intBitsToFloat(readLittleEndian32());
+    }
+
+    @Override
+    public long readUInt64() throws IOException {
+      requireWireType(WIRETYPE_VARINT);
+      return readVarint64();
+    }
+
+    @Override
+    public long readInt64() throws IOException {
+      requireWireType(WIRETYPE_VARINT);
+      return readVarint64();
+    }
+
+    @Override
+    public int readInt32() throws IOException {
+      requireWireType(WIRETYPE_VARINT);
+      return readVarint32();
+    }
+
+    @Override
+    public long readFixed64() throws IOException {
+      requireWireType(WIRETYPE_FIXED64);
+      return readLittleEndian64();
+    }
+
+    @Override
+    public int readFixed32() throws IOException {
+      requireWireType(WIRETYPE_FIXED32);
+      return readLittleEndian32();
+    }
+
+    @Override
+    public boolean readBool() throws IOException {
+      requireWireType(WIRETYPE_VARINT);
+      return readVarint32() != 0;
+    }
+
+    @Override
+    public String readString() throws IOException {
+      return readStringInternal(false);
+    }
+
+    @Override
+    public String readStringRequireUtf8() throws IOException {
+      return readStringInternal(true);
+    }
+
+    public String readStringInternal(boolean requireUtf8) throws IOException {
+      requireWireType(WIRETYPE_LENGTH_DELIMITED);
+      final int size = readVarint32();
+      if (size == 0) {
+        return "";
+      }
+
+      requireBytes(size);
+      if (requireUtf8 && !Utf8.isValidUtf8(buffer, pos, pos + size)) {
+        throw InvalidProtocolBufferException.invalidUtf8();
+      }
+      String result = new String(buffer, pos, size, Internal.UTF_8);
+      pos += size;
+      return result;
+    }
+
+    @Override
+    public <T> T readMessage(Class<T> clazz, ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      requireWireType(WIRETYPE_LENGTH_DELIMITED);
+      return readMessage(Protobuf.getInstance().schemaFor(clazz), extensionRegistry);
+    }
+
+    @Override
+    public <T> T readMessageBySchemaWithCheck(
+        Schema<T> schema, ExtensionRegistryLite extensionRegistry) throws IOException {
+      requireWireType(WIRETYPE_LENGTH_DELIMITED);
+      return readMessage(schema, extensionRegistry);
+    }
+
+    private <T> T readMessage(Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      int size = readVarint32();
+      requireBytes(size);
+
+      // Update the limit.
+      int prevLimit = limit;
+      int newLimit = pos + size;
+      limit = newLimit;
+
+      try {
+        // Allocate and read the message.
+        T message = schema.newInstance();
+        schema.mergeFrom(message, this, extensionRegistry);
+        schema.makeImmutable(message);
+
+        if (pos != newLimit) {
+          throw InvalidProtocolBufferException.parseFailure();
+        }
+        return message;
+      } finally {
+        // Restore the limit.
+        limit = prevLimit;
+      }
+    }
+
+    @Override
+    public <T> T readGroup(Class<T> clazz, ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      requireWireType(WIRETYPE_START_GROUP);
+      return readGroup(Protobuf.getInstance().schemaFor(clazz), extensionRegistry);
+    }
+
+    @Override
+    public <T> T readGroupBySchemaWithCheck(
+        Schema<T> schema, ExtensionRegistryLite extensionRegistry) throws IOException {
+      requireWireType(WIRETYPE_START_GROUP);
+      return readGroup(schema, extensionRegistry);
+    }
+
+    private <T> T readGroup(Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      int prevEndGroupTag = endGroupTag;
+      endGroupTag = WireFormat.makeTag(WireFormat.getTagFieldNumber(tag), WIRETYPE_END_GROUP);
+
+      try {
+        // Allocate and read the message.
+        T message = schema.newInstance();
+        schema.mergeFrom(message, this, extensionRegistry);
+        schema.makeImmutable(message);
+
+        if (tag != endGroupTag) {
+          throw InvalidProtocolBufferException.parseFailure();
+        }
+        return message;
+      } finally {
+        // Restore the old end group tag.
+        endGroupTag = prevEndGroupTag;
+      }
+    }
+
+    @Override
+    public ByteString readBytes() throws IOException {
+      requireWireType(WIRETYPE_LENGTH_DELIMITED);
+      int size = readVarint32();
+      if (size == 0) {
+        return ByteString.EMPTY;
+      }
+
+      requireBytes(size);
+      ByteString bytes =
+          bufferIsImmutable
+              ? ByteString.wrap(buffer, pos, size)
+              : ByteString.copyFrom(buffer, pos, size);
+      pos += size;
+      return bytes;
+    }
+
+    @Override
+    public int readUInt32() throws IOException {
+      requireWireType(WIRETYPE_VARINT);
+      return readVarint32();
+    }
+
+    @Override
+    public int readEnum() throws IOException {
+      requireWireType(WIRETYPE_VARINT);
+      return readVarint32();
+    }
+
+    @Override
+    public int readSFixed32() throws IOException {
+      requireWireType(WIRETYPE_FIXED32);
+      return readLittleEndian32();
+    }
+
+    @Override
+    public long readSFixed64() throws IOException {
+      requireWireType(WIRETYPE_FIXED64);
+      return readLittleEndian64();
+    }
+
+    @Override
+    public int readSInt32() throws IOException {
+      requireWireType(WIRETYPE_VARINT);
+      return CodedInputStream.decodeZigZag32(readVarint32());
+    }
+
+    @Override
+    public long readSInt64() throws IOException {
+      requireWireType(WIRETYPE_VARINT);
+      return CodedInputStream.decodeZigZag64(readVarint64());
+    }
+
+    @Override
+    public void readDoubleList(List<Double> target) throws IOException {
+      if (target instanceof DoubleArrayList) {
+        DoubleArrayList plist = (DoubleArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed64Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addDouble(Double.longBitsToDouble(readLittleEndian64_NoCheck()));
+            }
+            break;
+          case WIRETYPE_FIXED64:
+            while (true) {
+              plist.addDouble(readDouble());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed64Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(Double.longBitsToDouble(readLittleEndian64_NoCheck()));
+            }
+            break;
+          case WIRETYPE_FIXED64:
+            while (true) {
+              target.add(readDouble());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readFloatList(List<Float> target) throws IOException {
+      if (target instanceof FloatArrayList) {
+        FloatArrayList plist = (FloatArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed32Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addFloat(Float.intBitsToFloat(readLittleEndian32_NoCheck()));
+            }
+            break;
+          case WIRETYPE_FIXED32:
+            while (true) {
+              plist.addFloat(readFloat());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed32Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(Float.intBitsToFloat(readLittleEndian32_NoCheck()));
+            }
+            break;
+          case WIRETYPE_FIXED32:
+            while (true) {
+              target.add(readFloat());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readUInt64List(List<Long> target) throws IOException {
+      if (target instanceof LongArrayList) {
+        LongArrayList plist = (LongArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addLong(readVarint64());
+            }
+            requirePosition(fieldEndPos);
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              plist.addLong(readUInt64());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(readVarint64());
+            }
+            requirePosition(fieldEndPos);
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              target.add(readUInt64());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readInt64List(List<Long> target) throws IOException {
+      if (target instanceof LongArrayList) {
+        LongArrayList plist = (LongArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addLong(readVarint64());
+            }
+            requirePosition(fieldEndPos);
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              plist.addLong(readInt64());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(readVarint64());
+            }
+            requirePosition(fieldEndPos);
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              target.add(readInt64());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readInt32List(List<Integer> target) throws IOException {
+      if (target instanceof IntArrayList) {
+        IntArrayList plist = (IntArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addInt(readVarint32());
+            }
+            requirePosition(fieldEndPos);
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              plist.addInt(readInt32());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(readVarint32());
+            }
+            requirePosition(fieldEndPos);
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              target.add(readInt32());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readFixed64List(List<Long> target) throws IOException {
+      if (target instanceof LongArrayList) {
+        LongArrayList plist = (LongArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed64Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addLong(readLittleEndian64_NoCheck());
+            }
+            break;
+          case WIRETYPE_FIXED64:
+            while (true) {
+              plist.addLong(readFixed64());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed64Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(readLittleEndian64_NoCheck());
+            }
+            break;
+          case WIRETYPE_FIXED64:
+            while (true) {
+              target.add(readFixed64());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readFixed32List(List<Integer> target) throws IOException {
+      if (target instanceof IntArrayList) {
+        IntArrayList plist = (IntArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed32Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addInt(readLittleEndian32_NoCheck());
+            }
+            break;
+          case WIRETYPE_FIXED32:
+            while (true) {
+              plist.addInt(readFixed32());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed32Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(readLittleEndian32_NoCheck());
+            }
+            break;
+          case WIRETYPE_FIXED32:
+            while (true) {
+              target.add(readFixed32());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readBoolList(List<Boolean> target) throws IOException {
+      if (target instanceof BooleanArrayList) {
+        BooleanArrayList plist = (BooleanArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addBoolean(readVarint32() != 0);
+            }
+            requirePosition(fieldEndPos);
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              plist.addBoolean(readBool());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(readVarint32() != 0);
+            }
+            requirePosition(fieldEndPos);
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              target.add(readBool());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readStringList(List<String> target) throws IOException {
+      readStringListInternal(target, false);
+    }
+
+    @Override
+    public void readStringListRequireUtf8(List<String> target) throws IOException {
+      readStringListInternal(target, true);
+    }
+
+    public void readStringListInternal(List<String> target, boolean requireUtf8)
+        throws IOException {
+      if (WireFormat.getTagWireType(tag) != WIRETYPE_LENGTH_DELIMITED) {
+        throw InvalidProtocolBufferException.invalidWireType();
+      }
+
+      if (target instanceof LazyStringList && !requireUtf8) {
+        LazyStringList lazyList = (LazyStringList) target;
+        while (true) {
+          lazyList.add(readBytes());
+
+          if (isAtEnd()) {
+            return;
+          }
+          int prevPos = pos;
+          int nextTag = readVarint32();
+          if (nextTag != tag) {
+            // We've reached the end of the repeated field. Rewind the buffer position to before
+            // the new tag.
+            pos = prevPos;
+            return;
+          }
+        }
+      } else {
+        while (true) {
+          target.add(readStringInternal(requireUtf8));
+
+          if (isAtEnd()) {
+            return;
+          }
+          int prevPos = pos;
+          int nextTag = readVarint32();
+          if (nextTag != tag) {
+            // We've reached the end of the repeated field. Rewind the buffer position to before
+            // the new tag.
+            pos = prevPos;
+            return;
+          }
+        }
+      }
+    }
+
+    @Override
+    public <T> void readMessageList(
+        List<T> target, Class<T> targetType, ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      final Schema<T> schema = Protobuf.getInstance().schemaFor(targetType);
+      readMessageList(target, schema, extensionRegistry);
+    }
+
+    @Override
+    public <T> void readMessageList(
+        List<T> target, Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      if (WireFormat.getTagWireType(tag) != WIRETYPE_LENGTH_DELIMITED) {
+        throw InvalidProtocolBufferException.invalidWireType();
+      }
+      final int listTag = tag;
+      while (true) {
+        target.add(readMessage(schema, extensionRegistry));
+
+        if (isAtEnd()) {
+          return;
+        }
+        int prevPos = pos;
+        int nextTag = readVarint32();
+        if (nextTag != listTag) {
+          // We've reached the end of the repeated field. Rewind the buffer position to before
+          // the new tag.
+          pos = prevPos;
+          return;
+        }
+      }
+    }
+
+    @Override
+    public <T> void readGroupList(
+        List<T> target, Class<T> targetType, ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      final Schema<T> schema = Protobuf.getInstance().schemaFor(targetType);
+      readGroupList(target, schema, extensionRegistry);
+    }
+
+    @Override
+    public <T> void readGroupList(
+        List<T> target, Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      if (WireFormat.getTagWireType(tag) != WIRETYPE_START_GROUP) {
+        throw InvalidProtocolBufferException.invalidWireType();
+      }
+      final int listTag = tag;
+      while (true) {
+        target.add(readGroup(schema, extensionRegistry));
+
+        if (isAtEnd()) {
+          return;
+        }
+        int prevPos = pos;
+        int nextTag = readVarint32();
+        if (nextTag != listTag) {
+          // We've reached the end of the repeated field. Rewind the buffer position to before
+          // the new tag.
+          pos = prevPos;
+          return;
+        }
+      }
+    }
+
+    @Override
+    public void readBytesList(List<ByteString> target) throws IOException {
+      if (WireFormat.getTagWireType(tag) != WIRETYPE_LENGTH_DELIMITED) {
+        throw InvalidProtocolBufferException.invalidWireType();
+      }
+
+      while (true) {
+        target.add(readBytes());
+
+        if (isAtEnd()) {
+          return;
+        }
+        int prevPos = pos;
+        int nextTag = readVarint32();
+        if (nextTag != tag) {
+          // We've reached the end of the repeated field. Rewind the buffer position to before
+          // the new tag.
+          pos = prevPos;
+          return;
+        }
+      }
+    }
+
+    @Override
+    public void readUInt32List(List<Integer> target) throws IOException {
+      if (target instanceof IntArrayList) {
+        IntArrayList plist = (IntArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addInt(readVarint32());
+            }
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              plist.addInt(readUInt32());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(readVarint32());
+            }
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              target.add(readUInt32());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readEnumList(List<Integer> target) throws IOException {
+      if (target instanceof IntArrayList) {
+        IntArrayList plist = (IntArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addInt(readVarint32());
+            }
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              plist.addInt(readEnum());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(readVarint32());
+            }
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              target.add(readEnum());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readSFixed32List(List<Integer> target) throws IOException {
+      if (target instanceof IntArrayList) {
+        IntArrayList plist = (IntArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed32Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addInt(readLittleEndian32_NoCheck());
+            }
+            break;
+          case WIRETYPE_FIXED32:
+            while (true) {
+              plist.addInt(readSFixed32());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed32Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(readLittleEndian32_NoCheck());
+            }
+            break;
+          case WIRETYPE_FIXED32:
+            while (true) {
+              target.add(readSFixed32());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readSFixed64List(List<Long> target) throws IOException {
+      if (target instanceof LongArrayList) {
+        LongArrayList plist = (LongArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed64Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addLong(readLittleEndian64_NoCheck());
+            }
+            break;
+          case WIRETYPE_FIXED64:
+            while (true) {
+              plist.addLong(readSFixed64());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            verifyPackedFixed64Length(bytes);
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(readLittleEndian64_NoCheck());
+            }
+            break;
+          case WIRETYPE_FIXED64:
+            while (true) {
+              target.add(readSFixed64());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readSInt32List(List<Integer> target) throws IOException {
+      if (target instanceof IntArrayList) {
+        IntArrayList plist = (IntArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addInt(CodedInputStream.decodeZigZag32(readVarint32()));
+            }
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              plist.addInt(readSInt32());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(CodedInputStream.decodeZigZag32(readVarint32()));
+            }
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              target.add(readSInt32());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @Override
+    public void readSInt64List(List<Long> target) throws IOException {
+      if (target instanceof LongArrayList) {
+        LongArrayList plist = (LongArrayList) target;
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              plist.addLong(CodedInputStream.decodeZigZag64(readVarint64()));
+            }
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              plist.addLong(readSInt64());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      } else {
+        switch (WireFormat.getTagWireType(tag)) {
+          case WIRETYPE_LENGTH_DELIMITED:
+            final int bytes = readVarint32();
+            final int fieldEndPos = pos + bytes;
+            while (pos < fieldEndPos) {
+              target.add(CodedInputStream.decodeZigZag64(readVarint64()));
+            }
+            break;
+          case WIRETYPE_VARINT:
+            while (true) {
+              target.add(readSInt64());
+
+              if (isAtEnd()) {
+                return;
+              }
+              int prevPos = pos;
+              int nextTag = readVarint32();
+              if (nextTag != tag) {
+                // We've reached the end of the repeated field. Rewind the buffer position to before
+                // the new tag.
+                pos = prevPos;
+                return;
+              }
+            }
+          default:
+            throw InvalidProtocolBufferException.invalidWireType();
+        }
+      }
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <K, V> void readMap(
+        Map<K, V> target,
+        MapEntryLite.Metadata<K, V> metadata,
+        ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      requireWireType(WIRETYPE_LENGTH_DELIMITED);
+      int size = readVarint32();
+      requireBytes(size);
+
+      // Update the limit.
+      int prevLimit = limit;
+      int newLimit = pos + size;
+      limit = newLimit;
+
+      try {
+        K key = metadata.defaultKey;
+        V value = metadata.defaultValue;
+        while (true) {
+          int number = getFieldNumber();
+          if (number == READ_DONE) {
+            break;
+          }
+          try {
+            switch (number) {
+              case 1:
+                key = (K) readField(metadata.keyType, null, null);
+                break;
+              case 2:
+                value =
+                    (V)
+                        readField(
+                            metadata.valueType,
+                            metadata.defaultValue.getClass(),
+                            extensionRegistry);
+                break;
+              default:
+                if (!skipField()) {
+                  throw new InvalidProtocolBufferException("Unable to parse map entry.");
+                }
+                break;
+            }
+          } catch (InvalidProtocolBufferException.InvalidWireTypeException ignore) {
+            // the type doesn't match, skip the field.
+            if (!skipField()) {
+              throw new InvalidProtocolBufferException("Unable to parse map entry.");
+            }
+          }
+        }
+        target.put(key, value);
+      } finally {
+        // Restore the limit.
+        limit = prevLimit;
+      }
+    }
+
+    private Object readField(
+        WireFormat.FieldType fieldType,
+        Class<?> messageType,
+        ExtensionRegistryLite extensionRegistry)
+        throws IOException {
+      switch (fieldType) {
+        case BOOL:
+          return readBool();
+        case BYTES:
+          return readBytes();
+        case DOUBLE:
+          return readDouble();
+        case ENUM:
+          return readEnum();
+        case FIXED32:
+          return readFixed32();
+        case FIXED64:
+          return readFixed64();
+        case FLOAT:
+          return readFloat();
+        case INT32:
+          return readInt32();
+        case INT64:
+          return readInt64();
+        case MESSAGE:
+          return readMessage(messageType, extensionRegistry);
+        case SFIXED32:
+          return readSFixed32();
+        case SFIXED64:
+          return readSFixed64();
+        case SINT32:
+          return readSInt32();
+        case SINT64:
+          return readSInt64();
+        case STRING:
+          return readStringRequireUtf8();
+        case UINT32:
+          return readUInt32();
+        case UINT64:
+          return readUInt64();
+        default:
+          throw new RuntimeException("unsupported field type.");
+      }
+    }
+
+    /** Read a raw Varint from the stream. If larger than 32 bits, discard the upper bits. */
+    private int readVarint32() throws IOException {
+      // See implementation notes for readRawVarint64
+      int i = pos;
+
+      if (limit == pos) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      }
+
+      int x;
+      if ((x = buffer[i++]) >= 0) {
+        pos = i;
+        return x;
+      } else if (limit - i < 9) {
+        return (int) readVarint64SlowPath();
+      } else if ((x ^= (buffer[i++] << 7)) < 0) {
+        x ^= (~0 << 7);
+      } else if ((x ^= (buffer[i++] << 14)) >= 0) {
+        x ^= (~0 << 7) ^ (~0 << 14);
+      } else if ((x ^= (buffer[i++] << 21)) < 0) {
+        x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21);
+      } else {
+        int y = buffer[i++];
+        x ^= y << 28;
+        x ^= (~0 << 7) ^ (~0 << 14) ^ (~0 << 21) ^ (~0 << 28);
+        if (y < 0
+            && buffer[i++] < 0
+            && buffer[i++] < 0
+            && buffer[i++] < 0
+            && buffer[i++] < 0
+            && buffer[i++] < 0) {
+          throw InvalidProtocolBufferException.malformedVarint();
+        }
+      }
+      pos = i;
+      return x;
+    }
+
+    public long readVarint64() throws IOException {
+      // Implementation notes:
+      //
+      // Optimized for one-byte values, expected to be common.
+      // The particular code below was selected from various candidates
+      // empirically, by winning VarintBenchmark.
+      //
+      // Sign extension of (signed) Java bytes is usually a nuisance, but
+      // we exploit it here to more easily obtain the sign of bytes read.
+      // Instead of cleaning up the sign extension bits by masking eagerly,
+      // we delay until we find the final (positive) byte, when we clear all
+      // accumulated bits with one xor.  We depend on javac to constant fold.
+      int i = pos;
+
+      if (limit == i) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      }
+
+      final byte[] buffer = this.buffer;
+      long x;
+      int y;
+      if ((y = buffer[i++]) >= 0) {
+        pos = i;
+        return y;
+      } else if (limit - i < 9) {
+        return readVarint64SlowPath();
+      } else if ((y ^= (buffer[i++] << 7)) < 0) {
+        x = y ^ (~0 << 7);
+      } else if ((y ^= (buffer[i++] << 14)) >= 0) {
+        x = y ^ ((~0 << 7) ^ (~0 << 14));
+      } else if ((y ^= (buffer[i++] << 21)) < 0) {
+        x = y ^ ((~0 << 7) ^ (~0 << 14) ^ (~0 << 21));
+      } else if ((x = y ^ ((long) buffer[i++] << 28)) >= 0L) {
+        x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28);
+      } else if ((x ^= ((long) buffer[i++] << 35)) < 0L) {
+        x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35);
+      } else if ((x ^= ((long) buffer[i++] << 42)) >= 0L) {
+        x ^= (~0L << 7) ^ (~0L << 14) ^ (~0L << 21) ^ (~0L << 28) ^ (~0L << 35) ^ (~0L << 42);
+      } else if ((x ^= ((long) buffer[i++] << 49)) < 0L) {
+        x ^=
+            (~0L << 7)
+                ^ (~0L << 14)
+                ^ (~0L << 21)
+                ^ (~0L << 28)
+                ^ (~0L << 35)
+                ^ (~0L << 42)
+                ^ (~0L << 49);
+      } else {
+        x ^= ((long) buffer[i++] << 56);
+        x ^=
+            (~0L << 7)
+                ^ (~0L << 14)
+                ^ (~0L << 21)
+                ^ (~0L << 28)
+                ^ (~0L << 35)
+                ^ (~0L << 42)
+                ^ (~0L << 49)
+                ^ (~0L << 56);
+        if (x < 0L) {
+          if (buffer[i++] < 0L) {
+            throw InvalidProtocolBufferException.malformedVarint();
+          }
+        }
+      }
+      pos = i;
+      return x;
+    }
+
+    private long readVarint64SlowPath() throws IOException {
+      long result = 0;
+      for (int shift = 0; shift < 64; shift += 7) {
+        final byte b = readByte();
+        result |= (long) (b & 0x7F) << shift;
+        if ((b & 0x80) == 0) {
+          return result;
+        }
+      }
+      throw InvalidProtocolBufferException.malformedVarint();
+    }
+
+    private byte readByte() throws IOException {
+      if (pos == limit) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      }
+      return buffer[pos++];
+    }
+
+    private int readLittleEndian32() throws IOException {
+      requireBytes(FIXED32_SIZE);
+      return readLittleEndian32_NoCheck();
+    }
+
+    private long readLittleEndian64() throws IOException {
+      requireBytes(FIXED64_SIZE);
+      return readLittleEndian64_NoCheck();
+    }
+
+    private int readLittleEndian32_NoCheck() {
+      int p = pos;
+      final byte[] buffer = this.buffer;
+      pos = p + FIXED32_SIZE;
+      return (((buffer[p] & 0xff))
+          | ((buffer[p + 1] & 0xff) << 8)
+          | ((buffer[p + 2] & 0xff) << 16)
+          | ((buffer[p + 3] & 0xff) << 24));
+    }
+
+    private long readLittleEndian64_NoCheck() {
+      int p = pos;
+      final byte[] buffer = this.buffer;
+      pos = p + FIXED64_SIZE;
+      return (((buffer[p] & 0xffL))
+          | ((buffer[p + 1] & 0xffL) << 8)
+          | ((buffer[p + 2] & 0xffL) << 16)
+          | ((buffer[p + 3] & 0xffL) << 24)
+          | ((buffer[p + 4] & 0xffL) << 32)
+          | ((buffer[p + 5] & 0xffL) << 40)
+          | ((buffer[p + 6] & 0xffL) << 48)
+          | ((buffer[p + 7] & 0xffL) << 56));
+    }
+
+    private void skipVarint() throws IOException {
+      if (limit - pos >= 10) {
+        final byte[] buffer = this.buffer;
+        int p = pos;
+        for (int i = 0; i < 10; i++) {
+          if (buffer[p++] >= 0) {
+            pos = p;
+            return;
+          }
+        }
+      }
+      skipVarintSlowPath();
+    }
+
+    private void skipVarintSlowPath() throws IOException {
+      for (int i = 0; i < 10; i++) {
+        if (readByte() >= 0) {
+          return;
+        }
+      }
+      throw InvalidProtocolBufferException.malformedVarint();
+    }
+
+    private void skipBytes(final int size) throws IOException {
+      requireBytes(size);
+
+      pos += size;
+    }
+
+    private void skipGroup() throws IOException {
+      int prevEndGroupTag = endGroupTag;
+      endGroupTag = WireFormat.makeTag(WireFormat.getTagFieldNumber(tag), WIRETYPE_END_GROUP);
+      while (true) {
+        if (getFieldNumber() == READ_DONE || !skipField()) {
+          break;
+        }
+      }
+      if (tag != endGroupTag) {
+        throw InvalidProtocolBufferException.parseFailure();
+      }
+      endGroupTag = prevEndGroupTag;
+    }
+
+    private void requireBytes(int size) throws IOException {
+      if (size < 0 || size > (limit - pos)) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      }
+    }
+
+    private void requireWireType(int requiredWireType) throws IOException {
+      if (WireFormat.getTagWireType(tag) != requiredWireType) {
+        throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+
+    private void verifyPackedFixed64Length(int bytes) throws IOException {
+      requireBytes(bytes);
+      if ((bytes & FIXED64_MULTIPLE_MASK) != 0) {
+        // Require that the number of bytes be a multiple of 8.
+        throw InvalidProtocolBufferException.parseFailure();
+      }
+    }
+
+    private void verifyPackedFixed32Length(int bytes) throws IOException {
+      requireBytes(bytes);
+      if ((bytes & FIXED32_MULTIPLE_MASK) != 0) {
+        // Require that the number of bytes be a multiple of 4.
+        throw InvalidProtocolBufferException.parseFailure();
+      }
+    }
+
+    private void requirePosition(int expectedPosition) throws IOException {
+      if (pos != expectedPosition) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      }
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/BinaryWriter.java b/java/core/src/main/java/com/google/protobuf/BinaryWriter.java
new file mode 100755
index 0000000..94259ec
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/BinaryWriter.java
@@ -0,0 +1,3071 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.Internal.checkNotNull;
+import static com.google.protobuf.WireFormat.FIXED32_SIZE;
+import static com.google.protobuf.WireFormat.FIXED64_SIZE;
+import static com.google.protobuf.WireFormat.MAX_VARINT32_SIZE;
+import static com.google.protobuf.WireFormat.MAX_VARINT64_SIZE;
+import static com.google.protobuf.WireFormat.MESSAGE_SET_ITEM;
+import static com.google.protobuf.WireFormat.MESSAGE_SET_MESSAGE;
+import static com.google.protobuf.WireFormat.MESSAGE_SET_TYPE_ID;
+import static com.google.protobuf.WireFormat.WIRETYPE_END_GROUP;
+import static com.google.protobuf.WireFormat.WIRETYPE_FIXED32;
+import static com.google.protobuf.WireFormat.WIRETYPE_FIXED64;
+import static com.google.protobuf.WireFormat.WIRETYPE_LENGTH_DELIMITED;
+import static com.google.protobuf.WireFormat.WIRETYPE_START_GROUP;
+import static com.google.protobuf.WireFormat.WIRETYPE_VARINT;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.ArrayDeque;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+
+/**
+ * A protobuf writer that serializes messages in their binary form. Messages are serialized in
+ * reverse in order to avoid calculating the serialized size of each nested message. Since the
+ * message size is not known in advance, the writer employs a strategy of chunking and buffer
+ * chaining. Buffers are allocated as-needed by a provided {@link BufferAllocator}. Once writing is
+ * finished, the application can access the buffers in forward-writing order by calling {@link
+ * #complete()}.
+ *
+ * <p>Once {@link #complete()} has been called, the writer can not be reused for additional writes.
+ * The {@link #getTotalBytesWritten()} will continue to reflect the total of the write and will not
+ * be reset.
+ */
+@ExperimentalApi
+abstract class BinaryWriter extends ByteOutput implements Writer {
+  public static final int DEFAULT_CHUNK_SIZE = 4096;
+
+  private final BufferAllocator alloc;
+  private final int chunkSize;
+
+  final ArrayDeque<AllocatedBuffer> buffers = new ArrayDeque<AllocatedBuffer>(4);
+  int totalDoneBytes;
+
+  /**
+   * Creates a new {@link BinaryWriter} that will allocate heap buffers of {@link
+   * #DEFAULT_CHUNK_SIZE} as necessary.
+   */
+  public static BinaryWriter newHeapInstance(BufferAllocator alloc) {
+    return newHeapInstance(alloc, DEFAULT_CHUNK_SIZE);
+  }
+
+  /**
+   * Creates a new {@link BinaryWriter} that will allocate heap buffers of {@code chunkSize} as
+   * necessary.
+   */
+  public static BinaryWriter newHeapInstance(BufferAllocator alloc, int chunkSize) {
+    return isUnsafeHeapSupported()
+        ? newUnsafeHeapInstance(alloc, chunkSize)
+        : newSafeHeapInstance(alloc, chunkSize);
+  }
+
+  /**
+   * Creates a new {@link BinaryWriter} that will allocate direct (i.e. non-heap) buffers of {@link
+   * #DEFAULT_CHUNK_SIZE} as necessary.
+   */
+  public static BinaryWriter newDirectInstance(BufferAllocator alloc) {
+    return newDirectInstance(alloc, DEFAULT_CHUNK_SIZE);
+  }
+
+  /**
+   * Creates a new {@link BinaryWriter} that will allocate direct (i.e. non-heap) buffers of {@code
+   * chunkSize} as necessary.
+   */
+  public static BinaryWriter newDirectInstance(BufferAllocator alloc, int chunkSize) {
+    return isUnsafeDirectSupported()
+        ? newUnsafeDirectInstance(alloc, chunkSize)
+        : newSafeDirectInstance(alloc, chunkSize);
+  }
+
+  static boolean isUnsafeHeapSupported() {
+    return UnsafeHeapWriter.isSupported();
+  }
+
+  static boolean isUnsafeDirectSupported() {
+    return UnsafeDirectWriter.isSupported();
+  }
+
+  static BinaryWriter newSafeHeapInstance(BufferAllocator alloc, int chunkSize) {
+    return new SafeHeapWriter(alloc, chunkSize);
+  }
+
+  static BinaryWriter newUnsafeHeapInstance(BufferAllocator alloc, int chunkSize) {
+    if (!isUnsafeHeapSupported()) {
+      throw new UnsupportedOperationException("Unsafe operations not supported");
+    }
+    return new UnsafeHeapWriter(alloc, chunkSize);
+  }
+
+  static BinaryWriter newSafeDirectInstance(BufferAllocator alloc, int chunkSize) {
+    return new SafeDirectWriter(alloc, chunkSize);
+  }
+
+  static BinaryWriter newUnsafeDirectInstance(BufferAllocator alloc, int chunkSize) {
+    if (!isUnsafeDirectSupported()) {
+      throw new UnsupportedOperationException("Unsafe operations not supported");
+    }
+    return new UnsafeDirectWriter(alloc, chunkSize);
+  }
+
+  /** Only allow subclassing for inner classes. */
+  private BinaryWriter(BufferAllocator alloc, int chunkSize) {
+    if (chunkSize <= 0) {
+      throw new IllegalArgumentException("chunkSize must be > 0");
+    }
+    this.alloc = checkNotNull(alloc, "alloc");
+    this.chunkSize = chunkSize;
+  }
+
+  @Override
+  public final FieldOrder fieldOrder() {
+    return FieldOrder.DESCENDING;
+  }
+
+  /**
+   * Completes the write operation and returns a queue of {@link AllocatedBuffer} objects in
+   * forward-writing order. This method should only be called once.
+   *
+   * <p>After calling this method, the writer can not be reused. Create a new writer for future
+   * writes.
+   */
+  public final Queue<AllocatedBuffer> complete() {
+    finishCurrentBuffer();
+    return buffers;
+  }
+
+  @Override
+  public final void writeSFixed32(int fieldNumber, int value) throws IOException {
+    writeFixed32(fieldNumber, value);
+  }
+
+  @Override
+  public final void writeInt64(int fieldNumber, long value) throws IOException {
+    writeUInt64(fieldNumber, value);
+  }
+
+  @Override
+  public final void writeSFixed64(int fieldNumber, long value) throws IOException {
+    writeFixed64(fieldNumber, value);
+  }
+
+  @Override
+  public final void writeFloat(int fieldNumber, float value) throws IOException {
+    writeFixed32(fieldNumber, Float.floatToRawIntBits(value));
+  }
+
+  @Override
+  public final void writeDouble(int fieldNumber, double value) throws IOException {
+    writeFixed64(fieldNumber, Double.doubleToRawLongBits(value));
+  }
+
+  @Override
+  public final void writeEnum(int fieldNumber, int value) throws IOException {
+    writeInt32(fieldNumber, value);
+  }
+
+  @Override
+  public final void writeInt32List(int fieldNumber, List<Integer> list, boolean packed)
+      throws IOException {
+    if (list instanceof IntArrayList) {
+      writeInt32List_Internal(fieldNumber, (IntArrayList) list, packed);
+    } else {
+      writeInt32List_Internal(fieldNumber, list, packed);
+    }
+  }
+
+  private final void writeInt32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeInt32(list.get(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeInt32(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private final void writeInt32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeInt32(list.getInt(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeInt32(fieldNumber, list.getInt(i));
+      }
+    }
+  }
+
+  @Override
+  public final void writeFixed32List(int fieldNumber, List<Integer> list, boolean packed)
+      throws IOException {
+    if (list instanceof IntArrayList) {
+      writeFixed32List_Internal(fieldNumber, (IntArrayList) list, packed);
+    } else {
+      writeFixed32List_Internal(fieldNumber, list, packed);
+    }
+  }
+
+  private final void writeFixed32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed32(list.get(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed32(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private final void writeFixed32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed32(list.getInt(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed32(fieldNumber, list.getInt(i));
+      }
+    }
+  }
+
+  @Override
+  public final void writeInt64List(int fieldNumber, List<Long> list, boolean packed)
+      throws IOException {
+    writeUInt64List(fieldNumber, list, packed);
+  }
+
+  @Override
+  public final void writeUInt64List(int fieldNumber, List<Long> list, boolean packed)
+      throws IOException {
+    if (list instanceof LongArrayList) {
+      writeUInt64List_Internal(fieldNumber, (LongArrayList) list, packed);
+    } else {
+      writeUInt64List_Internal(fieldNumber, list, packed);
+    }
+  }
+
+  private final void writeUInt64List_Internal(int fieldNumber, List<Long> list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeVarint64(list.get(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeUInt64(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private final void writeUInt64List_Internal(int fieldNumber, LongArrayList list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeVarint64(list.getLong(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeUInt64(fieldNumber, list.getLong(i));
+      }
+    }
+  }
+
+  @Override
+  public final void writeFixed64List(int fieldNumber, List<Long> list, boolean packed)
+      throws IOException {
+    if (list instanceof LongArrayList) {
+      writeFixed64List_Internal(fieldNumber, (LongArrayList) list, packed);
+    } else {
+      writeFixed64List_Internal(fieldNumber, list, packed);
+    }
+  }
+
+  private final void writeFixed64List_Internal(int fieldNumber, List<Long> list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed64(list.get(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed64(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private final void writeFixed64List_Internal(int fieldNumber, LongArrayList list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed64(list.getLong(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed64(fieldNumber, list.getLong(i));
+      }
+    }
+  }
+
+  @Override
+  public final void writeFloatList(int fieldNumber, List<Float> list, boolean packed)
+      throws IOException {
+    if (list instanceof FloatArrayList) {
+      writeFloatList_Internal(fieldNumber, (FloatArrayList) list, packed);
+    } else {
+      writeFloatList_Internal(fieldNumber, list, packed);
+    }
+  }
+
+  private final void writeFloatList_Internal(int fieldNumber, List<Float> list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed32(Float.floatToRawIntBits(list.get(i)));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFloat(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private final void writeFloatList_Internal(int fieldNumber, FloatArrayList list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed32(Float.floatToRawIntBits(list.getFloat(i)));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFloat(fieldNumber, list.getFloat(i));
+      }
+    }
+  }
+
+  @Override
+  public final void writeDoubleList(int fieldNumber, List<Double> list, boolean packed)
+      throws IOException {
+    if (list instanceof DoubleArrayList) {
+      writeDoubleList_Internal(fieldNumber, (DoubleArrayList) list, packed);
+    } else {
+      writeDoubleList_Internal(fieldNumber, list, packed);
+    }
+  }
+
+  private final void writeDoubleList_Internal(int fieldNumber, List<Double> list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed64(Double.doubleToRawLongBits(list.get(i)));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeDouble(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private final void writeDoubleList_Internal(int fieldNumber, DoubleArrayList list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeFixed64(Double.doubleToRawLongBits(list.getDouble(i)));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeDouble(fieldNumber, list.getDouble(i));
+      }
+    }
+  }
+
+  @Override
+  public final void writeEnumList(int fieldNumber, List<Integer> list, boolean packed)
+      throws IOException {
+    writeInt32List(fieldNumber, list, packed);
+  }
+
+  @Override
+  public final void writeBoolList(int fieldNumber, List<Boolean> list, boolean packed)
+      throws IOException {
+    if (list instanceof BooleanArrayList) {
+      writeBoolList_Internal(fieldNumber, (BooleanArrayList) list, packed);
+    } else {
+      writeBoolList_Internal(fieldNumber, list, packed);
+    }
+  }
+
+  private final void writeBoolList_Internal(int fieldNumber, List<Boolean> list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + list.size());
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeBool(list.get(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeBool(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private final void writeBoolList_Internal(int fieldNumber, BooleanArrayList list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + list.size());
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeBool(list.getBoolean(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeBool(fieldNumber, list.getBoolean(i));
+      }
+    }
+  }
+
+  @Override
+  public final void writeStringList(int fieldNumber, List<String> list) throws IOException {
+    if (list instanceof LazyStringList) {
+      final LazyStringList lazyList = (LazyStringList) list;
+      for (int i = list.size() - 1; i >= 0; i--) {
+        writeLazyString(fieldNumber, lazyList.getRaw(i));
+      }
+    } else {
+      for (int i = list.size() - 1; i >= 0; i--) {
+        writeString(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private void writeLazyString(int fieldNumber, Object value) throws IOException {
+    if (value instanceof String) {
+      writeString(fieldNumber, (String) value);
+    } else {
+      writeBytes(fieldNumber, (ByteString) value);
+    }
+  }
+
+  @Override
+  public final void writeBytesList(int fieldNumber, List<ByteString> list) throws IOException {
+    for (int i = list.size() - 1; i >= 0; i--) {
+      writeBytes(fieldNumber, list.get(i));
+    }
+  }
+
+  @Override
+  public final void writeUInt32List(int fieldNumber, List<Integer> list, boolean packed)
+      throws IOException {
+    if (list instanceof IntArrayList) {
+      writeUInt32List_Internal(fieldNumber, (IntArrayList) list, packed);
+    } else {
+      writeUInt32List_Internal(fieldNumber, list, packed);
+    }
+  }
+
+  private final void writeUInt32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeVarint32(list.get(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeUInt32(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private final void writeUInt32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeVarint32(list.getInt(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeUInt32(fieldNumber, list.getInt(i));
+      }
+    }
+  }
+
+  @Override
+  public final void writeSFixed32List(int fieldNumber, List<Integer> list, boolean packed)
+      throws IOException {
+    writeFixed32List(fieldNumber, list, packed);
+  }
+
+  @Override
+  public final void writeSFixed64List(int fieldNumber, List<Long> list, boolean packed)
+      throws IOException {
+    writeFixed64List(fieldNumber, list, packed);
+  }
+
+  @Override
+  public final void writeSInt32List(int fieldNumber, List<Integer> list, boolean packed)
+      throws IOException {
+    if (list instanceof IntArrayList) {
+      writeSInt32List_Internal(fieldNumber, (IntArrayList) list, packed);
+    } else {
+      writeSInt32List_Internal(fieldNumber, list, packed);
+    }
+  }
+
+  private final void writeSInt32List_Internal(int fieldNumber, List<Integer> list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeSInt32(list.get(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeSInt32(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private final void writeSInt32List_Internal(int fieldNumber, IntArrayList list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeSInt32(list.getInt(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeSInt32(fieldNumber, list.getInt(i));
+      }
+    }
+  }
+
+  @Override
+  public final void writeSInt64List(int fieldNumber, List<Long> list, boolean packed)
+      throws IOException {
+    if (list instanceof LongArrayList) {
+      writeSInt64List_Internal(fieldNumber, (LongArrayList) list, packed);
+    } else {
+      writeSInt64List_Internal(fieldNumber, list, packed);
+    }
+  }
+
+  private static final int MAP_KEY_NUMBER = 1;
+  private static final int MAP_VALUE_NUMBER = 2;
+
+  @Override
+  public <K, V> void writeMap(int fieldNumber, MapEntryLite.Metadata<K, V> metadata, Map<K, V> map)
+      throws IOException {
+    // TODO(liujisi): Reverse write those entries.
+    for (Map.Entry<K, V> entry : map.entrySet()) {
+      int prevBytes = getTotalBytesWritten();
+      writeMapEntryField(this, MAP_VALUE_NUMBER, metadata.valueType, entry.getValue());
+      writeMapEntryField(this, MAP_KEY_NUMBER, metadata.keyType, entry.getKey());
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+  }
+
+  static final void writeMapEntryField(
+      Writer writer, int fieldNumber, WireFormat.FieldType fieldType, Object object)
+      throws IOException {
+    switch (fieldType) {
+      case BOOL:
+        writer.writeBool(fieldNumber, (Boolean) object);
+        break;
+      case FIXED32:
+        writer.writeFixed32(fieldNumber, (Integer) object);
+        break;
+      case FIXED64:
+        writer.writeFixed64(fieldNumber, (Long) object);
+        break;
+      case INT32:
+        writer.writeInt32(fieldNumber, (Integer) object);
+        break;
+      case INT64:
+        writer.writeInt64(fieldNumber, (Long) object);
+        break;
+      case SFIXED32:
+        writer.writeSFixed32(fieldNumber, (Integer) object);
+        break;
+      case SFIXED64:
+        writer.writeSFixed64(fieldNumber, (Long) object);
+        break;
+      case SINT32:
+        writer.writeSInt32(fieldNumber, (Integer) object);
+        break;
+      case SINT64:
+        writer.writeSInt64(fieldNumber, (Long) object);
+        break;
+      case STRING:
+        writer.writeString(fieldNumber, (String) object);
+        break;
+      case UINT32:
+        writer.writeUInt32(fieldNumber, (Integer) object);
+        break;
+      case UINT64:
+        writer.writeUInt64(fieldNumber, (Long) object);
+        break;
+      case FLOAT:
+        writer.writeFloat(fieldNumber, (Float) object);
+        break;
+      case DOUBLE:
+        writer.writeDouble(fieldNumber, (Double) object);
+        break;
+      case MESSAGE:
+        writer.writeMessage(fieldNumber, object);
+        break;
+      case BYTES:
+        writer.writeBytes(fieldNumber, (ByteString) object);
+        break;
+      case ENUM:
+        if (object instanceof Internal.EnumLite) {
+          writer.writeEnum(fieldNumber, ((Internal.EnumLite) object).getNumber());
+        } else if (object instanceof Integer) {
+          writer.writeEnum(fieldNumber, (Integer) object);
+        } else {
+          throw new IllegalArgumentException("Unexpected type for enum in map.");
+        }
+        break;
+      default:
+        throw new IllegalArgumentException("Unsupported map value type for: " + fieldType);
+    }
+  }
+
+  private final void writeSInt64List_Internal(int fieldNumber, List<Long> list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeSInt64(list.get(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeSInt64(fieldNumber, list.get(i));
+      }
+    }
+  }
+
+  private final void writeSInt64List_Internal(int fieldNumber, LongArrayList list, boolean packed)
+      throws IOException {
+    if (packed) {
+      requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
+      int prevBytes = getTotalBytesWritten();
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeSInt64(list.getLong(i));
+      }
+      int length = getTotalBytesWritten() - prevBytes;
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    } else {
+      for (int i = list.size() - 1; i >= 0; --i) {
+        writeSInt64(fieldNumber, list.getLong(i));
+      }
+    }
+  }
+
+  @Override
+  public final void writeMessageList(int fieldNumber, List<?> list) throws IOException {
+    for (int i = list.size() - 1; i >= 0; i--) {
+      writeMessage(fieldNumber, list.get(i));
+    }
+  }
+
+  @Override
+  public final void writeMessageList(int fieldNumber, List<?> list, Schema schema)
+      throws IOException {
+    for (int i = list.size() - 1; i >= 0; i--) {
+      writeMessage(fieldNumber, list.get(i), schema);
+    }
+  }
+
+  @Override
+  public final void writeGroupList(int fieldNumber, List<?> list) throws IOException {
+    for (int i = list.size() - 1; i >= 0; i--) {
+      writeGroup(fieldNumber, list.get(i));
+    }
+  }
+
+  @Override
+  public final void writeGroupList(int fieldNumber, List<?> list, Schema schema)
+      throws IOException {
+    for (int i = list.size() - 1; i >= 0; i--) {
+      writeGroup(fieldNumber, list.get(i), schema);
+    }
+  }
+
+  @Override
+  public final void writeMessageSetItem(int fieldNumber, Object value) throws IOException {
+    writeTag(MESSAGE_SET_ITEM, WIRETYPE_END_GROUP);
+    if (value instanceof ByteString) {
+      writeBytes(MESSAGE_SET_MESSAGE, (ByteString) value);
+    } else {
+      writeMessage(MESSAGE_SET_MESSAGE, value);
+    }
+    writeUInt32(MESSAGE_SET_TYPE_ID, fieldNumber);
+    writeTag(MESSAGE_SET_ITEM, WIRETYPE_START_GROUP);
+  }
+
+  final AllocatedBuffer newHeapBuffer() {
+    return alloc.allocateHeapBuffer(chunkSize);
+  }
+
+  final AllocatedBuffer newHeapBuffer(int capacity) {
+    return alloc.allocateHeapBuffer(Math.max(capacity, chunkSize));
+  }
+
+  final AllocatedBuffer newDirectBuffer() {
+    return alloc.allocateDirectBuffer(chunkSize);
+  }
+
+  final AllocatedBuffer newDirectBuffer(int capacity) {
+    return alloc.allocateDirectBuffer(Math.max(capacity, chunkSize));
+  }
+
+  /**
+   * Gets the total number of bytes that have been written. This will not be reset by a call to
+   * {@link #complete()}.
+   */
+  public abstract int getTotalBytesWritten();
+
+  abstract void requireSpace(int size);
+
+  abstract void finishCurrentBuffer();
+
+  abstract void writeTag(int fieldNumber, int wireType);
+
+  abstract void writeVarint32(int value);
+
+  abstract void writeInt32(int value);
+
+  abstract void writeSInt32(int value);
+
+  abstract void writeFixed32(int value);
+
+  abstract void writeVarint64(long value);
+
+  abstract void writeSInt64(long value);
+
+  abstract void writeFixed64(long value);
+
+  abstract void writeBool(boolean value);
+
+  abstract void writeString(String in);
+
+  /**
+   * Not using the version in CodedOutputStream due to the fact that benchmarks have shown a
+   * performance improvement when returning a byte (rather than an int).
+   */
+  private static byte computeUInt64SizeNoTag(long value) {
+    // handle two popular special cases up front ...
+    if ((value & (~0L << 7)) == 0L) {
+      // Byte 1
+      return 1;
+    }
+    if (value < 0L) {
+      // Byte 10
+      return 10;
+    }
+    // ... leaving us with 8 remaining, which we can divide and conquer
+    byte n = 2;
+    if ((value & (~0L << 35)) != 0L) {
+      // Byte 6-9
+      n += 4; // + (value >>> 63);
+      value >>>= 28;
+    }
+    if ((value & (~0L << 21)) != 0L) {
+      // Byte 4-5 or 8-9
+      n += 2;
+      value >>>= 14;
+    }
+    if ((value & (~0L << 14)) != 0L) {
+      // Byte 3 or 7
+      n += 1;
+    }
+    return n;
+  }
+
+  /** Writer that uses safe operations on target array. */
+  private static final class SafeHeapWriter extends BinaryWriter {
+    private AllocatedBuffer allocatedBuffer;
+    private byte[] buffer;
+    private int offset;
+    private int limit;
+    private int offsetMinusOne;
+    private int limitMinusOne;
+    private int pos;
+
+    SafeHeapWriter(BufferAllocator alloc, int chunkSize) {
+      super(alloc, chunkSize);
+      nextBuffer();
+    }
+
+    @Override
+    void finishCurrentBuffer() {
+      if (allocatedBuffer != null) {
+        totalDoneBytes += bytesWrittenToCurrentBuffer();
+        allocatedBuffer.position((pos - allocatedBuffer.arrayOffset()) + 1);
+        allocatedBuffer = null;
+        pos = 0;
+        limitMinusOne = 0;
+      }
+    }
+
+    private void nextBuffer() {
+      nextBuffer(newHeapBuffer());
+    }
+
+    private void nextBuffer(int capacity) {
+      nextBuffer(newHeapBuffer(capacity));
+    }
+
+    private void nextBuffer(AllocatedBuffer allocatedBuffer) {
+      if (!allocatedBuffer.hasArray()) {
+        throw new RuntimeException("Allocator returned non-heap buffer");
+      }
+
+      finishCurrentBuffer();
+
+      buffers.addFirst(allocatedBuffer);
+
+      this.allocatedBuffer = allocatedBuffer;
+      this.buffer = allocatedBuffer.array();
+      int arrayOffset = allocatedBuffer.arrayOffset();
+      this.limit = arrayOffset + allocatedBuffer.limit();
+      this.offset = arrayOffset + allocatedBuffer.position();
+      this.offsetMinusOne = offset - 1;
+      this.limitMinusOne = limit - 1;
+      this.pos = limitMinusOne;
+    }
+
+    @Override
+    public int getTotalBytesWritten() {
+      return totalDoneBytes + bytesWrittenToCurrentBuffer();
+    }
+
+    int bytesWrittenToCurrentBuffer() {
+      return limitMinusOne - pos;
+    }
+
+    int spaceLeft() {
+      return pos - offsetMinusOne;
+    }
+
+    @Override
+    public void writeUInt32(int fieldNumber, int value) throws IOException {
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeInt32(int fieldNumber, int value) throws IOException {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeInt32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeSInt32(int fieldNumber, int value) throws IOException {
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeSInt32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeFixed32(int fieldNumber, int value) throws IOException {
+      requireSpace(MAX_VARINT32_SIZE + FIXED32_SIZE);
+      writeFixed32(value);
+      writeTag(fieldNumber, WIRETYPE_FIXED32);
+    }
+
+    @Override
+    public void writeUInt64(int fieldNumber, long value) throws IOException {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeVarint64(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeSInt64(int fieldNumber, long value) throws IOException {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeSInt64(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeFixed64(int fieldNumber, long value) throws IOException {
+      requireSpace(MAX_VARINT32_SIZE + FIXED64_SIZE);
+      writeFixed64(value);
+      writeTag(fieldNumber, WIRETYPE_FIXED64);
+    }
+
+    @Override
+    public void writeBool(int fieldNumber, boolean value) throws IOException {
+      requireSpace(MAX_VARINT32_SIZE + 1);
+      write((byte) (value ? 1 : 0));
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeString(int fieldNumber, String value) throws IOException {
+      int prevBytes = getTotalBytesWritten();
+      writeString(value);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(2 * MAX_VARINT32_SIZE);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeBytes(int fieldNumber, ByteString value) throws IOException {
+      try {
+        value.writeToReverse(this);
+      } catch (IOException e) {
+        // Should never happen since the writer does not throw.
+        throw new RuntimeException(e);
+      }
+
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(value.size());
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeMessage(int fieldNumber, Object value) throws IOException {
+      int prevBytes = getTotalBytesWritten();
+      Protobuf.getInstance().writeTo(value, this);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeMessage(int fieldNumber, Object value, Schema schema) throws IOException {
+      int prevBytes = getTotalBytesWritten();
+      schema.writeTo(value, this);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeGroup(int fieldNumber, Object value) throws IOException {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+      Protobuf.getInstance().writeTo(value, this);
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeGroup(int fieldNumber, Object value, Schema schema) throws IOException {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+      schema.writeTo(value, this);
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeStartGroup(int fieldNumber) {
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeEndGroup(int fieldNumber) {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+    }
+
+    @Override
+    void writeInt32(int value) {
+      if (value >= 0) {
+        writeVarint32(value);
+      } else {
+        writeVarint64(value);
+      }
+    }
+
+    @Override
+    void writeSInt32(int value) {
+      writeVarint32(CodedOutputStream.encodeZigZag32(value));
+    }
+
+    @Override
+    void writeSInt64(long value) {
+      writeVarint64(CodedOutputStream.encodeZigZag64(value));
+    }
+
+    @Override
+    void writeBool(boolean value) {
+      write((byte) (value ? 1 : 0));
+    }
+
+    @Override
+    void writeTag(int fieldNumber, int wireType) {
+      writeVarint32(WireFormat.makeTag(fieldNumber, wireType));
+    }
+
+    @Override
+    void writeVarint32(int value) {
+      if ((value & (~0 << 7)) == 0) {
+        writeVarint32OneByte(value);
+      } else if ((value & (~0 << 14)) == 0) {
+        writeVarint32TwoBytes(value);
+      } else if ((value & (~0 << 21)) == 0) {
+        writeVarint32ThreeBytes(value);
+      } else if ((value & (~0 << 28)) == 0) {
+        writeVarint32FourBytes(value);
+      } else {
+        writeVarint32FiveBytes(value);
+      }
+    }
+
+    private void writeVarint32OneByte(int value) {
+      buffer[pos--] = (byte) value;
+    }
+
+    private void writeVarint32TwoBytes(int value) {
+      buffer[pos--] = (byte) (value >>> 7);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint32ThreeBytes(int value) {
+      buffer[pos--] = (byte) (value >>> 14);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint32FourBytes(int value) {
+      buffer[pos--] = (byte) (value >>> 21);
+      buffer[pos--] = (byte) (((value >>> 14) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint32FiveBytes(int value) {
+      buffer[pos--] = (byte) (value >>> 28);
+      buffer[pos--] = (byte) (((value >>> 21) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 14) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    @Override
+    void writeVarint64(long value) {
+      switch (computeUInt64SizeNoTag(value)) {
+        case 1:
+          writeVarint64OneByte(value);
+          break;
+        case 2:
+          writeVarint64TwoBytes(value);
+          break;
+        case 3:
+          writeVarint64ThreeBytes(value);
+          break;
+        case 4:
+          writeVarint64FourBytes(value);
+          break;
+        case 5:
+          writeVarint64FiveBytes(value);
+          break;
+        case 6:
+          writeVarint64SixBytes(value);
+          break;
+        case 7:
+          writeVarint64SevenBytes(value);
+          break;
+        case 8:
+          writeVarint64EightBytes(value);
+          break;
+        case 9:
+          writeVarint64NineBytes(value);
+          break;
+        case 10:
+          writeVarint64TenBytes(value);
+          break;
+      }
+    }
+
+    private void writeVarint64OneByte(long value) {
+      buffer[pos--] = (byte) value;
+    }
+
+    private void writeVarint64TwoBytes(long value) {
+      buffer[pos--] = (byte) (value >>> 7);
+      buffer[pos--] = (byte) (((int) value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint64ThreeBytes(long value) {
+      buffer[pos--] = (byte) (((int) value) >>> 14);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint64FourBytes(long value) {
+      buffer[pos--] = (byte) (value >>> 21);
+      buffer[pos--] = (byte) (((value >>> 14) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint64FiveBytes(long value) {
+      buffer[pos--] = (byte) (value >>> 28);
+      buffer[pos--] = (byte) (((value >>> 21) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 14) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint64SixBytes(long value) {
+      buffer[pos--] = (byte) (value >>> 35);
+      buffer[pos--] = (byte) (((value >>> 28) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 21) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 14) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint64SevenBytes(long value) {
+      buffer[pos--] = (byte) (value >>> 42);
+      buffer[pos--] = (byte) (((value >>> 35) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 28) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 21) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 14) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint64EightBytes(long value) {
+      buffer[pos--] = (byte) (value >>> 49);
+      buffer[pos--] = (byte) (((value >>> 42) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 35) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 28) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 21) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 14) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint64NineBytes(long value) {
+      buffer[pos--] = (byte) (value >>> 56);
+      buffer[pos--] = (byte) (((value >>> 49) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 42) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 35) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 28) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 21) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 14) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    private void writeVarint64TenBytes(long value) {
+      buffer[pos--] = (byte) (value >>> 63);
+      buffer[pos--] = (byte) (((value >>> 56) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 49) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 42) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 35) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 28) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 21) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 14) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) (((value >>> 7) & 0x7F) | 0x80);
+      buffer[pos--] = (byte) ((value & 0x7F) | 0x80);
+    }
+
+    @Override
+    void writeFixed32(int value) {
+      buffer[pos--] = (byte) ((value >> 24) & 0xFF);
+      buffer[pos--] = (byte) ((value >> 16) & 0xFF);
+      buffer[pos--] = (byte) ((value >> 8) & 0xFF);
+      buffer[pos--] = (byte) (value & 0xFF);
+    }
+
+    @Override
+    void writeFixed64(long value) {
+      buffer[pos--] = (byte) ((int) (value >> 56) & 0xFF);
+      buffer[pos--] = (byte) ((int) (value >> 48) & 0xFF);
+      buffer[pos--] = (byte) ((int) (value >> 40) & 0xFF);
+      buffer[pos--] = (byte) ((int) (value >> 32) & 0xFF);
+      buffer[pos--] = (byte) ((int) (value >> 24) & 0xFF);
+      buffer[pos--] = (byte) ((int) (value >> 16) & 0xFF);
+      buffer[pos--] = (byte) ((int) (value >> 8) & 0xFF);
+      buffer[pos--] = (byte) ((int) (value) & 0xFF);
+    }
+
+    @Override
+    void writeString(String in) {
+      // Request enough space to write the ASCII string.
+      requireSpace(in.length());
+
+      // We know the buffer is big enough...
+      int i = in.length() - 1;
+      // Set pos to the start of the ASCII string.
+      pos -= i;
+      // Designed to take advantage of
+      // https://wiki.openjdk.java.net/display/HotSpotInternals/RangeCheckElimination
+      for (char c; i >= 0 && (c = in.charAt(i)) < 0x80; i--) {
+        buffer[pos + i] = (byte) c;
+      }
+      if (i == -1) {
+        // Move pos past the String.
+        pos -= 1;
+        return;
+      }
+      pos += i;
+      for (char c; i >= 0; i--) {
+        c = in.charAt(i);
+        if (c < 0x80 && pos > offsetMinusOne) {
+          buffer[pos--] = (byte) c;
+        } else if (c < 0x800 && pos > offset) { // 11 bits, two UTF-8 bytes
+          buffer[pos--] = (byte) (0x80 | (0x3F & c));
+          buffer[pos--] = (byte) ((0xF << 6) | (c >>> 6));
+        } else if ((c < Character.MIN_SURROGATE || Character.MAX_SURROGATE < c)
+            && pos > (offset + 1)) {
+          // Maximum single-char code point is 0xFFFF, 16 bits, three UTF-8 bytes
+          buffer[pos--] = (byte) (0x80 | (0x3F & c));
+          buffer[pos--] = (byte) (0x80 | (0x3F & (c >>> 6)));
+          buffer[pos--] = (byte) ((0xF << 5) | (c >>> 12));
+        } else if (pos > (offset + 2)) {
+          // Minimum code point represented by a surrogate pair is 0x10000, 17 bits,
+          // four UTF-8 bytes
+          char high = 0;
+          if (i == 0 || !Character.isSurrogatePair(high = in.charAt(i - 1), c)) {
+            throw new Utf8.UnpairedSurrogateException(i - 1, i);
+          }
+          i--;
+          int codePoint = Character.toCodePoint(high, c);
+          buffer[pos--] = (byte) (0x80 | (0x3F & codePoint));
+          buffer[pos--] = (byte) (0x80 | (0x3F & (codePoint >>> 6)));
+          buffer[pos--] = (byte) (0x80 | (0x3F & (codePoint >>> 12)));
+          buffer[pos--] = (byte) ((0xF << 4) | (codePoint >>> 18));
+        } else {
+          // Buffer is full - allocate a new one and revisit the current character.
+          requireSpace(i);
+          i++;
+        }
+      }
+    }
+
+    @Override
+    public void write(byte value) {
+      buffer[pos--] = value;
+    }
+
+    @Override
+    public void write(byte[] value, int offset, int length) {
+      if (spaceLeft() < length) {
+        nextBuffer(length);
+      }
+
+      pos -= length;
+      System.arraycopy(value, offset, buffer, pos + 1, length);
+    }
+
+    @Override
+    public void writeLazy(byte[] value, int offset, int length) {
+      if (spaceLeft() < length) {
+        // We consider the value to be immutable (likely the internals of a ByteString). Just
+        // wrap it in a Netty buffer and add it to the output buffer.
+        totalDoneBytes += length;
+        buffers.addFirst(AllocatedBuffer.wrap(value, offset, length));
+
+        // Advance the writer to the next buffer.
+        // TODO(nathanmittler): Consider slicing if space available above some threshold.
+        nextBuffer();
+        return;
+      }
+
+      pos -= length;
+      System.arraycopy(value, offset, buffer, pos + 1, length);
+    }
+
+    @Override
+    public void write(ByteBuffer value) {
+      int length = value.remaining();
+      if (spaceLeft() < length) {
+        nextBuffer(length);
+      }
+
+      pos -= length;
+      value.get(buffer, pos + 1, length);
+    }
+
+    @Override
+    public void writeLazy(ByteBuffer value) {
+      int length = value.remaining();
+      if (spaceLeft() < length) {
+        // We consider the value to be immutable (likely the internals of a ByteString). Just
+        // wrap it in a Netty buffer and add it to the output buffer.
+        totalDoneBytes += length;
+        buffers.addFirst(AllocatedBuffer.wrap(value));
+
+        // Advance the writer to the next buffer.
+        // TODO(nathanmittler): Consider slicing if space available above some threshold.
+        nextBuffer();
+      }
+
+      pos -= length;
+      value.get(buffer, pos + 1, length);
+    }
+
+    @Override
+    void requireSpace(int size) {
+      if (spaceLeft() < size) {
+        nextBuffer(size);
+      }
+    }
+  }
+
+  /** Writer that uses unsafe operations on a target array. */
+  private static final class UnsafeHeapWriter extends BinaryWriter {
+    private AllocatedBuffer allocatedBuffer;
+    private byte[] buffer;
+    private long offset;
+    private long limit;
+    private long offsetMinusOne;
+    private long limitMinusOne;
+    private long pos;
+
+    UnsafeHeapWriter(BufferAllocator alloc, int chunkSize) {
+      super(alloc, chunkSize);
+      nextBuffer();
+    }
+
+    /** Indicates whether the required unsafe operations are supported on this platform. */
+    static boolean isSupported() {
+      return UnsafeUtil.hasUnsafeArrayOperations();
+    }
+
+    @Override
+    void finishCurrentBuffer() {
+      if (allocatedBuffer != null) {
+        totalDoneBytes += bytesWrittenToCurrentBuffer();
+        allocatedBuffer.position((arrayPos() - allocatedBuffer.arrayOffset()) + 1);
+        allocatedBuffer = null;
+        pos = 0;
+        limitMinusOne = 0;
+      }
+    }
+
+    private int arrayPos() {
+      return (int) pos;
+    }
+
+    private void nextBuffer() {
+      nextBuffer(newHeapBuffer());
+    }
+
+    private void nextBuffer(int capacity) {
+      nextBuffer(newHeapBuffer(capacity));
+    }
+
+    private void nextBuffer(AllocatedBuffer allocatedBuffer) {
+      if (!allocatedBuffer.hasArray()) {
+        throw new RuntimeException("Allocator returned non-heap buffer");
+      }
+
+      finishCurrentBuffer();
+      buffers.addFirst(allocatedBuffer);
+
+      this.allocatedBuffer = allocatedBuffer;
+      this.buffer = allocatedBuffer.array();
+      int arrayOffset = allocatedBuffer.arrayOffset();
+      this.limit = arrayOffset + allocatedBuffer.limit();
+      this.offset = arrayOffset + allocatedBuffer.position();
+      this.offsetMinusOne = offset - 1;
+      this.limitMinusOne = limit - 1;
+      this.pos = limitMinusOne;
+    }
+
+    @Override
+    public int getTotalBytesWritten() {
+      return totalDoneBytes + bytesWrittenToCurrentBuffer();
+    }
+
+    int bytesWrittenToCurrentBuffer() {
+      return (int) (limitMinusOne - pos);
+    }
+
+    int spaceLeft() {
+      return (int) (pos - offsetMinusOne);
+    }
+
+    @Override
+    public void writeUInt32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeInt32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeInt32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeSInt32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeSInt32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeFixed32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE + FIXED32_SIZE);
+      writeFixed32(value);
+      writeTag(fieldNumber, WIRETYPE_FIXED32);
+    }
+
+    @Override
+    public void writeUInt64(int fieldNumber, long value) {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeVarint64(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeSInt64(int fieldNumber, long value) {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeSInt64(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeFixed64(int fieldNumber, long value) {
+      requireSpace(MAX_VARINT32_SIZE + FIXED64_SIZE);
+      writeFixed64(value);
+      writeTag(fieldNumber, WIRETYPE_FIXED64);
+    }
+
+    @Override
+    public void writeBool(int fieldNumber, boolean value) {
+      requireSpace(MAX_VARINT32_SIZE + 1);
+      write((byte) (value ? 1 : 0));
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeString(int fieldNumber, String value) {
+      int prevBytes = getTotalBytesWritten();
+      writeString(value);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(2 * MAX_VARINT32_SIZE);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeBytes(int fieldNumber, ByteString value) {
+      try {
+        value.writeToReverse(this);
+      } catch (IOException e) {
+        // Should never happen since the writer does not throw.
+        throw new RuntimeException(e);
+      }
+
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(value.size());
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeMessage(int fieldNumber, Object value) throws IOException {
+      int prevBytes = getTotalBytesWritten();
+      Protobuf.getInstance().writeTo(value, this);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeMessage(int fieldNumber, Object value, Schema schema) throws IOException {
+      int prevBytes = getTotalBytesWritten();
+      schema.writeTo(value, this);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeGroup(int fieldNumber, Object value) throws IOException {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+      Protobuf.getInstance().writeTo(value, this);
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeGroup(int fieldNumber, Object value, Schema schema) throws IOException {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+      schema.writeTo(value, this);
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeStartGroup(int fieldNumber) {
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeEndGroup(int fieldNumber) {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+    }
+
+    @Override
+    void writeInt32(int value) {
+      if (value >= 0) {
+        writeVarint32(value);
+      } else {
+        writeVarint64(value);
+      }
+    }
+
+    @Override
+    void writeSInt32(int value) {
+      writeVarint32(CodedOutputStream.encodeZigZag32(value));
+    }
+
+    @Override
+    void writeSInt64(long value) {
+      writeVarint64(CodedOutputStream.encodeZigZag64(value));
+    }
+
+    @Override
+    void writeBool(boolean value) {
+      write((byte) (value ? 1 : 0));
+    }
+
+    @Override
+    void writeTag(int fieldNumber, int wireType) {
+      writeVarint32(WireFormat.makeTag(fieldNumber, wireType));
+    }
+
+    @Override
+    void writeVarint32(int value) {
+      if ((value & (~0 << 7)) == 0) {
+        writeVarint32OneByte(value);
+      } else if ((value & (~0 << 14)) == 0) {
+        writeVarint32TwoBytes(value);
+      } else if ((value & (~0 << 21)) == 0) {
+        writeVarint32ThreeBytes(value);
+      } else if ((value & (~0 << 28)) == 0) {
+        writeVarint32FourBytes(value);
+      } else {
+        writeVarint32FiveBytes(value);
+      }
+    }
+
+    private void writeVarint32OneByte(int value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) value);
+    }
+
+    private void writeVarint32TwoBytes(int value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 7));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint32ThreeBytes(int value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 14));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint32FourBytes(int value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 21));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint32FiveBytes(int value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 28));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    @Override
+    void writeVarint64(long value) {
+      switch (computeUInt64SizeNoTag(value)) {
+        case 1:
+          writeVarint64OneByte(value);
+          break;
+        case 2:
+          writeVarint64TwoBytes(value);
+          break;
+        case 3:
+          writeVarint64ThreeBytes(value);
+          break;
+        case 4:
+          writeVarint64FourBytes(value);
+          break;
+        case 5:
+          writeVarint64FiveBytes(value);
+          break;
+        case 6:
+          writeVarint64SixBytes(value);
+          break;
+        case 7:
+          writeVarint64SevenBytes(value);
+          break;
+        case 8:
+          writeVarint64EightBytes(value);
+          break;
+        case 9:
+          writeVarint64NineBytes(value);
+          break;
+        case 10:
+          writeVarint64TenBytes(value);
+          break;
+      }
+    }
+
+    private void writeVarint64OneByte(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) value);
+    }
+
+    private void writeVarint64TwoBytes(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 7));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((int) value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64ThreeBytes(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((int) value) >>> 14));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64FourBytes(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 21));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64FiveBytes(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 28));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64SixBytes(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 35));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 28) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64SevenBytes(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 42));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 35) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 28) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64EightBytes(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 49));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 42) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 35) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 28) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64NineBytes(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 56));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 49) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 42) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 35) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 28) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64TenBytes(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value >>> 63));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 56) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 49) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 42) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 35) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 28) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    @Override
+    void writeFixed32(int value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value >> 24) & 0xFF));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value >> 16) & 0xFF));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((value >> 8) & 0xFF));
+      UnsafeUtil.putByte(buffer, pos--, (byte) (value & 0xFF));
+    }
+
+    @Override
+    void writeFixed64(long value) {
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((int) (value >> 56) & 0xFF));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((int) (value >> 48) & 0xFF));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((int) (value >> 40) & 0xFF));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((int) (value >> 32) & 0xFF));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((int) (value >> 24) & 0xFF));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((int) (value >> 16) & 0xFF));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((int) (value >> 8) & 0xFF));
+      UnsafeUtil.putByte(buffer, pos--, (byte) ((int) (value) & 0xFF));
+    }
+
+    @Override
+    void writeString(String in) {
+      // Request enough space to write the ASCII string.
+      requireSpace(in.length());
+
+      // We know the buffer is big enough...
+      int i = in.length() - 1;
+      // Set pos to the start of the ASCII string.
+      // pos -= i;
+      // Designed to take advantage of
+      // https://wiki.openjdk.java.net/display/HotSpotInternals/RangeCheckElimination
+      for (char c; i >= 0 && (c = in.charAt(i)) < 0x80; i--) {
+        UnsafeUtil.putByte(buffer, pos--, (byte) c);
+      }
+      if (i == -1) {
+        // Move pos past the String.
+        return;
+      }
+      for (char c; i >= 0; i--) {
+        c = in.charAt(i);
+        if (c < 0x80 && pos > offsetMinusOne) {
+          UnsafeUtil.putByte(buffer, pos--, (byte) c);
+        } else if (c < 0x800 && pos > offset) { // 11 bits, two UTF-8 bytes
+          UnsafeUtil.putByte(buffer, pos--, (byte) (0x80 | (0x3F & c)));
+          UnsafeUtil.putByte(buffer, pos--, (byte) ((0xF << 6) | (c >>> 6)));
+        } else if ((c < Character.MIN_SURROGATE || Character.MAX_SURROGATE < c)
+            && pos > offset + 1) {
+          // Maximum single-char code point is 0xFFFF, 16 bits, three UTF-8 bytes
+          UnsafeUtil.putByte(buffer, pos--, (byte) (0x80 | (0x3F & c)));
+          UnsafeUtil.putByte(buffer, pos--, (byte) (0x80 | (0x3F & (c >>> 6))));
+          UnsafeUtil.putByte(buffer, pos--, (byte) ((0xF << 5) | (c >>> 12)));
+        } else if (pos > offset + 2) {
+          // Minimum code point represented by a surrogate pair is 0x10000, 17 bits,
+          // four UTF-8 bytes
+          final char high;
+          if (i == 0 || !Character.isSurrogatePair(high = in.charAt(i - 1), c)) {
+            throw new Utf8.UnpairedSurrogateException(i - 1, i);
+          }
+          i--;
+          int codePoint = Character.toCodePoint(high, c);
+          UnsafeUtil.putByte(buffer, pos--, (byte) (0x80 | (0x3F & codePoint)));
+          UnsafeUtil.putByte(buffer, pos--, (byte) (0x80 | (0x3F & (codePoint >>> 6))));
+          UnsafeUtil.putByte(buffer, pos--, (byte) (0x80 | (0x3F & (codePoint >>> 12))));
+          UnsafeUtil.putByte(buffer, pos--, (byte) ((0xF << 4) | (codePoint >>> 18)));
+        } else {
+          // Buffer is full - allocate a new one and revisit the current character.
+          requireSpace(i);
+          i++;
+        }
+      }
+    }
+
+    @Override
+    public void write(byte value) {
+      UnsafeUtil.putByte(buffer, pos--, value);
+    }
+
+    @Override
+    public void write(byte[] value, int offset, int length) {
+      if (offset < 0 || offset + length > value.length) {
+        throw new ArrayIndexOutOfBoundsException(
+            String.format("value.length=%d, offset=%d, length=%d", value.length, offset, length));
+      }
+      requireSpace(length);
+
+      pos -= length;
+      System.arraycopy(value, offset, buffer, arrayPos() + 1, length);
+    }
+
+    @Override
+    public void writeLazy(byte[] value, int offset, int length) {
+      if (offset < 0 || offset + length > value.length) {
+        throw new ArrayIndexOutOfBoundsException(
+            String.format("value.length=%d, offset=%d, length=%d", value.length, offset, length));
+      }
+      if (spaceLeft() < length) {
+        // We consider the value to be immutable (likely the internals of a ByteString). Just
+        // wrap it in a Netty buffer and add it to the output buffer.
+        totalDoneBytes += length;
+        buffers.addFirst(AllocatedBuffer.wrap(value, offset, length));
+
+        // Advance the writer to the next buffer.
+        // TODO(nathanmittler): Consider slicing if space available above some threshold.
+        nextBuffer();
+        return;
+      }
+
+      pos -= length;
+      System.arraycopy(value, offset, buffer, arrayPos() + 1, length);
+    }
+
+    @Override
+    public void write(ByteBuffer value) {
+      int length = value.remaining();
+      requireSpace(length);
+
+      pos -= length;
+      value.get(buffer, arrayPos() + 1, length);
+    }
+
+    @Override
+    public void writeLazy(ByteBuffer value) {
+      int length = value.remaining();
+      if (spaceLeft() < length) {
+        // We consider the value to be immutable (likely the internals of a ByteString). Just
+        // wrap it in a Netty buffer and add it to the output buffer.
+        totalDoneBytes += length;
+        buffers.addFirst(AllocatedBuffer.wrap(value));
+
+        // Advance the writer to the next buffer.
+        // TODO(nathanmittler): Consider slicing if space available above some threshold.
+        nextBuffer();
+      }
+
+      pos -= length;
+      value.get(buffer, arrayPos() + 1, length);
+    }
+
+    @Override
+    void requireSpace(int size) {
+      if (spaceLeft() < size) {
+        nextBuffer(size);
+      }
+    }
+  }
+
+  /** Writer that uses safe operations on a target {@link ByteBuffer}. */
+  private static final class SafeDirectWriter extends BinaryWriter {
+    private ByteBuffer buffer;
+    private int limitMinusOne;
+    private int pos;
+
+    SafeDirectWriter(BufferAllocator alloc, int chunkSize) {
+      super(alloc, chunkSize);
+      nextBuffer();
+    }
+
+    private void nextBuffer() {
+      nextBuffer(newDirectBuffer());
+    }
+
+    private void nextBuffer(int capacity) {
+      nextBuffer(newDirectBuffer(capacity));
+    }
+
+    private void nextBuffer(AllocatedBuffer allocatedBuffer) {
+      if (!allocatedBuffer.hasNioBuffer()) {
+        throw new RuntimeException("Allocated buffer does not have NIO buffer");
+      }
+      ByteBuffer nioBuffer = allocatedBuffer.nioBuffer();
+      if (!nioBuffer.isDirect()) {
+        throw new RuntimeException("Allocator returned non-direct buffer");
+      }
+
+      finishCurrentBuffer();
+      buffers.addFirst(allocatedBuffer);
+
+      buffer = nioBuffer;
+      buffer.limit(buffer.capacity());
+      buffer.position(0);
+      // Set byte order to little endian for fast writing of fixed 32/64.
+      buffer.order(ByteOrder.LITTLE_ENDIAN);
+
+      limitMinusOne = buffer.limit() - 1;
+      pos = limitMinusOne;
+    }
+
+    @Override
+    public int getTotalBytesWritten() {
+      return totalDoneBytes + bytesWrittenToCurrentBuffer();
+    }
+
+    private int bytesWrittenToCurrentBuffer() {
+      return limitMinusOne - pos;
+    }
+
+    private int spaceLeft() {
+      return pos + 1;
+    }
+
+    @Override
+    void finishCurrentBuffer() {
+      if (buffer != null) {
+        totalDoneBytes += bytesWrittenToCurrentBuffer();
+        // Update the indices on the netty buffer.
+        buffer.position(pos + 1);
+        buffer = null;
+        pos = 0;
+        limitMinusOne = 0;
+      }
+    }
+
+    @Override
+    public void writeUInt32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeInt32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeInt32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeSInt32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeSInt32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeFixed32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE + FIXED32_SIZE);
+      writeFixed32(value);
+      writeTag(fieldNumber, WIRETYPE_FIXED32);
+    }
+
+    @Override
+    public void writeUInt64(int fieldNumber, long value) {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeVarint64(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeSInt64(int fieldNumber, long value) {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeSInt64(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeFixed64(int fieldNumber, long value) {
+      requireSpace(MAX_VARINT32_SIZE + FIXED64_SIZE);
+      writeFixed64(value);
+      writeTag(fieldNumber, WIRETYPE_FIXED64);
+    }
+
+    @Override
+    public void writeBool(int fieldNumber, boolean value) {
+      requireSpace(MAX_VARINT32_SIZE + 1);
+      write((byte) (value ? 1 : 0));
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeString(int fieldNumber, String value) {
+      int prevBytes = getTotalBytesWritten();
+      writeString(value);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(2 * MAX_VARINT32_SIZE);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeBytes(int fieldNumber, ByteString value) {
+      try {
+        value.writeToReverse(this);
+      } catch (IOException e) {
+        // Should never happen since the writer does not throw.
+        throw new RuntimeException(e);
+      }
+
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(value.size());
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeMessage(int fieldNumber, Object value) throws IOException {
+      int prevBytes = getTotalBytesWritten();
+      Protobuf.getInstance().writeTo(value, this);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeMessage(int fieldNumber, Object value, Schema schema) throws IOException {
+      int prevBytes = getTotalBytesWritten();
+      schema.writeTo(value, this);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeGroup(int fieldNumber, Object value) throws IOException {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+      Protobuf.getInstance().writeTo(value, this);
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeGroup(int fieldNumber, Object value, Schema schema) throws IOException {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+      schema.writeTo(value, this);
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeStartGroup(int fieldNumber) {
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeEndGroup(int fieldNumber) {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+    }
+
+    @Override
+    void writeInt32(int value) {
+      if (value >= 0) {
+        writeVarint32(value);
+      } else {
+        writeVarint64(value);
+      }
+    }
+
+    @Override
+    void writeSInt32(int value) {
+      writeVarint32(CodedOutputStream.encodeZigZag32(value));
+    }
+
+    @Override
+    void writeSInt64(long value) {
+      writeVarint64(CodedOutputStream.encodeZigZag64(value));
+    }
+
+    @Override
+    void writeBool(boolean value) {
+      write((byte) (value ? 1 : 0));
+    }
+
+    @Override
+    void writeTag(int fieldNumber, int wireType) {
+      writeVarint32(WireFormat.makeTag(fieldNumber, wireType));
+    }
+
+    @Override
+    void writeVarint32(int value) {
+      if ((value & (~0 << 7)) == 0) {
+        writeVarint32OneByte(value);
+      } else if ((value & (~0 << 14)) == 0) {
+        writeVarint32TwoBytes(value);
+      } else if ((value & (~0 << 21)) == 0) {
+        writeVarint32ThreeBytes(value);
+      } else if ((value & (~0 << 28)) == 0) {
+        writeVarint32FourBytes(value);
+      } else {
+        writeVarint32FiveBytes(value);
+      }
+    }
+
+    private void writeVarint32OneByte(int value) {
+      buffer.put(pos--, (byte) value);
+    }
+
+    private void writeVarint32TwoBytes(int value) {
+      // Byte order is little-endian.
+      pos -= 2;
+      buffer.putShort(pos + 1, (short) (((value & (0x7F << 7)) << 1) | ((value & 0x7F) | 0x80)));
+    }
+
+    private void writeVarint32ThreeBytes(int value) {
+      // Byte order is little-endian.
+      pos -= 3;
+      buffer.putInt(
+          pos,
+          ((value & (0x7F << 14)) << 10)
+              | (((value & (0x7F << 7)) | (0x80 << 7)) << 9)
+              | ((value & 0x7F) | 0x80) << 8);
+    }
+
+    private void writeVarint32FourBytes(int value) {
+      // Byte order is little-endian.
+      pos -= 4;
+      buffer.putInt(
+          pos + 1,
+          ((value & (0x7F << 21)) << 3)
+              | (((value & (0x7F << 14)) | (0x80 << 14)) << 2)
+              | (((value & (0x7F << 7)) | (0x80 << 7)) << 1)
+              | ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint32FiveBytes(int value) {
+      // Byte order is little-endian.
+      buffer.put(pos--, (byte) (value >>> 28));
+      pos -= 4;
+      buffer.putInt(
+          pos + 1,
+          ((((value >>> 21) & 0x7F) | 0x80) << 24)
+              | ((((value >>> 14) & 0x7F) | 0x80) << 16)
+              | ((((value >>> 7) & 0x7F) | 0x80) << 8)
+              | ((value & 0x7F) | 0x80));
+    }
+
+    @Override
+    void writeVarint64(long value) {
+      switch (computeUInt64SizeNoTag(value)) {
+        case 1:
+          writeVarint64OneByte(value);
+          break;
+        case 2:
+          writeVarint64TwoBytes(value);
+          break;
+        case 3:
+          writeVarint64ThreeBytes(value);
+          break;
+        case 4:
+          writeVarint64FourBytes(value);
+          break;
+        case 5:
+          writeVarint64FiveBytes(value);
+          break;
+        case 6:
+          writeVarint64SixBytes(value);
+          break;
+        case 7:
+          writeVarint64SevenBytes(value);
+          break;
+        case 8:
+          writeVarint64EightBytes(value);
+          break;
+        case 9:
+          writeVarint64NineBytes(value);
+          break;
+        case 10:
+          writeVarint64TenBytes(value);
+          break;
+      }
+    }
+
+    private void writeVarint64OneByte(long value) {
+      writeVarint32OneByte((int) value);
+    }
+
+    private void writeVarint64TwoBytes(long value) {
+      writeVarint32TwoBytes((int) value);
+    }
+
+    private void writeVarint64ThreeBytes(long value) {
+      writeVarint32ThreeBytes((int) value);
+    }
+
+    private void writeVarint64FourBytes(long value) {
+      writeVarint32FourBytes((int) value);
+    }
+
+    private void writeVarint64FiveBytes(long value) {
+      // Byte order is little-endian.
+      pos -= 5;
+      buffer.putLong(
+          pos - 2,
+          ((value & (0x7FL << 28)) << 28)
+              | (((value & (0x7F << 21)) | (0x80 << 21)) << 27)
+              | (((value & (0x7F << 14)) | (0x80 << 14)) << 26)
+              | (((value & (0x7F << 7)) | (0x80 << 7)) << 25)
+              | (((value & 0x7F) | 0x80)) << 24);
+    }
+
+    private void writeVarint64SixBytes(long value) {
+      // Byte order is little-endian.
+      pos -= 6;
+      buffer.putLong(
+          pos - 1,
+          ((value & (0x7FL << 35)) << 21)
+              | (((value & (0x7FL << 28)) | (0x80L << 28)) << 20)
+              | (((value & (0x7F << 21)) | (0x80 << 21)) << 19)
+              | (((value & (0x7F << 14)) | (0x80 << 14)) << 18)
+              | (((value & (0x7F << 7)) | (0x80 << 7)) << 17)
+              | (((value & 0x7F) | 0x80)) << 16);
+    }
+
+    private void writeVarint64SevenBytes(long value) {
+      // Byte order is little-endian.
+      pos -= 7;
+      buffer.putLong(
+          pos,
+          ((value & (0x7FL << 42)) << 14)
+              | (((value & (0x7FL << 35)) | (0x80L << 35)) << 13)
+              | (((value & (0x7FL << 28)) | (0x80L << 28)) << 12)
+              | (((value & (0x7F << 21)) | (0x80 << 21)) << 11)
+              | (((value & (0x7F << 14)) | (0x80 << 14)) << 10)
+              | (((value & (0x7F << 7)) | (0x80 << 7)) << 9)
+              | (((value & 0x7F) | 0x80)) << 8);
+    }
+
+    private void writeVarint64EightBytes(long value) {
+      // Byte order is little-endian.
+      pos -= 8;
+      buffer.putLong(
+          pos + 1,
+          ((value & (0x7FL << 49)) << 7)
+              | (((value & (0x7FL << 42)) | (0x80L << 42)) << 6)
+              | (((value & (0x7FL << 35)) | (0x80L << 35)) << 5)
+              | (((value & (0x7FL << 28)) | (0x80L << 28)) << 4)
+              | (((value & (0x7F << 21)) | (0x80 << 21)) << 3)
+              | (((value & (0x7F << 14)) | (0x80 << 14)) << 2)
+              | (((value & (0x7F << 7)) | (0x80 << 7)) << 1)
+              | ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64EightBytesWithSign(long value) {
+      // Byte order is little-endian.
+      pos -= 8;
+      buffer.putLong(
+          pos + 1,
+          (((value & (0x7FL << 49)) | (0x80L << 49)) << 7)
+              | (((value & (0x7FL << 42)) | (0x80L << 42)) << 6)
+              | (((value & (0x7FL << 35)) | (0x80L << 35)) << 5)
+              | (((value & (0x7FL << 28)) | (0x80L << 28)) << 4)
+              | (((value & (0x7F << 21)) | (0x80 << 21)) << 3)
+              | (((value & (0x7F << 14)) | (0x80 << 14)) << 2)
+              | (((value & (0x7F << 7)) | (0x80 << 7)) << 1)
+              | ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64NineBytes(long value) {
+      buffer.put(pos--, (byte) (value >>> 56));
+      writeVarint64EightBytesWithSign(value & 0xFFFFFFFFFFFFFFL);
+    }
+
+    private void writeVarint64TenBytes(long value) {
+      buffer.put(pos--, (byte) (value >>> 63));
+      buffer.put(pos--, (byte) (((value >>> 56) & 0x7F) | 0x80));
+      writeVarint64EightBytesWithSign(value & 0xFFFFFFFFFFFFFFL);
+    }
+
+    @Override
+    void writeFixed32(int value) {
+      pos -= 4;
+      buffer.putInt(pos + 1, value);
+    }
+
+    @Override
+    void writeFixed64(long value) {
+      pos -= 8;
+      buffer.putLong(pos + 1, value);
+    }
+
+    @Override
+    void writeString(String in) {
+      // Request enough space to write the ASCII string.
+      requireSpace(in.length());
+
+      // We know the buffer is big enough...
+      int i = in.length() - 1;
+      pos -= i;
+      // Designed to take advantage of
+      // https://wiki.openjdk.java.net/display/HotSpotInternals/RangeCheckElimination
+      for (char c; i >= 0 && (c = in.charAt(i)) < 0x80; i--) {
+        buffer.put(pos + i, (byte) c);
+      }
+      if (i == -1) {
+        // Move the position past the ASCII string.
+        pos -= 1;
+        return;
+      }
+      pos += i;
+      for (char c; i >= 0; i--) {
+        c = in.charAt(i);
+        if (c < 0x80 && pos >= 0) {
+          buffer.put(pos--, (byte) c);
+        } else if (c < 0x800 && pos > 0) { // 11 bits, two UTF-8 bytes
+          buffer.put(pos--, (byte) (0x80 | (0x3F & c)));
+          buffer.put(pos--, (byte) ((0xF << 6) | (c >>> 6)));
+        } else if ((c < Character.MIN_SURROGATE || Character.MAX_SURROGATE < c) && pos > 1) {
+          // Maximum single-char code point is 0xFFFF, 16 bits, three UTF-8 bytes
+          buffer.put(pos--, (byte) (0x80 | (0x3F & c)));
+          buffer.put(pos--, (byte) (0x80 | (0x3F & (c >>> 6))));
+          buffer.put(pos--, (byte) ((0xF << 5) | (c >>> 12)));
+        } else if (pos > 2) {
+          // Minimum code point represented by a surrogate pair is 0x10000, 17 bits,
+          // four UTF-8 bytes
+          char high = 0;
+          if (i == 0 || !Character.isSurrogatePair(high = in.charAt(i - 1), c)) {
+            throw new Utf8.UnpairedSurrogateException(i - 1, i);
+          }
+          i--;
+          int codePoint = Character.toCodePoint(high, c);
+          buffer.put(pos--, (byte) (0x80 | (0x3F & codePoint)));
+          buffer.put(pos--, (byte) (0x80 | (0x3F & (codePoint >>> 6))));
+          buffer.put(pos--, (byte) (0x80 | (0x3F & (codePoint >>> 12))));
+          buffer.put(pos--, (byte) ((0xF << 4) | (codePoint >>> 18)));
+        } else {
+          // Buffer is full - allocate a new one and revisit the current character.
+          requireSpace(i);
+          i++;
+        }
+      }
+    }
+
+    @Override
+    public void write(byte value) {
+      buffer.put(pos--, value);
+    }
+
+    @Override
+    public void write(byte[] value, int offset, int length) {
+      if (spaceLeft() < length) {
+        nextBuffer(length);
+      }
+
+      pos -= length;
+      buffer.position(pos + 1);
+      buffer.put(value, offset, length);
+    }
+
+    @Override
+    public void writeLazy(byte[] value, int offset, int length) {
+      if (spaceLeft() < length) {
+        // We consider the value to be immutable (likely the internals of a ByteString). Just
+        // wrap it in a Netty buffer and add it to the output buffer.
+        totalDoneBytes += length;
+        buffers.addFirst(AllocatedBuffer.wrap(value, offset, length));
+
+        // Advance the writer to the next buffer.
+        // TODO(nathanmittler): Consider slicing if space available above some threshold.
+        nextBuffer();
+        return;
+      }
+
+      pos -= length;
+      buffer.position(pos + 1);
+      buffer.put(value, offset, length);
+    }
+
+    @Override
+    public void write(ByteBuffer value) {
+      int length = value.remaining();
+      if (spaceLeft() < length) {
+        nextBuffer(length);
+      }
+
+      pos -= length;
+      buffer.position(pos + 1);
+      buffer.put(value);
+    }
+
+    @Override
+    public void writeLazy(ByteBuffer value) {
+      int length = value.remaining();
+      if (spaceLeft() < length) {
+        // We consider the value to be immutable (likely the internals of a ByteString). Just
+        // wrap it in a Netty buffer and add it to the output buffer.
+        totalDoneBytes += length;
+        buffers.addFirst(AllocatedBuffer.wrap(value));
+
+        // Advance the writer to the next buffer.
+        // TODO(nathanmittler): Consider slicing if space available above some threshold.
+        nextBuffer();
+        return;
+      }
+
+      pos -= length;
+      buffer.position(pos + 1);
+      buffer.put(value);
+    }
+
+    @Override
+    void requireSpace(int size) {
+      if (spaceLeft() < size) {
+        nextBuffer(size);
+      }
+    }
+  }
+
+  /** Writer that uses unsafe operations on a target {@link ByteBuffer}. */
+  private static final class UnsafeDirectWriter extends BinaryWriter {
+    private ByteBuffer buffer;
+    private long bufferOffset;
+    private long limitMinusOne;
+    private long pos;
+
+    UnsafeDirectWriter(BufferAllocator alloc, int chunkSize) {
+      super(alloc, chunkSize);
+      nextBuffer();
+    }
+
+    /** Indicates whether the required unsafe operations are supported on this platform. */
+    private static boolean isSupported() {
+      return UnsafeUtil.hasUnsafeByteBufferOperations();
+    }
+
+    private void nextBuffer() {
+      nextBuffer(newDirectBuffer());
+    }
+
+    private void nextBuffer(int capacity) {
+      nextBuffer(newDirectBuffer(capacity));
+    }
+
+    private void nextBuffer(AllocatedBuffer allocatedBuffer) {
+      if (!allocatedBuffer.hasNioBuffer()) {
+        throw new RuntimeException("Allocated buffer does not have NIO buffer");
+      }
+      ByteBuffer nioBuffer = allocatedBuffer.nioBuffer();
+      if (!nioBuffer.isDirect()) {
+        throw new RuntimeException("Allocator returned non-direct buffer");
+      }
+
+      finishCurrentBuffer();
+      buffers.addFirst(allocatedBuffer);
+
+      buffer = nioBuffer;
+      buffer.limit(buffer.capacity());
+      buffer.position(0);
+
+      bufferOffset = UnsafeUtil.addressOffset(buffer);
+      limitMinusOne = bufferOffset + (buffer.limit() - 1);
+      pos = limitMinusOne;
+    }
+
+    @Override
+    public int getTotalBytesWritten() {
+      return totalDoneBytes + bytesWrittenToCurrentBuffer();
+    }
+
+    private int bytesWrittenToCurrentBuffer() {
+      return (int) (limitMinusOne - pos);
+    }
+
+    private int spaceLeft() {
+      return bufferPos() + 1;
+    }
+
+    @Override
+    void finishCurrentBuffer() {
+      if (buffer != null) {
+        totalDoneBytes += bytesWrittenToCurrentBuffer();
+        // Update the indices on the netty buffer.
+        buffer.position(bufferPos() + 1);
+        buffer = null;
+        pos = 0;
+        limitMinusOne = 0;
+      }
+    }
+
+    private int bufferPos() {
+      return (int) (pos - bufferOffset);
+    }
+
+    @Override
+    public void writeUInt32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeInt32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeInt32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeSInt32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeSInt32(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeFixed32(int fieldNumber, int value) {
+      requireSpace(MAX_VARINT32_SIZE + FIXED32_SIZE);
+      writeFixed32(value);
+      writeTag(fieldNumber, WIRETYPE_FIXED32);
+    }
+
+    @Override
+    public void writeUInt64(int fieldNumber, long value) {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeVarint64(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeSInt64(int fieldNumber, long value) {
+      requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
+      writeSInt64(value);
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeFixed64(int fieldNumber, long value) {
+      requireSpace(MAX_VARINT32_SIZE + FIXED64_SIZE);
+      writeFixed64(value);
+      writeTag(fieldNumber, WIRETYPE_FIXED64);
+    }
+
+    @Override
+    public void writeBool(int fieldNumber, boolean value) {
+      requireSpace(MAX_VARINT32_SIZE + 1);
+      write((byte) (value ? 1 : 0));
+      writeTag(fieldNumber, WIRETYPE_VARINT);
+    }
+
+    @Override
+    public void writeString(int fieldNumber, String value) {
+      int prevBytes = getTotalBytesWritten();
+      writeString(value);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(2 * MAX_VARINT32_SIZE);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeBytes(int fieldNumber, ByteString value) {
+      try {
+        value.writeToReverse(this);
+      } catch (IOException e) {
+        // Should never happen since the writer does not throw.
+        throw new RuntimeException(e);
+      }
+
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(value.size());
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeMessage(int fieldNumber, Object value) throws IOException {
+      int prevBytes = getTotalBytesWritten();
+      Protobuf.getInstance().writeTo(value, this);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeMessage(int fieldNumber, Object value, Schema schema) throws IOException {
+      int prevBytes = getTotalBytesWritten();
+      schema.writeTo(value, this);
+      int length = getTotalBytesWritten() - prevBytes;
+      requireSpace(MAX_VARINT32_SIZE * 2);
+      writeVarint32(length);
+      writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    }
+
+    @Override
+    public void writeGroup(int fieldNumber, Object value) throws IOException {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+      Protobuf.getInstance().writeTo(value, this);
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeGroup(int fieldNumber, Object value, Schema schema) throws IOException {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+      schema.writeTo(value, this);
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeStartGroup(int fieldNumber) {
+      writeTag(fieldNumber, WIRETYPE_START_GROUP);
+    }
+
+    @Override
+    public void writeEndGroup(int fieldNumber) {
+      writeTag(fieldNumber, WIRETYPE_END_GROUP);
+    }
+
+    @Override
+    void writeInt32(int value) {
+      if (value >= 0) {
+        writeVarint32(value);
+      } else {
+        writeVarint64(value);
+      }
+    }
+
+    @Override
+    void writeSInt32(int value) {
+      writeVarint32(CodedOutputStream.encodeZigZag32(value));
+    }
+
+    @Override
+    void writeSInt64(long value) {
+      writeVarint64(CodedOutputStream.encodeZigZag64(value));
+    }
+
+    @Override
+    void writeBool(boolean value) {
+      write((byte) (value ? 1 : 0));
+    }
+
+    @Override
+    void writeTag(int fieldNumber, int wireType) {
+      writeVarint32(WireFormat.makeTag(fieldNumber, wireType));
+    }
+
+    @Override
+    void writeVarint32(int value) {
+      if ((value & (~0 << 7)) == 0) {
+        writeVarint32OneByte(value);
+      } else if ((value & (~0 << 14)) == 0) {
+        writeVarint32TwoBytes(value);
+      } else if ((value & (~0 << 21)) == 0) {
+        writeVarint32ThreeBytes(value);
+      } else if ((value & (~0 << 28)) == 0) {
+        writeVarint32FourBytes(value);
+      } else {
+        writeVarint32FiveBytes(value);
+      }
+    }
+
+    private void writeVarint32OneByte(int value) {
+      UnsafeUtil.putByte(pos--, (byte) value);
+    }
+
+    private void writeVarint32TwoBytes(int value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 7));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint32ThreeBytes(int value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 14));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint32FourBytes(int value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 21));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint32FiveBytes(int value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 28));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    @Override
+    void writeVarint64(long value) {
+      switch (computeUInt64SizeNoTag(value)) {
+        case 1:
+          writeVarint64OneByte(value);
+          break;
+        case 2:
+          writeVarint64TwoBytes(value);
+          break;
+        case 3:
+          writeVarint64ThreeBytes(value);
+          break;
+        case 4:
+          writeVarint64FourBytes(value);
+          break;
+        case 5:
+          writeVarint64FiveBytes(value);
+          break;
+        case 6:
+          writeVarint64SixBytes(value);
+          break;
+        case 7:
+          writeVarint64SevenBytes(value);
+          break;
+        case 8:
+          writeVarint64EightBytes(value);
+          break;
+        case 9:
+          writeVarint64NineBytes(value);
+          break;
+        case 10:
+          writeVarint64TenBytes(value);
+          break;
+      }
+    }
+
+    private void writeVarint64OneByte(long value) {
+      UnsafeUtil.putByte(pos--, (byte) value);
+    }
+
+    private void writeVarint64TwoBytes(long value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 7));
+      UnsafeUtil.putByte(pos--, (byte) (((int) value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64ThreeBytes(long value) {
+      UnsafeUtil.putByte(pos--, (byte) (((int) value) >>> 14));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64FourBytes(long value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 21));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64FiveBytes(long value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 28));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64SixBytes(long value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 35));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 28) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64SevenBytes(long value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 42));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 35) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 28) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64EightBytes(long value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 49));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 42) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 35) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 28) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64NineBytes(long value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 56));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 49) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 42) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 35) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 28) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    private void writeVarint64TenBytes(long value) {
+      UnsafeUtil.putByte(pos--, (byte) (value >>> 63));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 56) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 49) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 42) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 35) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 28) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 21) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 14) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) (((value >>> 7) & 0x7F) | 0x80));
+      UnsafeUtil.putByte(pos--, (byte) ((value & 0x7F) | 0x80));
+    }
+
+    @Override
+    void writeFixed32(int value) {
+      UnsafeUtil.putByte(pos--, (byte) ((value >> 24) & 0xFF));
+      UnsafeUtil.putByte(pos--, (byte) ((value >> 16) & 0xFF));
+      UnsafeUtil.putByte(pos--, (byte) ((value >> 8) & 0xFF));
+      UnsafeUtil.putByte(pos--, (byte) (value & 0xFF));
+    }
+
+    @Override
+    void writeFixed64(long value) {
+      UnsafeUtil.putByte(pos--, (byte) ((int) (value >> 56) & 0xFF));
+      UnsafeUtil.putByte(pos--, (byte) ((int) (value >> 48) & 0xFF));
+      UnsafeUtil.putByte(pos--, (byte) ((int) (value >> 40) & 0xFF));
+      UnsafeUtil.putByte(pos--, (byte) ((int) (value >> 32) & 0xFF));
+      UnsafeUtil.putByte(pos--, (byte) ((int) (value >> 24) & 0xFF));
+      UnsafeUtil.putByte(pos--, (byte) ((int) (value >> 16) & 0xFF));
+      UnsafeUtil.putByte(pos--, (byte) ((int) (value >> 8) & 0xFF));
+      UnsafeUtil.putByte(pos--, (byte) ((int) (value) & 0xFF));
+    }
+
+    @Override
+    void writeString(String in) {
+      // Request enough space to write the ASCII string.
+      requireSpace(in.length());
+
+      // We know the buffer is big enough...
+      int i = in.length() - 1;
+      // Designed to take advantage of
+      // https://wiki.openjdk.java.net/display/HotSpotInternals/RangeCheckElimination
+      for (char c; i >= 0 && (c = in.charAt(i)) < 0x80; i--) {
+        UnsafeUtil.putByte(pos--, (byte) c);
+      }
+      if (i == -1) {
+        // ASCII.
+        return;
+      }
+      for (char c; i >= 0; i--) {
+        c = in.charAt(i);
+        if (c < 0x80 && pos >= bufferOffset) {
+          UnsafeUtil.putByte(pos--, (byte) c);
+        } else if (c < 0x800 && pos > bufferOffset) { // 11 bits, two UTF-8 bytes
+          UnsafeUtil.putByte(pos--, (byte) (0x80 | (0x3F & c)));
+          UnsafeUtil.putByte(pos--, (byte) ((0xF << 6) | (c >>> 6)));
+        } else if ((c < Character.MIN_SURROGATE || Character.MAX_SURROGATE < c)
+            && pos > bufferOffset + 1) {
+          // Maximum single-char code point is 0xFFFF, 16 bits, three UTF-8 bytes
+          UnsafeUtil.putByte(pos--, (byte) (0x80 | (0x3F & c)));
+          UnsafeUtil.putByte(pos--, (byte) (0x80 | (0x3F & (c >>> 6))));
+          UnsafeUtil.putByte(pos--, (byte) ((0xF << 5) | (c >>> 12)));
+        } else if (pos > bufferOffset + 2) {
+          // Minimum code point represented by a surrogate pair is 0x10000, 17 bits,
+          // four UTF-8 bytes
+          final char high;
+          if (i == 0 || !Character.isSurrogatePair(high = in.charAt(i - 1), c)) {
+            throw new Utf8.UnpairedSurrogateException(i - 1, i);
+          }
+          i--;
+          int codePoint = Character.toCodePoint(high, c);
+          UnsafeUtil.putByte(pos--, (byte) (0x80 | (0x3F & codePoint)));
+          UnsafeUtil.putByte(pos--, (byte) (0x80 | (0x3F & (codePoint >>> 6))));
+          UnsafeUtil.putByte(pos--, (byte) (0x80 | (0x3F & (codePoint >>> 12))));
+          UnsafeUtil.putByte(pos--, (byte) ((0xF << 4) | (codePoint >>> 18)));
+        } else {
+          // Buffer is full - allocate a new one and revisit the current character.
+          requireSpace(i);
+          i++;
+        }
+      }
+    }
+
+    @Override
+    public void write(byte value) {
+      UnsafeUtil.putByte(pos--, value);
+    }
+
+    @Override
+    public void write(byte[] value, int offset, int length) {
+      if (spaceLeft() < length) {
+        nextBuffer(length);
+      }
+
+      pos -= length;
+      buffer.position(bufferPos() + 1);
+      buffer.put(value, offset, length);
+    }
+
+    @Override
+    public void writeLazy(byte[] value, int offset, int length) {
+      if (spaceLeft() < length) {
+        // We consider the value to be immutable (likely the internals of a ByteString). Just
+        // wrap it in a Netty buffer and add it to the output buffer.
+        totalDoneBytes += length;
+        buffers.addFirst(AllocatedBuffer.wrap(value, offset, length));
+
+        // Advance the writer to the next buffer.
+        // TODO(nathanmittler): Consider slicing if space available above some threshold.
+        nextBuffer();
+        return;
+      }
+
+      pos -= length;
+      buffer.position(bufferPos() + 1);
+      buffer.put(value, offset, length);
+    }
+
+    @Override
+    public void write(ByteBuffer value) {
+      int length = value.remaining();
+      if (spaceLeft() < length) {
+        nextBuffer(length);
+      }
+
+      pos -= length;
+      buffer.position(bufferPos() + 1);
+      buffer.put(value);
+    }
+
+    @Override
+    public void writeLazy(ByteBuffer value) {
+      int length = value.remaining();
+      if (spaceLeft() < length) {
+        // We consider the value to be immutable (likely the internals of a ByteString). Just
+        // wrap it in a Netty buffer and add it to the output buffer.
+        totalDoneBytes += length;
+        buffers.addFirst(AllocatedBuffer.wrap(value));
+
+        // Advance the writer to the next buffer.
+        // TODO(nathanmittler): Consider slicing if space available above some threshold.
+        nextBuffer();
+        return;
+      }
+
+      pos -= length;
+      buffer.position(bufferPos() + 1);
+      buffer.put(value);
+    }
+
+    @Override
+    void requireSpace(int size) {
+      if (spaceLeft() < size) {
+        nextBuffer(size);
+      }
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/BufferAllocator.java b/java/core/src/main/java/com/google/protobuf/BufferAllocator.java
new file mode 100755
index 0000000..bfd9c72
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/BufferAllocator.java
@@ -0,0 +1,64 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.nio.ByteBuffer;
+
+/**
+ * An object responsible for allocation of buffers. This is an extension point to enable buffer
+ * pooling within an application.
+ */
+@ExperimentalApi
+abstract class BufferAllocator {
+  private static final BufferAllocator UNPOOLED =
+      new BufferAllocator() {
+        @Override
+        public AllocatedBuffer allocateHeapBuffer(int capacity) {
+          return AllocatedBuffer.wrap(new byte[capacity]);
+        }
+
+        @Override
+        public AllocatedBuffer allocateDirectBuffer(int capacity) {
+          return AllocatedBuffer.wrap(ByteBuffer.allocateDirect(capacity));
+        }
+      };
+
+  /** Returns an unpooled buffer allocator, which will create a new buffer for each request. */
+  public static BufferAllocator unpooled() {
+    return UNPOOLED;
+  }
+
+  /** Allocates a buffer with the given capacity that is backed by an array on the heap. */
+  public abstract AllocatedBuffer allocateHeapBuffer(int capacity);
+
+  /** Allocates a direct (i.e. non-heap) buffer with the given capacity. */
+  public abstract AllocatedBuffer allocateDirectBuffer(int capacity);
+}
diff --git a/java/core/src/main/java/com/google/protobuf/ByteString.java b/java/core/src/main/java/com/google/protobuf/ByteString.java
index 648991d..e5454a6 100644
--- a/java/core/src/main/java/com/google/protobuf/ByteString.java
+++ b/java/core/src/main/java/com/google/protobuf/ByteString.java
@@ -732,6 +732,16 @@
    */
   abstract void writeTo(ByteOutput byteOutput) throws IOException;
 
+  /**
+   * This method behaves exactly the same as {@link #writeTo(ByteOutput)} unless the {@link
+   * ByteString} is a rope. For ropes, the leaf nodes are written in reverse order to the {@code
+   * byteOutput}.
+   *
+   * @param byteOutput the output target to receive the bytes
+   * @throws IOException if an I/O error occurs
+   * @see UnsafeByteOperations#unsafeWriteToReverse(ByteString, ByteOutput)
+   */
+  abstract void writeToReverse(ByteOutput byteOutput) throws IOException;
 
   /**
    * Constructs a read-only {@code java.nio.ByteBuffer} whose content is equal to the contents of
@@ -862,6 +872,10 @@
       return true;
     }
 
+    @Override
+    void writeToReverse(ByteOutput byteOutput) throws IOException {
+      writeTo(byteOutput);
+    }
 
     /**
      * Check equality of the substring of given length of this object starting at zero with another
@@ -1438,14 +1452,16 @@
         LiteralByteString lbsOther = (LiteralByteString) other;
         byte[] thisBytes = bytes;
         byte[] otherBytes = lbsOther.bytes;
-
-        return UnsafeUtil.mismatch(
-                thisBytes,
-                getOffsetIntoBytes(),
-                otherBytes,
-                lbsOther.getOffsetIntoBytes() + offset,
-                length)
-            == -1;
+        int thisLimit = getOffsetIntoBytes() + length;
+        for (int thisIndex = getOffsetIntoBytes(),
+                otherIndex = lbsOther.getOffsetIntoBytes() + offset;
+            (thisIndex < thisLimit);
+            ++thisIndex, ++otherIndex) {
+          if (thisBytes[thisIndex] != otherBytes[otherIndex]) {
+            return false;
+          }
+        }
+        return true;
       }
 
       return other.substring(offset, offset + length).equals(substring(0, length));
diff --git a/java/core/src/main/java/com/google/protobuf/CodedInputStream.java b/java/core/src/main/java/com/google/protobuf/CodedInputStream.java
index 6cece05..87c6837 100644
--- a/java/core/src/main/java/com/google/protobuf/CodedInputStream.java
+++ b/java/core/src/main/java/com/google/protobuf/CodedInputStream.java
@@ -72,6 +72,9 @@
   /** Visible for subclasses. See setSizeLimit() */
   int sizeLimit = DEFAULT_SIZE_LIMIT;
 
+  /** Used to adapt to the experimental {@link Reader} interface. */
+  CodedInputStreamReader wrapper;
+
   /** Create a new CodedInputStream wrapping the given InputStream. */
   public static CodedInputStream newInstance(final InputStream input) {
     return newInstance(input, DEFAULT_BUFFER_SIZE);
@@ -2263,7 +2266,7 @@
         return result;
       }
       // Slow path:  Build a byte array first then copy it.
-      return new String(readRawBytesSlowPath(size), UTF_8);
+      return new String(readRawBytesSlowPath(size, /* ensureNoLeakedReferences= */ false), UTF_8);
     }
 
     @Override
@@ -2287,7 +2290,7 @@
         pos = tempPos + size;
       } else {
         // Slow path:  Build a byte array first then copy it.
-        bytes = readRawBytesSlowPath(size);
+        bytes = readRawBytesSlowPath(size, /* ensureNoLeakedReferences= */ false);
         tempPos = 0;
       }
       return Utf8.decodeUtf8(bytes, tempPos, size);
@@ -2392,7 +2395,8 @@
         return result;
       } else {
         // Slow path: Build a byte array first then copy it.
-        return readRawBytesSlowPath(size);
+        // TODO(dweis): Do we want to protect from malicious input streams here?
+        return readRawBytesSlowPath(size, /* ensureNoLeakedReferences= */ false);
       }
     }
 
@@ -2409,7 +2413,10 @@
         return Internal.EMPTY_BYTE_BUFFER;
       }
       // Slow path: Build a byte array first then copy it.
-      return ByteBuffer.wrap(readRawBytesSlowPath(size));
+      
+      // We must copy as the byte array was handed off to the InputStream and a malicious
+      // implementation could retain a reference.
+      return ByteBuffer.wrap(readRawBytesSlowPath(size, /* ensureNoLeakedReferences= */ true));
     }
 
     @Override
@@ -2812,19 +2819,24 @@
         pos = tempPos + size;
         return Arrays.copyOfRange(buffer, tempPos, tempPos + size);
       } else {
-        return readRawBytesSlowPath(size);
+        // TODO(dweis): Do we want to protect from malicious input streams here?
+        return readRawBytesSlowPath(size, /* ensureNoLeakedReferences= */ false);
       }
     }
 
     /**
      * Exactly like readRawBytes, but caller must have already checked the fast path: (size <=
      * (bufferSize - pos) && size > 0)
+     * 
+     * If ensureNoLeakedReferences is true, the value is guaranteed to have not escaped to
+     * untrusted code.
      */
-    private byte[] readRawBytesSlowPath(final int size) throws IOException {
+    private byte[] readRawBytesSlowPath(
+        final int size, boolean ensureNoLeakedReferences) throws IOException {
       // Attempt to read the data in one byte array when it's safe to do.
       byte[] result = readRawBytesSlowPathOneChunk(size);
       if (result != null) {
-        return result;
+        return ensureNoLeakedReferences ? result.clone() : result;
       }
 
       final int originalBufferPos = pos;
@@ -2862,6 +2874,8 @@
     /**
      * Attempts to read the data in one byte array when it's safe to do. Returns null if the size to
      * read is too large and needs to be allocated in smaller chunks for security reasons.
+     * 
+     * Returns a byte[] that may have escaped to user code via InputStream APIs.
      */
     private byte[] readRawBytesSlowPathOneChunk(final int size) throws IOException {
       if (size == 0) {
@@ -2916,7 +2930,11 @@
       return null;
     }
 
-    /** Reads the remaining data in small chunks from the input stream. */
+    /**
+     * Reads the remaining data in small chunks from the input stream.
+     * 
+     * Returns a byte[] that may have escaped to user code via InputStream APIs.
+     */
     private List<byte[]> readRawBytesSlowPathRemainingChunks(int sizeLeft) throws IOException {
       // The size is very large.  For security reasons, we can't allocate the
       // entire byte array yet.  The size comes directly from the input, so a
@@ -2953,7 +2971,9 @@
     private ByteString readBytesSlowPath(final int size) throws IOException {
       final byte[] result = readRawBytesSlowPathOneChunk(size);
       if (result != null) {
-        return ByteString.wrap(result);
+        // We must copy as the byte array was handed off to the InputStream and a malicious
+        // implementation could retain a reference.
+        return ByteString.copyFrom(result);
       }
 
       final int originalBufferPos = pos;
@@ -2971,13 +2991,20 @@
       // chunks.
       List<byte[]> chunks = readRawBytesSlowPathRemainingChunks(sizeLeft);
 
-      // Wrap the byte arrays into a single ByteString.
-      List<ByteString> byteStrings = new ArrayList<ByteString>(1 + chunks.size());
-      byteStrings.add(ByteString.copyFrom(buffer, originalBufferPos, bufferedBytes));
-      for (byte[] chunk : chunks) {
-        byteStrings.add(ByteString.wrap(chunk));
+      // OK, got everything.  Now concatenate it all into one buffer.
+      final byte[] bytes = new byte[size];
+
+      // Start by copying the leftover bytes from this.buffer.
+      System.arraycopy(buffer, originalBufferPos, bytes, 0, bufferedBytes);
+
+      // And now all the chunks.
+      int tempPos = bufferedBytes;
+      for (final byte[] chunk : chunks) {
+        System.arraycopy(chunk, 0, bytes, tempPos, chunk.length);
+        tempPos += chunk.length;
       }
-      return ByteString.copyFrom(byteStrings);
+      
+      return ByteString.wrap(bytes);
     }
 
     @Override
diff --git a/java/core/src/main/java/com/google/protobuf/CodedInputStreamReader.java b/java/core/src/main/java/com/google/protobuf/CodedInputStreamReader.java
new file mode 100755
index 0000000..7658f62
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/CodedInputStreamReader.java
@@ -0,0 +1,1333 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.WireFormat.FIXED32_SIZE;
+import static com.google.protobuf.WireFormat.FIXED64_SIZE;
+import static com.google.protobuf.WireFormat.WIRETYPE_END_GROUP;
+import static com.google.protobuf.WireFormat.WIRETYPE_FIXED32;
+import static com.google.protobuf.WireFormat.WIRETYPE_FIXED64;
+import static com.google.protobuf.WireFormat.WIRETYPE_LENGTH_DELIMITED;
+import static com.google.protobuf.WireFormat.WIRETYPE_START_GROUP;
+import static com.google.protobuf.WireFormat.WIRETYPE_VARINT;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/** An adapter between the {@link Reader} interface and {@link CodedInputStream}. */
+@ExperimentalApi
+final class CodedInputStreamReader implements Reader {
+  private static final int FIXED32_MULTIPLE_MASK = FIXED32_SIZE - 1;
+  private static final int FIXED64_MULTIPLE_MASK = FIXED64_SIZE - 1;
+  private static final int NEXT_TAG_UNSET = 0;
+
+  private final CodedInputStream input;
+  private int tag;
+  private int endGroupTag;
+  private int nextTag = NEXT_TAG_UNSET;
+
+  public static CodedInputStreamReader forCodedInput(CodedInputStream input) {
+    if (input.wrapper != null) {
+      return input.wrapper;
+    }
+    return new CodedInputStreamReader(input);
+  }
+
+  private CodedInputStreamReader(CodedInputStream input) {
+    this.input = Internal.checkNotNull(input, "input");
+    this.input.wrapper = this;
+  }
+
+  @Override
+  public boolean shouldDiscardUnknownFields() {
+    return input.shouldDiscardUnknownFields();
+  }
+
+  @Override
+  public int getFieldNumber() throws IOException {
+    if (nextTag != NEXT_TAG_UNSET) {
+      tag = nextTag;
+      nextTag = NEXT_TAG_UNSET;
+    } else {
+      tag = input.readTag();
+    }
+    if (tag == 0 || tag == endGroupTag) {
+      return Reader.READ_DONE;
+    }
+    return WireFormat.getTagFieldNumber(tag);
+  }
+
+  @Override
+  public int getTag() {
+    return tag;
+  }
+
+  @Override
+  public boolean skipField() throws IOException {
+    if (input.isAtEnd() || tag == endGroupTag) {
+      return false;
+    }
+    return input.skipField(tag);
+  }
+
+  private void requireWireType(int requiredWireType) throws IOException {
+    if (WireFormat.getTagWireType(tag) != requiredWireType) {
+      throw InvalidProtocolBufferException.invalidWireType();
+    }
+  }
+
+  @Override
+  public double readDouble() throws IOException {
+    requireWireType(WIRETYPE_FIXED64);
+    return input.readDouble();
+  }
+
+  @Override
+  public float readFloat() throws IOException {
+    requireWireType(WIRETYPE_FIXED32);
+    return input.readFloat();
+  }
+
+  @Override
+  public long readUInt64() throws IOException {
+    requireWireType(WIRETYPE_VARINT);
+    return input.readUInt64();
+  }
+
+  @Override
+  public long readInt64() throws IOException {
+    requireWireType(WIRETYPE_VARINT);
+    return input.readInt64();
+  }
+
+  @Override
+  public int readInt32() throws IOException {
+    requireWireType(WIRETYPE_VARINT);
+    return input.readInt32();
+  }
+
+  @Override
+  public long readFixed64() throws IOException {
+    requireWireType(WIRETYPE_FIXED64);
+    return input.readFixed64();
+  }
+
+  @Override
+  public int readFixed32() throws IOException {
+    requireWireType(WIRETYPE_FIXED32);
+    return input.readFixed32();
+  }
+
+  @Override
+  public boolean readBool() throws IOException {
+    requireWireType(WIRETYPE_VARINT);
+    return input.readBool();
+  }
+
+  @Override
+  public String readString() throws IOException {
+    requireWireType(WIRETYPE_LENGTH_DELIMITED);
+    return input.readString();
+  }
+
+  @Override
+  public String readStringRequireUtf8() throws IOException {
+    requireWireType(WIRETYPE_LENGTH_DELIMITED);
+    return input.readStringRequireUtf8();
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <T> T readMessage(Class<T> clazz, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    requireWireType(WIRETYPE_LENGTH_DELIMITED);
+    return readMessage(Protobuf.getInstance().schemaFor(clazz), extensionRegistry);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <T> T readMessageBySchemaWithCheck(
+      Schema<T> schema, ExtensionRegistryLite extensionRegistry) throws IOException {
+    requireWireType(WIRETYPE_LENGTH_DELIMITED);
+    return readMessage(schema, extensionRegistry);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <T> T readGroup(Class<T> clazz, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    requireWireType(WIRETYPE_START_GROUP);
+    return readGroup(Protobuf.getInstance().schemaFor(clazz), extensionRegistry);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <T> T readGroupBySchemaWithCheck(Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    requireWireType(WIRETYPE_START_GROUP);
+    return readGroup(schema, extensionRegistry);
+  }
+
+  // Should have the same semantics of CodedInputStream#readMessage()
+  private <T> T readMessage(Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    int size = input.readUInt32();
+    if (input.recursionDepth >= input.recursionLimit) {
+      throw InvalidProtocolBufferException.recursionLimitExceeded();
+    }
+
+    // Push the new limit.
+    final int prevLimit = input.pushLimit(size);
+    // Allocate and read the message.
+    T message = schema.newInstance();
+    ++input.recursionDepth;
+    schema.mergeFrom(message, this, extensionRegistry);
+    schema.makeImmutable(message);
+    input.checkLastTagWas(0);
+    --input.recursionDepth;
+    // Restore the previous limit.
+    input.popLimit(prevLimit);
+    return message;
+  }
+
+  private <T> T readGroup(Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    int prevEndGroupTag = endGroupTag;
+    endGroupTag = WireFormat.makeTag(WireFormat.getTagFieldNumber(tag), WIRETYPE_END_GROUP);
+
+    try {
+      // Allocate and read the message.
+      T message = schema.newInstance();
+      schema.mergeFrom(message, this, extensionRegistry);
+      schema.makeImmutable(message);
+
+      if (tag != endGroupTag) {
+        throw InvalidProtocolBufferException.parseFailure();
+      }
+      return message;
+    } finally {
+      // Restore the old end group tag.
+      endGroupTag = prevEndGroupTag;
+    }
+  }
+
+  @Override
+  public ByteString readBytes() throws IOException {
+    requireWireType(WIRETYPE_LENGTH_DELIMITED);
+    return input.readBytes();
+  }
+
+  @Override
+  public int readUInt32() throws IOException {
+    requireWireType(WIRETYPE_VARINT);
+    return input.readUInt32();
+  }
+
+  @Override
+  public int readEnum() throws IOException {
+    requireWireType(WIRETYPE_VARINT);
+    return input.readEnum();
+  }
+
+  @Override
+  public int readSFixed32() throws IOException {
+    requireWireType(WIRETYPE_FIXED32);
+    return input.readSFixed32();
+  }
+
+  @Override
+  public long readSFixed64() throws IOException {
+    requireWireType(WIRETYPE_FIXED64);
+    return input.readSFixed64();
+  }
+
+  @Override
+  public int readSInt32() throws IOException {
+    requireWireType(WIRETYPE_VARINT);
+    return input.readSInt32();
+  }
+
+  @Override
+  public long readSInt64() throws IOException {
+    requireWireType(WIRETYPE_VARINT);
+    return input.readSInt64();
+  }
+
+  @Override
+  public void readDoubleList(List<Double> target) throws IOException {
+    if (target instanceof DoubleArrayList) {
+      DoubleArrayList plist = (DoubleArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed64Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addDouble(input.readDouble());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED64:
+          while (true) {
+            plist.addDouble(input.readDouble());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed64Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readDouble());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED64:
+          while (true) {
+            target.add(input.readDouble());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readFloatList(List<Float> target) throws IOException {
+    if (target instanceof FloatArrayList) {
+      FloatArrayList plist = (FloatArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed32Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addFloat(input.readFloat());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED32:
+          while (true) {
+            plist.addFloat(input.readFloat());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed32Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readFloat());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED32:
+          while (true) {
+            target.add(input.readFloat());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readUInt64List(List<Long> target) throws IOException {
+    if (target instanceof LongArrayList) {
+      LongArrayList plist = (LongArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addLong(input.readUInt64());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            plist.addLong(input.readUInt64());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readUInt64());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            target.add(input.readUInt64());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readInt64List(List<Long> target) throws IOException {
+    if (target instanceof LongArrayList) {
+      LongArrayList plist = (LongArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addLong(input.readInt64());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            plist.addLong(input.readInt64());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readInt64());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            target.add(input.readInt64());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readInt32List(List<Integer> target) throws IOException {
+    if (target instanceof IntArrayList) {
+      IntArrayList plist = (IntArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addInt(input.readInt32());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            plist.addInt(input.readInt32());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readInt32());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            target.add(input.readInt32());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readFixed64List(List<Long> target) throws IOException {
+    if (target instanceof LongArrayList) {
+      LongArrayList plist = (LongArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed64Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addLong(input.readFixed64());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED64:
+          while (true) {
+            plist.addLong(input.readFixed64());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed64Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readFixed64());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED64:
+          while (true) {
+            target.add(input.readFixed64());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readFixed32List(List<Integer> target) throws IOException {
+    if (target instanceof IntArrayList) {
+      IntArrayList plist = (IntArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed32Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addInt(input.readFixed32());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED32:
+          while (true) {
+            plist.addInt(input.readFixed32());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed32Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readFixed32());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED32:
+          while (true) {
+            target.add(input.readFixed32());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readBoolList(List<Boolean> target) throws IOException {
+    if (target instanceof BooleanArrayList) {
+      BooleanArrayList plist = (BooleanArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addBoolean(input.readBool());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            plist.addBoolean(input.readBool());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readBool());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            target.add(input.readBool());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readStringList(List<String> target) throws IOException {
+    readStringListInternal(target, false);
+  }
+
+  @Override
+  public void readStringListRequireUtf8(List<String> target) throws IOException {
+    readStringListInternal(target, true);
+  }
+
+  public void readStringListInternal(List<String> target, boolean requireUtf8) throws IOException {
+    if (WireFormat.getTagWireType(tag) != WIRETYPE_LENGTH_DELIMITED) {
+      throw InvalidProtocolBufferException.invalidWireType();
+    }
+
+    if (target instanceof LazyStringList && !requireUtf8) {
+      LazyStringList lazyList = (LazyStringList) target;
+      while (true) {
+        lazyList.add(readBytes());
+        if (input.isAtEnd()) {
+          return;
+        }
+        int nextTag = input.readTag();
+        if (nextTag != tag) {
+          // We've reached the end of the repeated field. Save the next tag value.
+          this.nextTag = nextTag;
+          return;
+        }
+      }
+    } else {
+      while (true) {
+        target.add(requireUtf8 ? readStringRequireUtf8() : readString());
+        if (input.isAtEnd()) {
+          return;
+        }
+        int nextTag = input.readTag();
+        if (nextTag != tag) {
+          // We've reached the end of the repeated field. Save the next tag value.
+          this.nextTag = nextTag;
+          return;
+        }
+      }
+    }
+  }
+
+  @Override
+  public <T> void readMessageList(
+      List<T> target, Class<T> targetType, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    final Schema<T> schema = Protobuf.getInstance().schemaFor(targetType);
+    readMessageList(target, schema, extensionRegistry);
+  }
+
+  @Override
+  public <T> void readMessageList(
+      List<T> target, Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    if (WireFormat.getTagWireType(tag) != WIRETYPE_LENGTH_DELIMITED) {
+      throw InvalidProtocolBufferException.invalidWireType();
+    }
+    final int listTag = tag;
+    while (true) {
+      target.add(readMessage(schema, extensionRegistry));
+      if (input.isAtEnd() || nextTag != NEXT_TAG_UNSET) {
+        return;
+      }
+      int nextTag = input.readTag();
+      if (nextTag != listTag) {
+        // We've reached the end of the repeated field. Save the next tag value.
+        this.nextTag = nextTag;
+        return;
+      }
+    }
+  }
+
+  @Override
+  public <T> void readGroupList(
+      List<T> target, Class<T> targetType, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    final Schema<T> schema = Protobuf.getInstance().schemaFor(targetType);
+    readGroupList(target, schema, extensionRegistry);
+  }
+
+  @Override
+  public <T> void readGroupList(
+      List<T> target, Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    if (WireFormat.getTagWireType(tag) != WIRETYPE_START_GROUP) {
+      throw InvalidProtocolBufferException.invalidWireType();
+    }
+    final int listTag = tag;
+    while (true) {
+      target.add(readGroup(schema, extensionRegistry));
+      if (input.isAtEnd() || nextTag != NEXT_TAG_UNSET) {
+        return;
+      }
+      int nextTag = input.readTag();
+      if (nextTag != listTag) {
+        // We've reached the end of the repeated field. Save the next tag value.
+        this.nextTag = nextTag;
+        return;
+      }
+    }
+  }
+
+  @Override
+  public void readBytesList(List<ByteString> target) throws IOException {
+    if (WireFormat.getTagWireType(tag) != WIRETYPE_LENGTH_DELIMITED) {
+      throw InvalidProtocolBufferException.invalidWireType();
+    }
+
+    while (true) {
+      target.add(readBytes());
+      if (input.isAtEnd()) {
+        return;
+      }
+      int nextTag = input.readTag();
+      if (nextTag != tag) {
+        // We've reached the end of the repeated field. Save the next tag value.
+        this.nextTag = nextTag;
+        return;
+      }
+    }
+  }
+
+  @Override
+  public void readUInt32List(List<Integer> target) throws IOException {
+    if (target instanceof IntArrayList) {
+      IntArrayList plist = (IntArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addInt(input.readUInt32());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            plist.addInt(input.readUInt32());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readUInt32());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            target.add(input.readUInt32());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readEnumList(List<Integer> target) throws IOException {
+    if (target instanceof IntArrayList) {
+      IntArrayList plist = (IntArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addInt(input.readEnum());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            plist.addInt(input.readEnum());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readEnum());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            target.add(input.readEnum());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readSFixed32List(List<Integer> target) throws IOException {
+    if (target instanceof IntArrayList) {
+      IntArrayList plist = (IntArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed32Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addInt(input.readSFixed32());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED32:
+          while (true) {
+            plist.addInt(input.readSFixed32());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed32Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readSFixed32());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED32:
+          while (true) {
+            target.add(input.readSFixed32());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readSFixed64List(List<Long> target) throws IOException {
+    if (target instanceof LongArrayList) {
+      LongArrayList plist = (LongArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed64Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addLong(input.readSFixed64());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED64:
+          while (true) {
+            plist.addLong(input.readSFixed64());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          verifyPackedFixed64Length(bytes);
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readSFixed64());
+          } while (input.getTotalBytesRead() < endPos);
+          break;
+        case WIRETYPE_FIXED64:
+          while (true) {
+            target.add(input.readSFixed64());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readSInt32List(List<Integer> target) throws IOException {
+    if (target instanceof IntArrayList) {
+      IntArrayList plist = (IntArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addInt(input.readSInt32());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            plist.addInt(input.readSInt32());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readSInt32());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            target.add(input.readSInt32());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  @Override
+  public void readSInt64List(List<Long> target) throws IOException {
+    if (target instanceof LongArrayList) {
+      LongArrayList plist = (LongArrayList) target;
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            plist.addLong(input.readSInt64());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            plist.addLong(input.readSInt64());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    } else {
+      switch (WireFormat.getTagWireType(tag)) {
+        case WIRETYPE_LENGTH_DELIMITED:
+          final int bytes = input.readUInt32();
+          int endPos = input.getTotalBytesRead() + bytes;
+          do {
+            target.add(input.readSInt64());
+          } while (input.getTotalBytesRead() < endPos);
+          requirePosition(endPos);
+          break;
+        case WIRETYPE_VARINT:
+          while (true) {
+            target.add(input.readSInt64());
+            if (input.isAtEnd()) {
+              return;
+            }
+            int nextTag = input.readTag();
+            if (nextTag != tag) {
+              // We've reached the end of the repeated field. Save the next tag value.
+              this.nextTag = nextTag;
+              return;
+            }
+          }
+        default:
+          throw InvalidProtocolBufferException.invalidWireType();
+      }
+    }
+  }
+
+  private void verifyPackedFixed64Length(int bytes) throws IOException {
+    if ((bytes & FIXED64_MULTIPLE_MASK) != 0) {
+      // Require that the number of bytes be a multiple of 8.
+      throw InvalidProtocolBufferException.parseFailure();
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <K, V> void readMap(
+      Map<K, V> target,
+      MapEntryLite.Metadata<K, V> metadata,
+      ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    requireWireType(WIRETYPE_LENGTH_DELIMITED);
+    int size = input.readUInt32();
+    final int prevLimit = input.pushLimit(size);
+    K key = metadata.defaultKey;
+    V value = metadata.defaultValue;
+    try {
+      while (true) {
+        int number = getFieldNumber();
+        if (number == READ_DONE || input.isAtEnd()) {
+          break;
+        }
+        try {
+          switch (number) {
+            case 1:
+              key = (K) readField(metadata.keyType, null, null);
+              break;
+            case 2:
+              value =
+                  (V)
+                      readField(
+                          metadata.valueType, metadata.defaultValue.getClass(), extensionRegistry);
+              break;
+            default:
+              if (!skipField()) {
+                throw new InvalidProtocolBufferException("Unable to parse map entry.");
+              }
+              break;
+          }
+        } catch (InvalidProtocolBufferException.InvalidWireTypeException ignore) {
+          // the type doesn't match, skip the field.
+          if (!skipField()) {
+            throw new InvalidProtocolBufferException("Unable to parse map entry.");
+          }
+        }
+      }
+      target.put(key, value);
+    } finally {
+      // Restore the previous limit.
+      input.popLimit(prevLimit);
+    }
+  }
+
+  private Object readField(
+      WireFormat.FieldType fieldType, Class<?> messageType, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    switch (fieldType) {
+      case BOOL:
+        return readBool();
+      case BYTES:
+        return readBytes();
+      case DOUBLE:
+        return readDouble();
+      case ENUM:
+        return readEnum();
+      case FIXED32:
+        return readFixed32();
+      case FIXED64:
+        return readFixed64();
+      case FLOAT:
+        return readFloat();
+      case INT32:
+        return readInt32();
+      case INT64:
+        return readInt64();
+      case MESSAGE:
+        return readMessage(messageType, extensionRegistry);
+      case SFIXED32:
+        return readSFixed32();
+      case SFIXED64:
+        return readSFixed64();
+      case SINT32:
+        return readSInt32();
+      case SINT64:
+        return readSInt64();
+      case STRING:
+        return readStringRequireUtf8();
+      case UINT32:
+        return readUInt32();
+      case UINT64:
+        return readUInt64();
+      default:
+        throw new RuntimeException("unsupported field type.");
+    }
+  }
+
+  private void verifyPackedFixed32Length(int bytes) throws IOException {
+    if ((bytes & FIXED32_MULTIPLE_MASK) != 0) {
+      // Require that the number of bytes be a multiple of 4.
+      throw InvalidProtocolBufferException.parseFailure();
+    }
+  }
+
+  private void requirePosition(int expectedPosition) throws IOException {
+    if (input.getTotalBytesRead() != expectedPosition) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/CodedOutputStream.java b/java/core/src/main/java/com/google/protobuf/CodedOutputStream.java
index 3823f81..a9192d3 100644
--- a/java/core/src/main/java/com/google/protobuf/CodedOutputStream.java
+++ b/java/core/src/main/java/com/google/protobuf/CodedOutputStream.java
@@ -60,6 +60,9 @@
   private static final Logger logger = Logger.getLogger(CodedOutputStream.class.getName());
   private static final boolean HAS_UNSAFE_ARRAY_OPERATIONS = UnsafeUtil.hasUnsafeArrayOperations();
 
+  /** Used to adapt to the experimental {@link Writer} interface. */
+  CodedOutputStreamWriter wrapper;
+
   /** @deprecated Use {@link #computeFixed32SizeNoTag(int)} instead. */
   @Deprecated public static final int LITTLE_ENDIAN_32_SIZE = FIXED32_SIZE;
 
@@ -361,6 +364,10 @@
   public abstract void writeMessage(final int fieldNumber, final MessageLite value)
       throws IOException;
 
+  /** Write an embedded message field, including tag, to the stream. */
+  // Abstract to avoid overhead of additional virtual method calls.
+  abstract void writeMessage(final int fieldNumber, final MessageLite value, Schema schema)
+      throws IOException;
 
   /**
    * Write a MessageSet extension field to the stream. For historical reasons, the wire format
@@ -466,6 +473,9 @@
   // Abstract to avoid overhead of additional virtual method calls.
   public abstract void writeMessageNoTag(final MessageLite value) throws IOException;
 
+  /** Write an embedded message field to the stream. */
+  // Abstract to avoid overhead of additional virtual method calls.
+  abstract void writeMessageNoTag(final MessageLite value, Schema schema) throws IOException;
 
   // =================================================================
 
@@ -651,6 +661,14 @@
     return computeTagSize(fieldNumber) + computeMessageSizeNoTag(value);
   }
 
+  /**
+   * Compute the number of bytes that would be needed to encode an embedded message field, including
+   * tag.
+   */
+  static int computeMessageSize(
+      final int fieldNumber, final MessageLite value, final Schema schema) {
+    return computeTagSize(fieldNumber) + computeMessageSizeNoTag(value, schema);
+  }
 
   /**
    * Compute the number of bytes that would be needed to encode a MessageSet extension to the
@@ -859,6 +877,10 @@
     return computeLengthDelimitedFieldSize(value.getSerializedSize());
   }
 
+  /** Compute the number of bytes that would be needed to encode an embedded message field. */
+  static int computeMessageSizeNoTag(final MessageLite value, final Schema schema) {
+    return computeLengthDelimitedFieldSize(((AbstractMessageLite) value).getSerializedSize(schema));
+  }
 
   static int computeLengthDelimitedFieldSize(int fieldLength) {
     return computeUInt32SizeNoTag(fieldLength) + fieldLength;
@@ -993,6 +1015,18 @@
     writeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP);
   }
 
+  /**
+   * Write a {@code group} field, including tag, to the stream.
+   *
+   * @deprecated groups are deprecated.
+   */
+  @Deprecated
+  final void writeGroup(final int fieldNumber, final MessageLite value, Schema schema)
+      throws IOException {
+    writeTag(fieldNumber, WireFormat.WIRETYPE_START_GROUP);
+    writeGroupNoTag(value, schema);
+    writeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP);
+  }
 
   /**
    * Write a {@code group} field to the stream.
@@ -1004,6 +1038,15 @@
     value.writeTo(this);
   }
 
+  /**
+   * Write a {@code group} field to the stream.
+   *
+   * @deprecated groups are deprecated.
+   */
+  @Deprecated
+  final void writeGroupNoTag(final MessageLite value, Schema schema) throws IOException {
+    schema.writeTo(value, wrapper);
+  }
 
   /**
    * Compute the number of bytes that would be needed to encode a {@code group} field, including
@@ -1016,6 +1059,16 @@
     return computeTagSize(fieldNumber) * 2 + computeGroupSizeNoTag(value);
   }
 
+  /**
+   * Compute the number of bytes that would be needed to encode a {@code group} field, including
+   * tag.
+   *
+   * @deprecated groups are deprecated.
+   */
+  @Deprecated
+  static int computeGroupSize(final int fieldNumber, final MessageLite value, Schema schema) {
+    return computeTagSize(fieldNumber) * 2 + computeGroupSizeNoTag(value, schema);
+  }
 
   /** Compute the number of bytes that would be needed to encode a {@code group} field. */
   @Deprecated
@@ -1023,6 +1076,11 @@
     return value.getSerializedSize();
   }
 
+  /** Compute the number of bytes that would be needed to encode a {@code group} field. */
+  @Deprecated
+  static int computeGroupSizeNoTag(final MessageLite value, Schema schema) {
+    return ((AbstractMessageLite) value).getSerializedSize(schema);
+  }
 
   /**
    * Encode and write a varint. {@code value} is treated as unsigned, so it won't be sign-extended
@@ -1216,6 +1274,13 @@
       writeMessageNoTag(value);
     }
 
+    @Override
+    final void writeMessage(final int fieldNumber, final MessageLite value, Schema schema)
+        throws IOException {
+      writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
+      writeUInt32NoTag(((AbstractMessageLite) value).getSerializedSize(schema));
+      schema.writeTo(value, wrapper);
+    }
 
     @Override
     public final void writeMessageSetExtension(final int fieldNumber, final MessageLite value)
@@ -1241,6 +1306,11 @@
       value.writeTo(this);
     }
 
+    @Override
+    final void writeMessageNoTag(final MessageLite value, Schema schema) throws IOException {
+      writeUInt32NoTag(((AbstractMessageLite) value).getSerializedSize(schema));
+      schema.writeTo(value, wrapper);
+    }
 
     @Override
     public final void write(byte value) throws IOException {
@@ -1571,6 +1641,12 @@
       writeMessageNoTag(value);
     }
 
+    @Override
+    void writeMessage(final int fieldNumber, final MessageLite value, Schema schema)
+        throws IOException {
+      writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
+      writeMessageNoTag(value, schema);
+    }
 
     @Override
     public void writeMessageSetExtension(final int fieldNumber, final MessageLite value)
@@ -1596,6 +1672,11 @@
       value.writeTo(this);
     }
 
+    @Override
+    void writeMessageNoTag(final MessageLite value, Schema schema) throws IOException {
+      writeUInt32NoTag(((AbstractMessageLite) value).getSerializedSize(schema));
+      schema.writeTo(value, wrapper);
+    }
 
     @Override
     public void write(byte value) throws IOException {
@@ -1893,6 +1974,11 @@
       writeMessageNoTag(value);
     }
 
+    @Override
+    void writeMessage(int fieldNumber, MessageLite value, Schema schema) throws IOException {
+      writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
+      writeMessageNoTag(value, schema);
+    }
 
     @Override
     public void writeMessageSetExtension(int fieldNumber, MessageLite value) throws IOException {
@@ -1916,6 +2002,11 @@
       value.writeTo(this);
     }
 
+    @Override
+    void writeMessageNoTag(MessageLite value, Schema schema) throws IOException {
+      writeUInt32NoTag(((AbstractMessageLite) value).getSerializedSize(schema));
+      schema.writeTo(value, wrapper);
+    }
 
     @Override
     public void write(byte value) throws IOException {
@@ -2419,6 +2510,12 @@
       writeMessageNoTag(value);
     }
 
+    @Override
+    void writeMessage(final int fieldNumber, final MessageLite value, Schema schema)
+        throws IOException {
+      writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
+      writeMessageNoTag(value, schema);
+    }
 
     @Override
     public void writeMessageSetExtension(final int fieldNumber, final MessageLite value)
@@ -2444,6 +2541,11 @@
       value.writeTo(this);
     }
 
+    @Override
+    void writeMessageNoTag(final MessageLite value, Schema schema) throws IOException {
+      writeUInt32NoTag(((AbstractMessageLite) value).getSerializedSize(schema));
+      schema.writeTo(value, wrapper);
+    }
 
     @Override
     public void write(byte value) throws IOException {
@@ -2722,6 +2824,12 @@
       writeMessageNoTag(value);
     }
 
+    @Override
+    void writeMessage(final int fieldNumber, final MessageLite value, Schema schema)
+        throws IOException {
+      writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED);
+      writeMessageNoTag(value, schema);
+    }
 
     @Override
     public void writeMessageSetExtension(final int fieldNumber, final MessageLite value)
@@ -2747,6 +2855,11 @@
       value.writeTo(this);
     }
 
+    @Override
+    void writeMessageNoTag(final MessageLite value, Schema schema) throws IOException {
+      writeUInt32NoTag(((AbstractMessageLite) value).getSerializedSize(schema));
+      schema.writeTo(value, wrapper);
+    }
 
     @Override
     public void write(byte value) throws IOException {
diff --git a/java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java b/java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java
new file mode 100755
index 0000000..0d1983c
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java
@@ -0,0 +1,691 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.Internal.checkNotNull;
+import static com.google.protobuf.WireFormat.WIRETYPE_LENGTH_DELIMITED;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/** An adapter between the {@link Writer} interface and {@link CodedOutputStream}. */
+@ExperimentalApi
+final class CodedOutputStreamWriter implements Writer {
+  private final CodedOutputStream output;
+
+  public static CodedOutputStreamWriter forCodedOutput(CodedOutputStream output) {
+    if (output.wrapper != null) {
+      return output.wrapper;
+    }
+    return new CodedOutputStreamWriter(output);
+  }
+
+  private CodedOutputStreamWriter(CodedOutputStream output) {
+    this.output = checkNotNull(output, "output");
+    this.output.wrapper = this;
+  }
+
+  @Override
+  public FieldOrder fieldOrder() {
+    return FieldOrder.ASCENDING;
+  }
+
+  public int getTotalBytesWritten() {
+    return output.getTotalBytesWritten();
+  }
+
+  @Override
+  public void writeSFixed32(int fieldNumber, int value) throws IOException {
+    output.writeSFixed32(fieldNumber, value);
+  }
+
+  @Override
+  public void writeInt64(int fieldNumber, long value) throws IOException {
+    output.writeInt64(fieldNumber, value);
+  }
+
+  @Override
+  public void writeSFixed64(int fieldNumber, long value) throws IOException {
+    output.writeSFixed64(fieldNumber, value);
+  }
+
+  @Override
+  public void writeFloat(int fieldNumber, float value) throws IOException {
+    output.writeFloat(fieldNumber, value);
+  }
+
+  @Override
+  public void writeDouble(int fieldNumber, double value) throws IOException {
+    output.writeDouble(fieldNumber, value);
+  }
+
+  @Override
+  public void writeEnum(int fieldNumber, int value) throws IOException {
+    output.writeEnum(fieldNumber, value);
+  }
+
+  @Override
+  public void writeUInt64(int fieldNumber, long value) throws IOException {
+    output.writeUInt64(fieldNumber, value);
+  }
+
+  @Override
+  public void writeInt32(int fieldNumber, int value) throws IOException {
+    output.writeInt32(fieldNumber, value);
+  }
+
+  @Override
+  public void writeFixed64(int fieldNumber, long value) throws IOException {
+    output.writeFixed64(fieldNumber, value);
+  }
+
+  @Override
+  public void writeFixed32(int fieldNumber, int value) throws IOException {
+    output.writeFixed32(fieldNumber, value);
+  }
+
+  @Override
+  public void writeBool(int fieldNumber, boolean value) throws IOException {
+    output.writeBool(fieldNumber, value);
+  }
+
+  @Override
+  public void writeString(int fieldNumber, String value) throws IOException {
+    output.writeString(fieldNumber, value);
+  }
+
+  @Override
+  public void writeBytes(int fieldNumber, ByteString value) throws IOException {
+    output.writeBytes(fieldNumber, value);
+  }
+
+  @Override
+  public void writeUInt32(int fieldNumber, int value) throws IOException {
+    output.writeUInt32(fieldNumber, value);
+  }
+
+  @Override
+  public void writeSInt32(int fieldNumber, int value) throws IOException {
+    output.writeSInt32(fieldNumber, value);
+  }
+
+  @Override
+  public void writeSInt64(int fieldNumber, long value) throws IOException {
+    output.writeSInt64(fieldNumber, value);
+  }
+
+  @Override
+  public void writeMessage(int fieldNumber, Object value) throws IOException {
+    output.writeMessage(fieldNumber, (MessageLite) value);
+  }
+
+  @Override
+  public void writeMessage(int fieldNumber, Object value, Schema schema) throws IOException {
+    output.writeMessage(fieldNumber, (MessageLite) value, schema);
+  }
+
+  @Override
+  public void writeGroup(int fieldNumber, Object value) throws IOException {
+    output.writeGroup(fieldNumber, (MessageLite) value);
+  }
+
+  @Override
+  public void writeGroup(int fieldNumber, Object value, Schema schema) throws IOException {
+    output.writeGroup(fieldNumber, (MessageLite) value, schema);
+  }
+
+  @Override
+  public void writeStartGroup(int fieldNumber) throws IOException {
+    output.writeTag(fieldNumber, WireFormat.WIRETYPE_START_GROUP);
+  }
+
+  @Override
+  public void writeEndGroup(int fieldNumber) throws IOException {
+    output.writeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP);
+  }
+
+  @Override
+  public final void writeMessageSetItem(int fieldNumber, Object value) throws IOException {
+    if (value instanceof ByteString) {
+      output.writeRawMessageSetExtension(fieldNumber, (ByteString) value);
+    } else {
+      output.writeMessageSetExtension(fieldNumber, (MessageLite) value);
+    }
+  }
+
+  @Override
+  public void writeInt32List(int fieldNumber, List<Integer> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeInt32SizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeInt32NoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeInt32(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeFixed32List(int fieldNumber, List<Integer> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeFixed32SizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeFixed32NoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeFixed32(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeInt64List(int fieldNumber, List<Long> value, boolean packed) throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeInt64SizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeInt64NoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeInt64(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeUInt64List(int fieldNumber, List<Long> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeUInt64SizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeUInt64NoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeUInt64(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeFixed64List(int fieldNumber, List<Long> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeFixed64SizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeFixed64NoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeFixed64(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeFloatList(int fieldNumber, List<Float> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeFloatSizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeFloatNoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeFloat(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeDoubleList(int fieldNumber, List<Double> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeDoubleSizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeDoubleNoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeDouble(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeEnumList(int fieldNumber, List<Integer> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeEnumSizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeEnumNoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeEnum(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeBoolList(int fieldNumber, List<Boolean> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeBoolSizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeBoolNoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeBool(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeStringList(int fieldNumber, List<String> value) throws IOException {
+    if (value instanceof LazyStringList) {
+      final LazyStringList lazyList = (LazyStringList) value;
+      for (int i = 0; i < value.size(); ++i) {
+        writeLazyString(fieldNumber, lazyList.getRaw(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeString(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  private void writeLazyString(int fieldNumber, Object value) throws IOException {
+    if (value instanceof String) {
+      output.writeString(fieldNumber, (String) value);
+    } else {
+      output.writeBytes(fieldNumber, (ByteString) value);
+    }
+  }
+
+  @Override
+  public void writeBytesList(int fieldNumber, List<ByteString> value) throws IOException {
+    for (int i = 0; i < value.size(); ++i) {
+      output.writeBytes(fieldNumber, value.get(i));
+    }
+  }
+
+  @Override
+  public void writeUInt32List(int fieldNumber, List<Integer> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeUInt32SizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeUInt32NoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeUInt32(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeSFixed32List(int fieldNumber, List<Integer> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeSFixed32SizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeSFixed32NoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeSFixed32(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeSFixed64List(int fieldNumber, List<Long> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeSFixed64SizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeSFixed64NoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeSFixed64(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeSInt32List(int fieldNumber, List<Integer> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeSInt32SizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeSInt32NoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeSInt32(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeSInt64List(int fieldNumber, List<Long> value, boolean packed)
+      throws IOException {
+    if (packed) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+
+      // Compute and write the length of the data.
+      int dataSize = 0;
+      for (int i = 0; i < value.size(); ++i) {
+        dataSize += CodedOutputStream.computeSInt64SizeNoTag(value.get(i));
+      }
+      output.writeUInt32NoTag(dataSize);
+
+      // Write the data itself, without any tags.
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeSInt64NoTag(value.get(i));
+      }
+    } else {
+      for (int i = 0; i < value.size(); ++i) {
+        output.writeSInt64(fieldNumber, value.get(i));
+      }
+    }
+  }
+
+  @Override
+  public void writeMessageList(int fieldNumber, List<?> value) throws IOException {
+    for (int i = 0; i < value.size(); ++i) {
+      writeMessage(fieldNumber, value.get(i));
+    }
+  }
+
+  @Override
+  public void writeMessageList(int fieldNumber, List<?> value, Schema schema) throws IOException {
+    for (int i = 0; i < value.size(); ++i) {
+      writeMessage(fieldNumber, value.get(i), schema);
+    }
+  }
+
+  @Override
+  public void writeGroupList(int fieldNumber, List<?> value) throws IOException {
+    for (int i = 0; i < value.size(); ++i) {
+      writeGroup(fieldNumber, value.get(i));
+    }
+  }
+
+  @Override
+  public void writeGroupList(int fieldNumber, List<?> value, Schema schema) throws IOException {
+    for (int i = 0; i < value.size(); ++i) {
+      writeGroup(fieldNumber, value.get(i), schema);
+    }
+  }
+
+  @Override
+  public <K, V> void writeMap(int fieldNumber, MapEntryLite.Metadata<K, V> metadata, Map<K, V> map)
+      throws IOException {
+    if (output.isSerializationDeterministic()) {
+      writeDeterministicMap(fieldNumber, metadata, map);
+      return;
+    }
+    for (Map.Entry<K, V> entry : map.entrySet()) {
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+      output.writeUInt32NoTag(
+          MapEntryLite.computeSerializedSize(metadata, entry.getKey(), entry.getValue()));
+      MapEntryLite.writeTo(output, metadata, entry.getKey(), entry.getValue());
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private <K, V> void writeDeterministicMap(
+      int fieldNumber, MapEntryLite.Metadata<K, V> metadata, Map<K, V> map) throws IOException {
+    switch (metadata.keyType) {
+      case BOOL:
+        V value;
+        if ((value = map.get(Boolean.FALSE)) != null) {
+          writeDeterministicBooleanMapEntry(
+              fieldNumber, /* key= */ false, value, (MapEntryLite.Metadata<Boolean, V>) metadata);
+        }
+        if ((value = map.get(Boolean.TRUE)) != null) {
+          writeDeterministicBooleanMapEntry(
+              fieldNumber, /* key= */ true, value, (MapEntryLite.Metadata<Boolean, V>) metadata);
+        }
+        break;
+      case FIXED32:
+      case INT32:
+      case SFIXED32:
+      case SINT32:
+      case UINT32:
+        writeDeterministicIntegerMap(
+            fieldNumber, (MapEntryLite.Metadata<Integer, V>) metadata, (Map<Integer, V>) map);
+        break;
+      case FIXED64:
+      case INT64:
+      case SFIXED64:
+      case SINT64:
+      case UINT64:
+        writeDeterministicLongMap(
+            fieldNumber, (MapEntryLite.Metadata<Long, V>) metadata, (Map<Long, V>) map);
+        break;
+      case STRING:
+        writeDeterministicStringMap(
+            fieldNumber, (MapEntryLite.Metadata<String, V>) metadata, (Map<String, V>) map);
+        break;
+      default:
+        throw new IllegalArgumentException("does not support key type: " + metadata.keyType);
+    }
+  }
+
+  private <V> void writeDeterministicBooleanMapEntry(
+      int fieldNumber, boolean key, V value, MapEntryLite.Metadata<Boolean, V> metadata)
+      throws IOException {
+    output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+    output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
+    MapEntryLite.writeTo(output, metadata, key, value);
+  }
+
+  private <V> void writeDeterministicIntegerMap(
+      int fieldNumber, MapEntryLite.Metadata<Integer, V> metadata, Map<Integer, V> map)
+      throws IOException {
+    int[] keys = new int[map.size()];
+    int index = 0;
+    for (int k : map.keySet()) {
+      keys[index++] = k;
+    }
+    Arrays.sort(keys);
+    for (int key : keys) {
+      V value = map.get(key);
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+      output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
+      MapEntryLite.writeTo(output, metadata, key, value);
+    }
+  }
+
+  private <V> void writeDeterministicLongMap(
+      int fieldNumber, MapEntryLite.Metadata<Long, V> metadata, Map<Long, V> map)
+      throws IOException {
+    long[] keys = new long[map.size()];
+    int index = 0;
+    for (long k : map.keySet()) {
+      keys[index++] = k;
+    }
+    Arrays.sort(keys);
+    for (long key : keys) {
+      V value = map.get(key);
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+      output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
+      MapEntryLite.writeTo(output, metadata, key, value);
+    }
+  }
+
+  private <V> void writeDeterministicStringMap(
+      int fieldNumber, MapEntryLite.Metadata<String, V> metadata, Map<String, V> map)
+      throws IOException {
+    String[] keys = new String[map.size()];
+    int index = 0;
+    for (String k : map.keySet()) {
+      keys[index++] = k;
+    }
+    Arrays.sort(keys);
+    for (String key : keys) {
+      V value = map.get(key);
+      output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
+      output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
+      MapEntryLite.writeTo(output, metadata, key, value);
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/DescriptorMessageInfoFactory.java b/java/core/src/main/java/com/google/protobuf/DescriptorMessageInfoFactory.java
new file mode 100755
index 0000000..7975136
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/DescriptorMessageInfoFactory.java
@@ -0,0 +1,690 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.FieldInfo.forField;
+import static com.google.protobuf.FieldInfo.forFieldWithEnumVerifier;
+import static com.google.protobuf.FieldInfo.forMapField;
+import static com.google.protobuf.FieldInfo.forOneofMemberField;
+import static com.google.protobuf.FieldInfo.forPackedField;
+import static com.google.protobuf.FieldInfo.forPackedFieldWithEnumVerifier;
+import static com.google.protobuf.FieldInfo.forProto2OptionalField;
+import static com.google.protobuf.FieldInfo.forProto2RequiredField;
+import static com.google.protobuf.FieldInfo.forRepeatedMessageField;
+
+import com.google.protobuf.Descriptors.Descriptor;
+import com.google.protobuf.Descriptors.FieldDescriptor;
+import com.google.protobuf.Descriptors.FieldDescriptor.Type;
+import com.google.protobuf.Descriptors.OneofDescriptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+import java.util.concurrent.ConcurrentHashMap;
+
+/** A factory for message info based on protobuf descriptors for a {@link GeneratedMessageV3}. */
+@ExperimentalApi
+final class DescriptorMessageInfoFactory implements MessageInfoFactory {
+  private static final String GET_DEFAULT_INSTANCE_METHOD_NAME = "getDefaultInstance";
+  private static final DescriptorMessageInfoFactory instance = new DescriptorMessageInfoFactory();
+  private static final Set<String> specialFieldNames =
+      new HashSet<>(Arrays.asList("cached_size", "serialized_size", "class"));
+
+  // Disallow construction - it's a singleton.
+  private DescriptorMessageInfoFactory() {}
+
+  public static DescriptorMessageInfoFactory getInstance() {
+    return instance;
+  }
+
+  @Override
+  public boolean isSupported(Class<?> messageType) {
+    return GeneratedMessageV3.class.isAssignableFrom(messageType);
+  }
+
+  @Override
+  public MessageInfo messageInfoFor(Class<?> messageType) {
+    if (!GeneratedMessageV3.class.isAssignableFrom(messageType)) {
+      throw new IllegalArgumentException("Unsupported message type: " + messageType.getName());
+    }
+
+    return convert(messageType, descriptorForType(messageType));
+  }
+
+  private static Message getDefaultInstance(Class<?> messageType) {
+    try {
+      Method method = messageType.getDeclaredMethod(GET_DEFAULT_INSTANCE_METHOD_NAME);
+      return (Message) method.invoke(null);
+    } catch (Exception e) {
+      throw new IllegalArgumentException(
+          "Unable to get default instance for message class " + messageType.getName(), e);
+    }
+  }
+
+  private static Descriptor descriptorForType(Class<?> messageType) {
+    return getDefaultInstance(messageType).getDescriptorForType();
+  }
+
+  private static MessageInfo convert(Class<?> messageType, Descriptor messageDescriptor) {
+    switch (messageDescriptor.getFile().getSyntax()) {
+      case PROTO2:
+        return convertProto2(messageType, messageDescriptor);
+      case PROTO3:
+        return convertProto3(messageType, messageDescriptor);
+      default:
+        throw new IllegalArgumentException(
+            "Unsupported syntax: " + messageDescriptor.getFile().getSyntax());
+    }
+  }
+
+  /**
+   * A helper class to determine whether a message type needs to implement {@code isInitialized()}.
+   *
+   * <p>If a message type doesn't have any required fields or extensions (directly and
+   * transitively), it doesn't need to implement isInitialized() and can always return true there.
+   * It's a bit tricky to determine whether a type has transitive required fields because protobuf
+   * allows cycle references within the same .proto file (e.g., message Foo has a Bar field, and
+   * message Bar has a Foo field). For that we use Tarjan's strongly connected components algorithm
+   * to classify messages into strongly connected groups. Messages in the same group are
+   * transitively including each other, so they should either all have transitive required fields
+   * (or extensions), or none have.
+   *
+   * <p>This class is thread-safe.
+   */
+  static class IsInitializedCheckAnalyzer {
+
+    private final Map<Descriptor, Boolean> resultCache =
+        new ConcurrentHashMap<Descriptor, Boolean>();
+
+    // The following data members are part of Tarjan's SCC algorithm. See:
+    //   https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
+    private int index = 0;
+    private final Stack<Node> stack = new Stack<Node>();
+    private final Map<Descriptor, Node> nodeCache = new HashMap<Descriptor, Node>();
+
+    public boolean needsIsInitializedCheck(Descriptor descriptor) {
+      Boolean cachedValue = resultCache.get(descriptor);
+      if (cachedValue != null) {
+        return cachedValue;
+      }
+      synchronized (this) {
+        // Double-check the cache because some other thread may have updated it while we
+        // were acquiring the lock.
+        cachedValue = resultCache.get(descriptor);
+        if (cachedValue != null) {
+          return cachedValue;
+        }
+        return dfs(descriptor).component.needsIsInitializedCheck;
+      }
+    }
+
+    private static class Node {
+      final Descriptor descriptor;
+      final int index;
+      int lowLink;
+      StronglyConnectedComponent component; // null if the node is still on stack.
+
+      Node(Descriptor descriptor, int index) {
+        this.descriptor = descriptor;
+        this.index = index;
+        this.lowLink = index;
+        this.component = null;
+      }
+    }
+
+    private static class StronglyConnectedComponent {
+      final List<Descriptor> messages = new ArrayList<Descriptor>();
+      boolean needsIsInitializedCheck = false;
+    }
+
+    private Node dfs(Descriptor descriptor) {
+      Node result = new Node(descriptor, index++);
+      stack.push(result);
+      nodeCache.put(descriptor, result);
+
+      // Recurse the fields / nodes in graph
+      for (FieldDescriptor field : descriptor.getFields()) {
+        if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+          Node child = nodeCache.get(field.getMessageType());
+          if (child == null) {
+            // Unexplored node
+            child = dfs(field.getMessageType());
+            result.lowLink = Math.min(result.lowLink, child.lowLink);
+          } else {
+            if (child.component == null) {
+              // Still in the stack so we found a back edge.
+              result.lowLink = Math.min(result.lowLink, child.lowLink);
+            }
+          }
+        }
+      }
+
+      if (result.index == result.lowLink) {
+        // This is the root of a strongly connected component.
+        StronglyConnectedComponent component = new StronglyConnectedComponent();
+        while (true) {
+          Node node = stack.pop();
+          node.component = component;
+          component.messages.add(node.descriptor);
+          if (node == result) {
+            break;
+          }
+        }
+
+        analyze(component);
+      }
+
+      return result;
+    }
+
+    // Determine whether messages in this SCC needs isInitialized check.
+    private void analyze(StronglyConnectedComponent component) {
+      boolean needsIsInitializedCheck = false;
+      loop:
+      for (Descriptor descriptor : component.messages) {
+        if (descriptor.isExtendable()) {
+          needsIsInitializedCheck = true;
+          break;
+        }
+
+        for (FieldDescriptor field : descriptor.getFields()) {
+          if (field.isRequired()) {
+            needsIsInitializedCheck = true;
+            break loop;
+          }
+
+          if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+            // Since we are analyzing the graph bottom-up, all referenced fields should either be
+            // in this same component or in a different already-analyzed component.
+            Node node = nodeCache.get(field.getMessageType());
+            if (node.component != component) {
+              if (node.component.needsIsInitializedCheck) {
+                needsIsInitializedCheck = true;
+                break loop;
+              }
+            }
+          }
+        }
+      }
+
+      component.needsIsInitializedCheck = needsIsInitializedCheck;
+
+      for (Descriptor descriptor : component.messages) {
+        resultCache.put(descriptor, component.needsIsInitializedCheck);
+      }
+    }
+  }
+
+  private static IsInitializedCheckAnalyzer isInitializedCheckAnalyzer =
+      new IsInitializedCheckAnalyzer();
+
+  private static boolean needsIsInitializedCheck(Descriptor descriptor) {
+    return isInitializedCheckAnalyzer.needsIsInitializedCheck(descriptor);
+  }
+
+  private static StructuralMessageInfo convertProto2(
+      Class<?> messageType, Descriptor messageDescriptor) {
+    List<FieldDescriptor> fieldDescriptors = messageDescriptor.getFields();
+    StructuralMessageInfo.Builder builder =
+        StructuralMessageInfo.newBuilder(fieldDescriptors.size());
+    builder.withDefaultInstance(getDefaultInstance(messageType));
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    builder.withMessageSetWireFormat(messageDescriptor.getOptions().getMessageSetWireFormat());
+
+    OneofState oneofState = new OneofState();
+    int bitFieldIndex = 0;
+    int presenceMask = 1;
+    Field bitField = null;
+
+    // Fields in the descriptor are ordered by the index position in which they appear in the
+    // proto file. This is the same order used to determine the presence mask used in the
+    // bitFields. So to determine the appropriate presence mask to be used for a field, we simply
+    // need to shift the presence mask whenever a presence-checked field is encountered.
+    for (int i = 0; i < fieldDescriptors.size(); ++i) {
+      final FieldDescriptor fd = fieldDescriptors.get(i);
+      boolean enforceUtf8 = fd.getFile().getOptions().getJavaStringCheckUtf8();
+      Internal.EnumVerifier enumVerifier = null;
+      if (fd.getJavaType() == Descriptors.FieldDescriptor.JavaType.ENUM) {
+        enumVerifier =
+            new Internal.EnumVerifier() {
+              @Override
+              public boolean isInRange(int number) {
+                return fd.getEnumType().findValueByNumber(number) != null;
+              }
+            };
+      }
+      if (fd.getContainingOneof() != null) {
+        // Build a oneof member field.
+        builder.withField(buildOneofMember(messageType, fd, oneofState, enforceUtf8, enumVerifier));
+      } else {
+        Field field = field(messageType, fd);
+        int number = fd.getNumber();
+        FieldType type = getFieldType(fd);
+
+        if (fd.isMapField()) {
+          // Map field points to an auto-generated message entry type with the definition:
+          //   message MapEntry {
+          //     K key = 1;
+          //     V value = 2;
+          //   }
+          final FieldDescriptor valueField = fd.getMessageType().findFieldByNumber(2);
+          if (valueField.getJavaType() == Descriptors.FieldDescriptor.JavaType.ENUM) {
+            enumVerifier =
+                new Internal.EnumVerifier() {
+                  @Override
+                  public boolean isInRange(int number) {
+                    return valueField.getEnumType().findValueByNumber(number) != null;
+                  }
+                };
+          }
+          builder.withField(
+              forMapField(
+                  field,
+                  number,
+                  SchemaUtil.getMapDefaultEntry(messageType, fd.getName()),
+                  enumVerifier));
+          continue;
+        }
+
+        if (fd.isRepeated()) {
+          // Repeated fields are not presence-checked.
+          if (enumVerifier != null) {
+            if (fd.isPacked()) {
+              builder.withField(
+                  forPackedFieldWithEnumVerifier(
+                      field, number, type, enumVerifier, cachedSizeField(messageType, fd)));
+            } else {
+              builder.withField(forFieldWithEnumVerifier(field, number, type, enumVerifier));
+            }
+          } else if (fd.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+            builder.withField(
+                forRepeatedMessageField(
+                    field, number, type, getTypeForRepeatedMessageField(messageType, fd)));
+          } else {
+            if (fd.isPacked()) {
+              builder.withField(
+                  forPackedField(field, number, type, cachedSizeField(messageType, fd)));
+            } else {
+              builder.withField(forField(field, number, type, enforceUtf8));
+            }
+          }
+          continue;
+        }
+
+        if (bitField == null) {
+          // Lazy-create the next bitfield since we know it must exist.
+          bitField = bitField(messageType, bitFieldIndex);
+        }
+
+        // It's a presence-checked field.
+        if (fd.isRequired()) {
+          builder.withField(
+              forProto2RequiredField(
+                  field, number, type, bitField, presenceMask, enforceUtf8, enumVerifier));
+        } else {
+          builder.withField(
+              forProto2OptionalField(
+                  field, number, type, bitField, presenceMask, enforceUtf8, enumVerifier));
+        }
+      }
+
+      // Update the presence mask for the next iteration. If the shift clears out the mask, we will
+      // go to the next bitField.
+      presenceMask <<= 1;
+      if (presenceMask == 0) {
+        bitField = null;
+        presenceMask = 1;
+        bitFieldIndex++;
+      }
+    }
+
+    List<Integer> fieldsToCheckIsInitialized = new ArrayList<Integer>();
+    for (int i = 0; i < fieldDescriptors.size(); ++i) {
+      FieldDescriptor fd = fieldDescriptors.get(i);
+      if (fd.isRequired()
+          || (fd.getJavaType() == FieldDescriptor.JavaType.MESSAGE
+              && needsIsInitializedCheck(fd.getMessageType()))) {
+        fieldsToCheckIsInitialized.add(fd.getNumber());
+      }
+    }
+    int[] numbers = new int[fieldsToCheckIsInitialized.size()];
+    for (int i = 0; i < fieldsToCheckIsInitialized.size(); i++) {
+      numbers[i] = fieldsToCheckIsInitialized.get(i);
+    }
+    builder.withCheckInitialized(numbers);
+
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo convertProto3(
+      Class<?> messageType, Descriptor messageDescriptor) {
+    List<FieldDescriptor> fieldDescriptors = messageDescriptor.getFields();
+    StructuralMessageInfo.Builder builder =
+        StructuralMessageInfo.newBuilder(fieldDescriptors.size());
+    builder.withDefaultInstance(getDefaultInstance(messageType));
+    builder.withSyntax(ProtoSyntax.PROTO3);
+
+    OneofState oneofState = new OneofState();
+    boolean enforceUtf8 = true;
+    for (int i = 0; i < fieldDescriptors.size(); ++i) {
+      FieldDescriptor fd = fieldDescriptors.get(i);
+      if (fd.getContainingOneof() != null) {
+        // Build a oneof member field.
+        builder.withField(buildOneofMember(messageType, fd, oneofState, enforceUtf8, null));
+        continue;
+      }
+      if (fd.isMapField()) {
+        builder.withField(
+            forMapField(
+                field(messageType, fd),
+                fd.getNumber(),
+                SchemaUtil.getMapDefaultEntry(messageType, fd.getName()),
+                null));
+        continue;
+      }
+      if (fd.isRepeated() && fd.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
+        builder.withField(
+            forRepeatedMessageField(
+                field(messageType, fd),
+                fd.getNumber(),
+                getFieldType(fd),
+                getTypeForRepeatedMessageField(messageType, fd)));
+        continue;
+      }
+      if (fd.isPacked()) {
+        builder.withField(
+            forPackedField(
+                field(messageType, fd),
+                fd.getNumber(),
+                getFieldType(fd),
+                cachedSizeField(messageType, fd)));
+      } else {
+        builder.withField(
+            forField(field(messageType, fd), fd.getNumber(), getFieldType(fd), enforceUtf8));
+      }
+    }
+
+    return builder.build();
+  }
+
+  /** Builds info for a oneof member field. */
+  private static FieldInfo buildOneofMember(
+      Class<?> messageType,
+      FieldDescriptor fd,
+      OneofState oneofState,
+      boolean enforceUtf8,
+      Internal.EnumVerifier enumVerifier) {
+    OneofInfo oneof = oneofState.getOneof(messageType, fd.getContainingOneof());
+    FieldType type = getFieldType(fd);
+    Class<?> oneofStoredType = getOneofStoredType(messageType, fd, type);
+    return forOneofMemberField(
+        fd.getNumber(), type, oneof, oneofStoredType, enforceUtf8, enumVerifier);
+  }
+
+  private static Class<?> getOneofStoredType(
+      Class<?> messageType, FieldDescriptor fd, FieldType type) {
+    switch (type.getJavaType()) {
+      case BOOLEAN:
+        return Boolean.class;
+      case BYTE_STRING:
+        return ByteString.class;
+      case DOUBLE:
+        return Double.class;
+      case FLOAT:
+        return Float.class;
+      case ENUM:
+      case INT:
+        return Integer.class;
+      case LONG:
+        return Long.class;
+      case STRING:
+        return String.class;
+      case MESSAGE:
+        return getOneofStoredTypeForMessage(messageType, fd);
+      default:
+        throw new IllegalArgumentException("Invalid type for oneof: " + type);
+    }
+  }
+
+  private static FieldType getFieldType(FieldDescriptor fd) {
+    switch (fd.getType()) {
+      case BOOL:
+        if (!fd.isRepeated()) {
+          return FieldType.BOOL;
+        }
+        return fd.isPacked() ? FieldType.BOOL_LIST_PACKED : FieldType.BOOL_LIST;
+      case BYTES:
+        return fd.isRepeated() ? FieldType.BYTES_LIST : FieldType.BYTES;
+      case DOUBLE:
+        if (!fd.isRepeated()) {
+          return FieldType.DOUBLE;
+        }
+        return fd.isPacked() ? FieldType.DOUBLE_LIST_PACKED : FieldType.DOUBLE_LIST;
+      case ENUM:
+        if (!fd.isRepeated()) {
+          return FieldType.ENUM;
+        }
+        return fd.isPacked() ? FieldType.ENUM_LIST_PACKED : FieldType.ENUM_LIST;
+      case FIXED32:
+        if (!fd.isRepeated()) {
+          return FieldType.FIXED32;
+        }
+        return fd.isPacked() ? FieldType.FIXED32_LIST_PACKED : FieldType.FIXED32_LIST;
+      case FIXED64:
+        if (!fd.isRepeated()) {
+          return FieldType.FIXED64;
+        }
+        return fd.isPacked() ? FieldType.FIXED64_LIST_PACKED : FieldType.FIXED64_LIST;
+      case FLOAT:
+        if (!fd.isRepeated()) {
+          return FieldType.FLOAT;
+        }
+        return fd.isPacked() ? FieldType.FLOAT_LIST_PACKED : FieldType.FLOAT_LIST;
+      case GROUP:
+        return fd.isRepeated() ? FieldType.GROUP_LIST : FieldType.GROUP;
+      case INT32:
+        if (!fd.isRepeated()) {
+          return FieldType.INT32;
+        }
+        return fd.isPacked() ? FieldType.INT32_LIST_PACKED : FieldType.INT32_LIST;
+      case INT64:
+        if (!fd.isRepeated()) {
+          return FieldType.INT64;
+        }
+        return fd.isPacked() ? FieldType.INT64_LIST_PACKED : FieldType.INT64_LIST;
+      case MESSAGE:
+        if (fd.isMapField()) {
+          return FieldType.MAP;
+        }
+        return fd.isRepeated() ? FieldType.MESSAGE_LIST : FieldType.MESSAGE;
+      case SFIXED32:
+        if (!fd.isRepeated()) {
+          return FieldType.SFIXED32;
+        }
+        return fd.isPacked() ? FieldType.SFIXED32_LIST_PACKED : FieldType.SFIXED32_LIST;
+      case SFIXED64:
+        if (!fd.isRepeated()) {
+          return FieldType.SFIXED64;
+        }
+        return fd.isPacked() ? FieldType.SFIXED64_LIST_PACKED : FieldType.SFIXED64_LIST;
+      case SINT32:
+        if (!fd.isRepeated()) {
+          return FieldType.SINT32;
+        }
+        return fd.isPacked() ? FieldType.SINT32_LIST_PACKED : FieldType.SINT32_LIST;
+      case SINT64:
+        if (!fd.isRepeated()) {
+          return FieldType.SINT64;
+        }
+        return fd.isPacked() ? FieldType.SINT64_LIST_PACKED : FieldType.SINT64_LIST;
+      case STRING:
+        return fd.isRepeated() ? FieldType.STRING_LIST : FieldType.STRING;
+      case UINT32:
+        if (!fd.isRepeated()) {
+          return FieldType.UINT32;
+        }
+        return fd.isPacked() ? FieldType.UINT32_LIST_PACKED : FieldType.UINT32_LIST;
+      case UINT64:
+        if (!fd.isRepeated()) {
+          return FieldType.UINT64;
+        }
+        return fd.isPacked() ? FieldType.UINT64_LIST_PACKED : FieldType.UINT64_LIST;
+      default:
+        throw new IllegalArgumentException("Unsupported field type: " + fd.getType());
+    }
+  }
+
+  private static Field bitField(Class<?> messageType, int index) {
+    return field(messageType, "bitField" + index + "_");
+  }
+
+  private static Field field(Class<?> messageType, FieldDescriptor fd) {
+    return field(messageType, getFieldName(fd));
+  }
+
+  private static Field cachedSizeField(Class<?> messageType, FieldDescriptor fd) {
+    return field(messageType, getCachedSizeFieldName(fd));
+  }
+
+  private static Field field(Class<?> messageType, String fieldName) {
+    try {
+      return messageType.getDeclaredField(fieldName);
+    } catch (Exception e) {
+      throw new IllegalArgumentException(
+          "Unable to find field " + fieldName + " in message class " + messageType.getName());
+    }
+  }
+
+  static String getFieldName(FieldDescriptor fd) {
+    String name = (fd.getType() == FieldDescriptor.Type.GROUP)
+                  ? fd.getMessageType().getName()
+                  : fd.getName();
+    String suffix = specialFieldNames.contains(name) ? "__" : "_";
+    return snakeCaseToCamelCase(name) + suffix;
+  }
+
+  private static String getCachedSizeFieldName(FieldDescriptor fd) {
+    return snakeCaseToCamelCase(fd.getName()) + "MemoizedSerializedSize";
+  }
+
+  /**
+   * This method must match exactly with the corresponding function in protocol compiler. See:
+   * https://github.com/google/protobuf/blob/v3.0.0/src/google/protobuf/compiler/java/java_helpers.cc#L153
+   */
+  private static String snakeCaseToCamelCase(String snakeCase) {
+    StringBuilder sb = new StringBuilder(snakeCase.length() + 1);
+    boolean capNext = false;
+    for (int ctr = 0; ctr < snakeCase.length(); ctr++) {
+      char next = snakeCase.charAt(ctr);
+      if (next == '_') {
+        capNext = true;
+      } else if (Character.isDigit(next)) {
+        sb.append(next);
+        capNext = true;
+      } else if (capNext) {
+        sb.append(Character.toUpperCase(next));
+        capNext = false;
+      } else if (ctr == 0) {
+        sb.append(Character.toLowerCase(next));
+      } else {
+        sb.append(next);
+      }
+    }
+    return sb.toString();
+  }
+
+  /**
+   * Inspects the message to identify the stored type for a message field that is part of a oneof.
+   */
+  private static Class<?> getOneofStoredTypeForMessage(Class<?> messageType, FieldDescriptor fd) {
+    try {
+      String name = fd.getType() == Type.GROUP ? fd.getMessageType().getName() : fd.getName();
+      Method getter = messageType.getDeclaredMethod(getterForField(name));
+      return getter.getReturnType();
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  /** Inspects the message to identify the message type of a repeated message field. */
+  private static Class<?> getTypeForRepeatedMessageField(Class<?> messageType, FieldDescriptor fd) {
+    try {
+      String name = fd.getType() == Type.GROUP ? fd.getMessageType().getName() : fd.getName();
+      Method getter = messageType.getDeclaredMethod(getterForField(name), int.class);
+      return getter.getReturnType();
+    } catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  /** Constructs the name of the get method for the given field in the proto. */
+  private static String getterForField(String snakeCase) {
+    String camelCase = snakeCaseToCamelCase(snakeCase);
+    StringBuilder builder = new StringBuilder("get");
+    // Capitalize the first character in the field name.
+    builder.append(Character.toUpperCase(camelCase.charAt(0)));
+    builder.append(camelCase.substring(1, camelCase.length()));
+    return builder.toString();
+  }
+
+  private static final class OneofState {
+    private OneofInfo[] oneofs = new OneofInfo[2];
+
+    OneofInfo getOneof(Class<?> messageType, OneofDescriptor desc) {
+      int index = desc.getIndex();
+      if (index >= oneofs.length) {
+        // Grow the array.
+        oneofs = Arrays.copyOf(oneofs, index * 2);
+      }
+      OneofInfo info = oneofs[index];
+      if (info == null) {
+        info = newInfo(messageType, desc);
+        oneofs[index] = info;
+      }
+      return info;
+    }
+
+    private static OneofInfo newInfo(Class<?> messageType, OneofDescriptor desc) {
+      String camelCase = snakeCaseToCamelCase(desc.getName());
+      String valueFieldName = camelCase + "_";
+      String caseFieldName = camelCase + "Case_";
+
+      return new OneofInfo(
+          desc.getIndex(), field(messageType, caseFieldName), field(messageType, valueFieldName));
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java b/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java
index 0ce5f54..11843b6 100644
--- a/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java
+++ b/java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java
@@ -110,12 +110,23 @@
     return ExtensionRegistryFactory.create();
   }
 
+  private static volatile ExtensionRegistryLite emptyRegistry;
+
   /**
    * Get the unmodifiable singleton empty instance of either ExtensionRegistryLite or {@code
    * ExtensionRegistry} (if the full (non-Lite) proto libraries are available).
    */
   public static ExtensionRegistryLite getEmptyRegistry() {
-    return ExtensionRegistryFactory.createEmpty();
+    ExtensionRegistryLite result = emptyRegistry;
+    if (result == null) {
+      synchronized (ExtensionRegistryLite.class) {
+        result = emptyRegistry;
+        if (result == null) {
+          result = emptyRegistry = ExtensionRegistryFactory.createEmpty();
+        }
+      }
+    }
+    return result;
   }
 
 
diff --git a/java/core/src/main/java/com/google/protobuf/ExtensionSchema.java b/java/core/src/main/java/com/google/protobuf/ExtensionSchema.java
new file mode 100755
index 0000000..2eae22d
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/ExtensionSchema.java
@@ -0,0 +1,98 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+import java.util.Map;
+
+abstract class ExtensionSchema<T extends FieldSet.FieldDescriptorLite<T>> {
+
+  /** Returns true for messages that support extensions. */
+  abstract boolean hasExtensions(MessageLite prototype);
+
+  /** Returns the extension {@link FieldSet} for the message instance. */
+  abstract FieldSet<T> getExtensions(Object message);
+
+  /** Replaces the extension {@link FieldSet} for the message instance. */
+  abstract void setExtensions(Object message, FieldSet<T> extensions);
+
+  /** Returns the extension {@link FieldSet} and ensures it's mutable. */
+  abstract FieldSet<T> getMutableExtensions(Object message);
+
+  /** Marks the extension {@link FieldSet} as immutable. */
+  abstract void makeImmutable(Object message);
+
+  /**
+   * Parses an extension. Returns the passed-in unknownFields parameter if no unknown enum value is
+   * found or a modified unknownFields (a new instance if the passed-in unknownFields is null)
+   * containing unknown enum values found while parsing.
+   *
+   * @param <UT> The type used to store unknown fields. It's either UnknownFieldSet in full runtime
+   *     or UnknownFieldSetLite in lite runtime.
+   */
+  abstract <UT, UB> UB parseExtension(
+      Reader reader,
+      Object extension,
+      ExtensionRegistryLite extensionRegistry,
+      FieldSet<T> extensions,
+      UB unknownFields,
+      UnknownFieldSchema<UT, UB> unknownFieldSchema)
+      throws IOException;
+
+  /** Gets the field number of an extension entry. */
+  abstract int extensionNumber(Map.Entry<?, ?> extension);
+
+  /** Serializes one extension entry. */
+  abstract void serializeExtension(Writer writer, Map.Entry<?, ?> extension) throws IOException;
+
+  /** Finds an extension by field number. */
+  abstract Object findExtensionByNumber(
+      ExtensionRegistryLite extensionRegistry, MessageLite defaultInstance, int number);
+
+  /** Parses a length-prefixed MessageSet item from the reader. */
+  abstract void parseLengthPrefixedMessageSetItem(
+      Reader reader,
+      Object extension,
+      ExtensionRegistryLite extensionRegistry,
+      FieldSet<T> extensions)
+      throws IOException;
+
+  /**
+   * Parses the entire content of a {@link ByteString} as one MessageSet item. Unlike {@link
+   * #parseLengthPrefixedMessageSetItem}, there isn't a length-prefix.
+   */
+  abstract void parseMessageSetItem(
+      ByteString data,
+      Object extension,
+      ExtensionRegistryLite extensionRegistry,
+      FieldSet<T> extensions)
+      throws IOException;
+}
diff --git a/java/core/src/main/java/com/google/protobuf/ExtensionSchemaFull.java b/java/core/src/main/java/com/google/protobuf/ExtensionSchemaFull.java
new file mode 100755
index 0000000..9055851
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/ExtensionSchemaFull.java
@@ -0,0 +1,547 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.Descriptors.EnumValueDescriptor;
+import com.google.protobuf.Descriptors.FieldDescriptor;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@SuppressWarnings("unchecked")
+final class ExtensionSchemaFull extends ExtensionSchema<FieldDescriptor> {
+
+  private static final long EXTENSION_FIELD_OFFSET = getExtensionsFieldOffset();
+
+  private static <T> long getExtensionsFieldOffset() {
+    try {
+      Field field = GeneratedMessageV3.ExtendableMessage.class.getDeclaredField("extensions");
+      return UnsafeUtil.objectFieldOffset(field);
+    } catch (Throwable e) {
+      throw new IllegalStateException("Unable to lookup extension field offset");
+    }
+  }
+
+  @Override
+  boolean hasExtensions(MessageLite prototype) {
+    return prototype instanceof GeneratedMessageV3.ExtendableMessage;
+  }
+
+  @Override
+  public FieldSet<FieldDescriptor> getExtensions(Object message) {
+    return (FieldSet<FieldDescriptor>) UnsafeUtil.getObject(message, EXTENSION_FIELD_OFFSET);
+  }
+
+  @Override
+  void setExtensions(Object message, FieldSet<FieldDescriptor> extensions) {
+    UnsafeUtil.putObject(message, EXTENSION_FIELD_OFFSET, extensions);
+  }
+
+  @Override
+  FieldSet<FieldDescriptor> getMutableExtensions(Object message) {
+    FieldSet<FieldDescriptor> extensions = getExtensions(message);
+    if (extensions.isImmutable()) {
+      extensions = extensions.clone();
+      setExtensions(message, extensions);
+    }
+    return extensions;
+  }
+
+  @Override
+  void makeImmutable(Object message) {
+    getExtensions(message).makeImmutable();
+  }
+
+  @Override
+  <UT, UB> UB parseExtension(
+      Reader reader,
+      Object extensionObject,
+      ExtensionRegistryLite extensionRegistry,
+      FieldSet<FieldDescriptor> extensions,
+      UB unknownFields,
+      UnknownFieldSchema<UT, UB> unknownFieldSchema)
+      throws IOException {
+    ExtensionRegistry.ExtensionInfo extension = (ExtensionRegistry.ExtensionInfo) extensionObject;
+    int fieldNumber = extension.descriptor.getNumber();
+
+    if (extension.descriptor.isRepeated() && extension.descriptor.isPacked()) {
+      Object value = null;
+      switch (extension.descriptor.getLiteType()) {
+        case DOUBLE:
+          {
+            List<Double> list = new ArrayList<Double>();
+            reader.readDoubleList(list);
+            value = list;
+            break;
+          }
+        case FLOAT:
+          {
+            List<Float> list = new ArrayList<Float>();
+            reader.readFloatList(list);
+            value = list;
+            break;
+          }
+        case INT64:
+          {
+            List<Long> list = new ArrayList<Long>();
+            reader.readInt64List(list);
+            value = list;
+            break;
+          }
+        case UINT64:
+          {
+            List<Long> list = new ArrayList<Long>();
+            reader.readUInt64List(list);
+            value = list;
+            break;
+          }
+        case INT32:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readInt32List(list);
+            value = list;
+            break;
+          }
+        case FIXED64:
+          {
+            List<Long> list = new ArrayList<Long>();
+            reader.readFixed64List(list);
+            value = list;
+            break;
+          }
+        case FIXED32:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readFixed32List(list);
+            value = list;
+            break;
+          }
+        case BOOL:
+          {
+            List<Boolean> list = new ArrayList<Boolean>();
+            reader.readBoolList(list);
+            value = list;
+            break;
+          }
+        case UINT32:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readUInt32List(list);
+            value = list;
+            break;
+          }
+        case SFIXED32:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readSFixed32List(list);
+            value = list;
+            break;
+          }
+        case SFIXED64:
+          {
+            List<Long> list = new ArrayList<Long>();
+            reader.readSFixed64List(list);
+            value = list;
+            break;
+          }
+        case SINT32:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readSInt32List(list);
+            value = list;
+            break;
+          }
+        case SINT64:
+          {
+            List<Long> list = new ArrayList<Long>();
+            reader.readSInt64List(list);
+            value = list;
+            break;
+          }
+        case ENUM:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readEnumList(list);
+            List<EnumValueDescriptor> enumList = new ArrayList<EnumValueDescriptor>();
+            for (int number : list) {
+              EnumValueDescriptor enumDescriptor =
+                  extension.descriptor.getEnumType().findValueByNumber(number);
+              if (enumDescriptor != null) {
+                enumList.add(enumDescriptor);
+              } else {
+                unknownFields =
+                    SchemaUtil.storeUnknownEnum(
+                        fieldNumber, number, unknownFields, unknownFieldSchema);
+              }
+            }
+            value = enumList;
+            break;
+          }
+        default:
+          throw new IllegalStateException(
+              "Type cannot be packed: " + extension.descriptor.getLiteType());
+      }
+      extensions.setField(extension.descriptor, value);
+    } else {
+      Object value = null;
+      // Enum is a special case because unknown enum values will be put into UnknownFieldSetLite.
+      if (extension.descriptor.getLiteType() == WireFormat.FieldType.ENUM) {
+        int number = reader.readInt32();
+        Object enumValue = extension.descriptor.getEnumType().findValueByNumber(number);
+        if (enumValue == null) {
+          return SchemaUtil.storeUnknownEnum(
+              fieldNumber, number, unknownFields, unknownFieldSchema);
+        }
+        value = enumValue;
+      } else {
+        switch (extension.descriptor.getLiteType()) {
+          case DOUBLE:
+            value = reader.readDouble();
+            break;
+          case FLOAT:
+            value = reader.readFloat();
+            break;
+          case INT64:
+            value = reader.readInt64();
+            break;
+          case UINT64:
+            value = reader.readUInt64();
+            break;
+          case INT32:
+            value = reader.readInt32();
+            break;
+          case FIXED64:
+            value = reader.readFixed64();
+            break;
+          case FIXED32:
+            value = reader.readFixed32();
+            break;
+          case BOOL:
+            value = reader.readBool();
+            break;
+          case BYTES:
+            value = reader.readBytes();
+            break;
+          case UINT32:
+            value = reader.readUInt32();
+            break;
+          case SFIXED32:
+            value = reader.readSFixed32();
+            break;
+          case SFIXED64:
+            value = reader.readSFixed64();
+            break;
+          case SINT32:
+            value = reader.readSInt32();
+            break;
+          case SINT64:
+            value = reader.readSInt64();
+            break;
+
+          case STRING:
+            value = reader.readString();
+            break;
+          case GROUP:
+            value = reader.readGroup(extension.defaultInstance.getClass(), extensionRegistry);
+            break;
+
+          case MESSAGE:
+            value = reader.readMessage(extension.defaultInstance.getClass(), extensionRegistry);
+            break;
+
+          case ENUM:
+            throw new IllegalStateException("Shouldn't reach here.");
+        }
+      }
+      if (extension.descriptor.isRepeated()) {
+        extensions.addRepeatedField(extension.descriptor, value);
+      } else {
+        switch (extension.descriptor.getLiteType()) {
+          case MESSAGE:
+          case GROUP:
+            Object oldValue = extensions.getField(extension.descriptor);
+            if (oldValue != null) {
+              value = Internal.mergeMessage(oldValue, value);
+            }
+            break;
+          default:
+            break;
+        }
+        extensions.setField(extension.descriptor, value);
+      }
+    }
+    return unknownFields;
+  }
+
+  @Override
+  int extensionNumber(Map.Entry<?, ?> extension) {
+    FieldDescriptor descriptor = (FieldDescriptor) extension.getKey();
+    return descriptor.getNumber();
+  }
+
+  @Override
+  void serializeExtension(Writer writer, Map.Entry<?, ?> extension) throws IOException {
+    FieldDescriptor descriptor = (FieldDescriptor) extension.getKey();
+    if (descriptor.isRepeated()) {
+      switch (descriptor.getLiteType()) {
+        case DOUBLE:
+          SchemaUtil.writeDoubleList(
+              descriptor.getNumber(),
+              (List<Double>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case FLOAT:
+          SchemaUtil.writeFloatList(
+              descriptor.getNumber(),
+              (List<Float>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case INT64:
+          SchemaUtil.writeInt64List(
+              descriptor.getNumber(),
+              (List<Long>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case UINT64:
+          SchemaUtil.writeUInt64List(
+              descriptor.getNumber(),
+              (List<Long>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case INT32:
+          SchemaUtil.writeInt32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case FIXED64:
+          SchemaUtil.writeFixed64List(
+              descriptor.getNumber(),
+              (List<Long>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case FIXED32:
+          SchemaUtil.writeFixed32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case BOOL:
+          SchemaUtil.writeBoolList(
+              descriptor.getNumber(),
+              (List<Boolean>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case BYTES:
+          SchemaUtil.writeBytesList(
+              descriptor.getNumber(), (List<ByteString>) extension.getValue(), writer);
+          break;
+        case UINT32:
+          SchemaUtil.writeUInt32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case SFIXED32:
+          SchemaUtil.writeSFixed32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case SFIXED64:
+          SchemaUtil.writeSFixed64List(
+              descriptor.getNumber(),
+              (List<Long>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case SINT32:
+          SchemaUtil.writeSInt32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case SINT64:
+          SchemaUtil.writeSInt64List(
+              descriptor.getNumber(),
+              (List<Long>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case ENUM:
+          {
+            List<EnumValueDescriptor> enumList = (List<EnumValueDescriptor>) extension.getValue();
+            List<Integer> list = new ArrayList<Integer>();
+            for (EnumValueDescriptor d : enumList) {
+              list.add(d.getNumber());
+            }
+            SchemaUtil.writeInt32List(descriptor.getNumber(), list, writer, descriptor.isPacked());
+            break;
+          }
+        case STRING:
+          SchemaUtil.writeStringList(
+              descriptor.getNumber(), (List<String>) extension.getValue(), writer);
+          break;
+        case GROUP:
+          SchemaUtil.writeGroupList(descriptor.getNumber(), (List<?>) extension.getValue(), writer);
+          break;
+        case MESSAGE:
+          SchemaUtil.writeMessageList(
+              descriptor.getNumber(), (List<?>) extension.getValue(), writer);
+          break;
+      }
+    } else {
+      switch (descriptor.getLiteType()) {
+        case DOUBLE:
+          writer.writeDouble(descriptor.getNumber(), (Double) extension.getValue());
+          break;
+        case FLOAT:
+          writer.writeFloat(descriptor.getNumber(), (Float) extension.getValue());
+          break;
+        case INT64:
+          writer.writeInt64(descriptor.getNumber(), (Long) extension.getValue());
+          break;
+        case UINT64:
+          writer.writeUInt64(descriptor.getNumber(), (Long) extension.getValue());
+          break;
+        case INT32:
+          writer.writeInt32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case FIXED64:
+          writer.writeFixed64(descriptor.getNumber(), (Long) extension.getValue());
+          break;
+        case FIXED32:
+          writer.writeFixed32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case BOOL:
+          writer.writeBool(descriptor.getNumber(), (Boolean) extension.getValue());
+          break;
+        case BYTES:
+          writer.writeBytes(descriptor.getNumber(), (ByteString) extension.getValue());
+          break;
+        case UINT32:
+          writer.writeUInt32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case SFIXED32:
+          writer.writeSFixed32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case SFIXED64:
+          writer.writeSFixed64(descriptor.getNumber(), (Long) extension.getValue());
+          break;
+        case SINT32:
+          writer.writeSInt32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case SINT64:
+          writer.writeSInt64(descriptor.getNumber(), (Long) extension.getValue());
+          break;
+        case ENUM:
+          writer.writeInt32(
+              descriptor.getNumber(), ((EnumValueDescriptor) extension.getValue()).getNumber());
+          break;
+        case STRING:
+          writer.writeString(descriptor.getNumber(), (String) extension.getValue());
+          break;
+        case GROUP:
+          writer.writeGroup(descriptor.getNumber(), extension.getValue());
+          break;
+        case MESSAGE:
+          writer.writeMessage(descriptor.getNumber(), extension.getValue());
+          break;
+      }
+    }
+  }
+
+  @Override
+  Object findExtensionByNumber(
+      ExtensionRegistryLite extensionRegistry, MessageLite defaultInstance, int number) {
+    return ((ExtensionRegistry) extensionRegistry)
+        .findExtensionByNumber(((Message) defaultInstance).getDescriptorForType(), number);
+  }
+
+  @Override
+  void parseLengthPrefixedMessageSetItem(
+      Reader reader,
+      Object extension,
+      ExtensionRegistryLite extensionRegistry,
+      FieldSet<FieldDescriptor> extensions)
+      throws IOException {
+    ExtensionRegistry.ExtensionInfo extensionInfo = (ExtensionRegistry.ExtensionInfo) extension;
+
+    if (ExtensionRegistryLite.isEagerlyParseMessageSets()) {
+      Object value =
+          reader.readMessage(extensionInfo.defaultInstance.getClass(), extensionRegistry);
+      extensions.setField(extensionInfo.descriptor, value);
+    } else {
+      extensions.setField(
+          extensionInfo.descriptor,
+          new LazyField(extensionInfo.defaultInstance, extensionRegistry, reader.readBytes()));
+    }
+  }
+
+  @Override
+  void parseMessageSetItem(
+      ByteString data,
+      Object extension,
+      ExtensionRegistryLite extensionRegistry,
+      FieldSet<FieldDescriptor> extensions)
+      throws IOException {
+    ExtensionRegistry.ExtensionInfo extensionInfo = (ExtensionRegistry.ExtensionInfo) extension;
+    Object value = extensionInfo.defaultInstance.newBuilderForType().buildPartial();
+
+    if (ExtensionRegistryLite.isEagerlyParseMessageSets()) {
+      Reader reader = BinaryReader.newInstance(ByteBuffer.wrap(data.toByteArray()), true);
+      Protobuf.getInstance().mergeFrom(value, reader, extensionRegistry);
+      extensions.setField(extensionInfo.descriptor, value);
+
+      if (reader.getFieldNumber() != Reader.READ_DONE) {
+        throw InvalidProtocolBufferException.invalidEndTag();
+      }
+    } else {
+      extensions.setField(
+          extensionInfo.descriptor,
+          new LazyField(extensionInfo.defaultInstance, extensionRegistry, data));
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/ExtensionSchemaLite.java b/java/core/src/main/java/com/google/protobuf/ExtensionSchemaLite.java
new file mode 100755
index 0000000..7f6846e
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/ExtensionSchemaLite.java
@@ -0,0 +1,541 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.GeneratedMessageLite.ExtensionDescriptor;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@SuppressWarnings("unchecked")
+final class ExtensionSchemaLite extends ExtensionSchema<ExtensionDescriptor> {
+
+  @Override
+  boolean hasExtensions(MessageLite prototype) {
+    return prototype instanceof GeneratedMessageLite.ExtendableMessage;
+  }
+
+  @Override
+  FieldSet<ExtensionDescriptor> getExtensions(Object message) {
+    return ((GeneratedMessageLite.ExtendableMessage<?, ?>) message).extensions;
+  }
+
+  @Override
+  void setExtensions(Object message, FieldSet<ExtensionDescriptor> extensions) {
+    ((GeneratedMessageLite.ExtendableMessage<?, ?>) message).extensions = extensions;
+  }
+
+  @Override
+  FieldSet<ExtensionDescriptor> getMutableExtensions(Object message) {
+    return ((GeneratedMessageLite.ExtendableMessage<?, ?>) message).ensureExtensionsAreMutable();
+  }
+
+  @Override
+  void makeImmutable(Object message) {
+    getExtensions(message).makeImmutable();
+  }
+
+  @Override
+  <UT, UB> UB parseExtension(
+      Reader reader,
+      Object extensionObject,
+      ExtensionRegistryLite extensionRegistry,
+      FieldSet<ExtensionDescriptor> extensions,
+      UB unknownFields,
+      UnknownFieldSchema<UT, UB> unknownFieldSchema)
+      throws IOException {
+    GeneratedMessageLite.GeneratedExtension<?, ?> extension =
+        (GeneratedMessageLite.GeneratedExtension<?, ?>) extensionObject;
+    int fieldNumber = extension.getNumber();
+
+    if (extension.descriptor.isRepeated() && extension.descriptor.isPacked()) {
+      Object value = null;
+      switch (extension.getLiteType()) {
+        case DOUBLE:
+          {
+            List<Double> list = new ArrayList<Double>();
+            reader.readDoubleList(list);
+            value = list;
+            break;
+          }
+        case FLOAT:
+          {
+            List<Float> list = new ArrayList<Float>();
+            reader.readFloatList(list);
+            value = list;
+            break;
+          }
+        case INT64:
+          {
+            List<Long> list = new ArrayList<Long>();
+            reader.readInt64List(list);
+            value = list;
+            break;
+          }
+        case UINT64:
+          {
+            List<Long> list = new ArrayList<Long>();
+            reader.readUInt64List(list);
+            value = list;
+            break;
+          }
+        case INT32:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readInt32List(list);
+            value = list;
+            break;
+          }
+        case FIXED64:
+          {
+            List<Long> list = new ArrayList<Long>();
+            reader.readFixed64List(list);
+            value = list;
+            break;
+          }
+        case FIXED32:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readFixed32List(list);
+            value = list;
+            break;
+          }
+        case BOOL:
+          {
+            List<Boolean> list = new ArrayList<Boolean>();
+            reader.readBoolList(list);
+            value = list;
+            break;
+          }
+        case UINT32:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readUInt32List(list);
+            value = list;
+            break;
+          }
+        case SFIXED32:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readSFixed32List(list);
+            value = list;
+            break;
+          }
+        case SFIXED64:
+          {
+            List<Long> list = new ArrayList<Long>();
+            reader.readSFixed64List(list);
+            value = list;
+            break;
+          }
+        case SINT32:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readSInt32List(list);
+            value = list;
+            break;
+          }
+        case SINT64:
+          {
+            List<Long> list = new ArrayList<Long>();
+            reader.readSInt64List(list);
+            value = list;
+            break;
+          }
+        case ENUM:
+          {
+            List<Integer> list = new ArrayList<Integer>();
+            reader.readEnumList(list);
+            unknownFields =
+                SchemaUtil.filterUnknownEnumList(
+                    fieldNumber,
+                    list,
+                    extension.descriptor.getEnumType(),
+                    unknownFields,
+                    unknownFieldSchema);
+            value = list;
+            break;
+          }
+        default:
+          throw new IllegalStateException(
+              "Type cannot be packed: " + extension.descriptor.getLiteType());
+      }
+      extensions.setField(extension.descriptor, value);
+    } else {
+      Object value = null;
+      // Enum is a special case becasue unknown enum values will be put into UnknownFieldSetLite.
+      if (extension.getLiteType() == WireFormat.FieldType.ENUM) {
+        int number = reader.readInt32();
+        Object enumValue = extension.descriptor.getEnumType().findValueByNumber(number);
+        if (enumValue == null) {
+          return SchemaUtil.storeUnknownEnum(
+              fieldNumber, number, unknownFields, unknownFieldSchema);
+        }
+        // Note, we store the integer value instead of the actual enum object in FieldSet.
+        // This is also different from full-runtime where we store EnumValueDescriptor.
+        value = number;
+      } else {
+        switch (extension.getLiteType()) {
+          case DOUBLE:
+            value = reader.readDouble();
+            break;
+          case FLOAT:
+            value = reader.readFloat();
+            break;
+          case INT64:
+            value = reader.readInt64();
+            break;
+          case UINT64:
+            value = reader.readUInt64();
+            break;
+          case INT32:
+            value = reader.readInt32();
+            break;
+          case FIXED64:
+            value = reader.readFixed64();
+            break;
+          case FIXED32:
+            value = reader.readFixed32();
+            break;
+          case BOOL:
+            value = reader.readBool();
+            break;
+          case BYTES:
+            value = reader.readBytes();
+            break;
+          case UINT32:
+            value = reader.readUInt32();
+            break;
+          case SFIXED32:
+            value = reader.readSFixed32();
+            break;
+          case SFIXED64:
+            value = reader.readSFixed64();
+            break;
+          case SINT32:
+            value = reader.readSInt32();
+            break;
+          case SINT64:
+            value = reader.readSInt64();
+            break;
+
+          case STRING:
+            value = reader.readString();
+            break;
+          case GROUP:
+            value =
+                reader.readGroup(
+                    extension.getMessageDefaultInstance().getClass(), extensionRegistry);
+            break;
+
+          case MESSAGE:
+            value =
+                reader.readMessage(
+                    extension.getMessageDefaultInstance().getClass(), extensionRegistry);
+            break;
+
+          case ENUM:
+            throw new IllegalStateException("Shouldn't reach here.");
+        }
+      }
+      if (extension.isRepeated()) {
+        extensions.addRepeatedField(extension.descriptor, value);
+      } else {
+        switch (extension.getLiteType()) {
+          case MESSAGE:
+          case GROUP:
+            Object oldValue = extensions.getField(extension.descriptor);
+            if (oldValue != null) {
+              value = Internal.mergeMessage(oldValue, value);
+            }
+            break;
+          default:
+            break;
+        }
+        extensions.setField(extension.descriptor, value);
+      }
+    }
+    return unknownFields;
+  }
+
+  @Override
+  int extensionNumber(Map.Entry<?, ?> extension) {
+    GeneratedMessageLite.ExtensionDescriptor descriptor =
+        (GeneratedMessageLite.ExtensionDescriptor) extension.getKey();
+    return descriptor.getNumber();
+  }
+
+  @Override
+  void serializeExtension(Writer writer, Map.Entry<?, ?> extension) throws IOException {
+    GeneratedMessageLite.ExtensionDescriptor descriptor =
+        (GeneratedMessageLite.ExtensionDescriptor) extension.getKey();
+    if (descriptor.isRepeated()) {
+      switch (descriptor.getLiteType()) {
+        case DOUBLE:
+          SchemaUtil.writeDoubleList(
+              descriptor.getNumber(),
+              (List<Double>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case FLOAT:
+          SchemaUtil.writeFloatList(
+              descriptor.getNumber(),
+              (List<Float>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case INT64:
+          SchemaUtil.writeInt64List(
+              descriptor.getNumber(),
+              (List<Long>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case UINT64:
+          SchemaUtil.writeUInt64List(
+              descriptor.getNumber(),
+              (List<Long>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case INT32:
+          SchemaUtil.writeInt32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case FIXED64:
+          SchemaUtil.writeFixed64List(
+              descriptor.getNumber(),
+              (List<Long>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case FIXED32:
+          SchemaUtil.writeFixed32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case BOOL:
+          SchemaUtil.writeBoolList(
+              descriptor.getNumber(),
+              (List<Boolean>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case BYTES:
+          SchemaUtil.writeBytesList(
+              descriptor.getNumber(), (List<ByteString>) extension.getValue(), writer);
+          break;
+        case UINT32:
+          SchemaUtil.writeUInt32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case SFIXED32:
+          SchemaUtil.writeSFixed32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case SFIXED64:
+          SchemaUtil.writeSFixed64List(
+              descriptor.getNumber(),
+              (List<Long>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case SINT32:
+          SchemaUtil.writeSInt32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case SINT64:
+          SchemaUtil.writeSInt64List(
+              descriptor.getNumber(),
+              (List<Long>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case ENUM:
+          SchemaUtil.writeInt32List(
+              descriptor.getNumber(),
+              (List<Integer>) extension.getValue(),
+              writer,
+              descriptor.isPacked());
+          break;
+        case STRING:
+          SchemaUtil.writeStringList(
+              descriptor.getNumber(), (List<String>) extension.getValue(), writer);
+          break;
+        case GROUP:
+          {
+            List<?> data = (List<?>) extension.getValue();
+            if (data != null && !data.isEmpty()) {
+              SchemaUtil.writeGroupList(
+                  descriptor.getNumber(),
+                  (List<?>) extension.getValue(),
+                  writer,
+                  Protobuf.getInstance().schemaFor(data.get(0).getClass()));
+            }
+          }
+          break;
+        case MESSAGE:
+          {
+            List<?> data = (List<?>) extension.getValue();
+            if (data != null && !data.isEmpty()) {
+              SchemaUtil.writeMessageList(
+                  descriptor.getNumber(),
+                  (List<?>) extension.getValue(),
+                  writer,
+                  Protobuf.getInstance().schemaFor(data.get(0).getClass()));
+            }
+          }
+          break;
+      }
+    } else {
+      switch (descriptor.getLiteType()) {
+        case DOUBLE:
+          writer.writeDouble(descriptor.getNumber(), (Double) extension.getValue());
+          break;
+        case FLOAT:
+          writer.writeFloat(descriptor.getNumber(), (Float) extension.getValue());
+          break;
+        case INT64:
+          writer.writeInt64(descriptor.getNumber(), (Long) extension.getValue());
+          break;
+        case UINT64:
+          writer.writeUInt64(descriptor.getNumber(), (Long) extension.getValue());
+          break;
+        case INT32:
+          writer.writeInt32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case FIXED64:
+          writer.writeFixed64(descriptor.getNumber(), (Long) extension.getValue());
+          break;
+        case FIXED32:
+          writer.writeFixed32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case BOOL:
+          writer.writeBool(descriptor.getNumber(), (Boolean) extension.getValue());
+          break;
+        case BYTES:
+          writer.writeBytes(descriptor.getNumber(), (ByteString) extension.getValue());
+          break;
+        case UINT32:
+          writer.writeUInt32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case SFIXED32:
+          writer.writeSFixed32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case SFIXED64:
+          writer.writeSFixed64(descriptor.getNumber(), (Long) extension.getValue());
+          break;
+        case SINT32:
+          writer.writeSInt32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case SINT64:
+          writer.writeSInt64(descriptor.getNumber(), (Long) extension.getValue());
+          break;
+        case ENUM:
+          writer.writeInt32(descriptor.getNumber(), (Integer) extension.getValue());
+          break;
+        case STRING:
+          writer.writeString(descriptor.getNumber(), (String) extension.getValue());
+          break;
+        case GROUP:
+          writer.writeGroup(
+              descriptor.getNumber(),
+              extension.getValue(),
+              Protobuf.getInstance().schemaFor(extension.getValue().getClass()));
+          break;
+        case MESSAGE:
+          writer.writeMessage(
+              descriptor.getNumber(),
+              extension.getValue(),
+              Protobuf.getInstance().schemaFor(extension.getValue().getClass()));
+          break;
+      }
+    }
+  }
+
+  @Override
+  Object findExtensionByNumber(
+      ExtensionRegistryLite extensionRegistry, MessageLite defaultInstance, int number) {
+    return extensionRegistry.findLiteExtensionByNumber(defaultInstance, number);
+  }
+
+  @Override
+  void parseLengthPrefixedMessageSetItem(
+      Reader reader,
+      Object extensionObject,
+      ExtensionRegistryLite extensionRegistry,
+      FieldSet<ExtensionDescriptor> extensions)
+      throws IOException {
+    GeneratedMessageLite.GeneratedExtension<?, ?> extension =
+        (GeneratedMessageLite.GeneratedExtension<?, ?>) extensionObject;
+    Object value =
+        reader.readMessage(extension.getMessageDefaultInstance().getClass(), extensionRegistry);
+    extensions.setField(extension.descriptor, value);
+  }
+
+  @Override
+  void parseMessageSetItem(
+      ByteString data,
+      Object extensionObject,
+      ExtensionRegistryLite extensionRegistry,
+      FieldSet<ExtensionDescriptor> extensions)
+      throws IOException {
+    GeneratedMessageLite.GeneratedExtension<?, ?> extension =
+        (GeneratedMessageLite.GeneratedExtension<?, ?>) extensionObject;
+    Object value = extension.getMessageDefaultInstance().newBuilderForType().buildPartial();
+
+    Reader reader = BinaryReader.newInstance(ByteBuffer.wrap(data.toByteArray()), true);
+
+    Protobuf.getInstance().mergeFrom(value, reader, extensionRegistry);
+    extensions.setField(extension.descriptor, value);
+
+    if (reader.getFieldNumber() != Reader.READ_DONE) {
+      throw InvalidProtocolBufferException.invalidEndTag();
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/ExtensionSchemas.java b/java/core/src/main/java/com/google/protobuf/ExtensionSchemas.java
new file mode 100755
index 0000000..46ce327
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/ExtensionSchemas.java
@@ -0,0 +1,56 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+final class ExtensionSchemas {
+  private static final ExtensionSchema<?> LITE_SCHEMA = new ExtensionSchemaLite();
+  private static final ExtensionSchema<?> FULL_SCHEMA = loadSchemaForFullRuntime();
+
+  private static ExtensionSchema<?> loadSchemaForFullRuntime() {
+    try {
+      Class<?> clazz = Class.forName("com.google.protobuf.ExtensionSchemaFull");
+      return (ExtensionSchema) clazz.getDeclaredConstructor().newInstance();
+    } catch (Exception e) {
+      return null;
+    }
+  }
+
+  static ExtensionSchema<?> lite() {
+    return LITE_SCHEMA;
+  }
+
+  static ExtensionSchema<?> full() {
+    if (FULL_SCHEMA == null) {
+      throw new IllegalStateException("Protobuf runtime is not correctly loaded.");
+    }
+    return FULL_SCHEMA;
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/FieldInfo.java b/java/core/src/main/java/com/google/protobuf/FieldInfo.java
new file mode 100755
index 0000000..71a307a
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/FieldInfo.java
@@ -0,0 +1,577 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.Internal.checkNotNull;
+
+import com.google.protobuf.Internal.EnumVerifier;
+import java.lang.reflect.Field;
+
+/** Information for a single field in a protobuf message class. */
+@ExperimentalApi
+final class FieldInfo implements Comparable<FieldInfo> {
+  private final Field field;
+  private final FieldType type;
+  private final Class<?> messageClass; // The message type for repeated message fields.
+  private final int fieldNumber;
+  private final Field presenceField;
+  private final int presenceMask;
+  private final boolean required;
+  private final boolean enforceUtf8;
+  private final OneofInfo oneof;
+  private final Field cachedSizeField;
+  /**
+   * The actual type stored in the oneof value for this field. Since the oneof value is an {@link
+   * Object}, primitives will store their boxed type. Only valid in conjunction with {@link #oneof}
+   * (both must be either null or non-null.
+   */
+  private final Class<?> oneofStoredType;
+
+  // TODO(liujisi): make map default entry lazy?
+  private final Object mapDefaultEntry;
+
+  private final EnumVerifier enumVerifier;
+
+  /** Constructs a new descriptor for a field. */
+  public static FieldInfo forField(
+      Field field, int fieldNumber, FieldType fieldType, boolean enforceUtf8) {
+    checkFieldNumber(fieldNumber);
+    checkNotNull(field, "field");
+    checkNotNull(fieldType, "fieldType");
+    if (fieldType == FieldType.MESSAGE_LIST || fieldType == FieldType.GROUP_LIST) {
+      throw new IllegalStateException("Shouldn't be called for repeated message fields.");
+    }
+    return new FieldInfo(
+        field,
+        fieldNumber,
+        fieldType,
+        /* messageClass= */ null,
+        /* presenceField= */ null,
+        /* presenceMask= */ 0,
+        /* required= */ false,
+        enforceUtf8,
+        /* oneof= */ null,
+        /* oneofStoredType= */ null,
+        /* mapDefaultEntry= */ null,
+        /* enumVerifier= */ null,
+        /* cachedSizeField= */ null);
+  }
+
+  /** Constructs a new descriptor for a packed field. */
+  public static FieldInfo forPackedField(
+      Field field, int fieldNumber, FieldType fieldType, Field cachedSizeField) {
+    checkFieldNumber(fieldNumber);
+    checkNotNull(field, "field");
+    checkNotNull(fieldType, "fieldType");
+    if (fieldType == FieldType.MESSAGE_LIST || fieldType == FieldType.GROUP_LIST) {
+      throw new IllegalStateException("Shouldn't be called for repeated message fields.");
+    }
+    return new FieldInfo(
+        field,
+        fieldNumber,
+        fieldType,
+        /* messageClass= */ null,
+        /* presenceField= */ null,
+        /* presenceMask= */ 0,
+        /* required= */ false,
+        /* enforceUtf8= */ false,
+        /* oneof= */ null,
+        /* oneofStoredType= */ null,
+        /* mapDefaultEntry= */ null,
+        /* enumVerifier= */ null,
+        cachedSizeField);
+  }
+
+  /** Constructs a new descriptor for a repeated message field. */
+  public static FieldInfo forRepeatedMessageField(
+      Field field, int fieldNumber, FieldType fieldType, Class<?> messageClass) {
+    checkFieldNumber(fieldNumber);
+    checkNotNull(field, "field");
+    checkNotNull(fieldType, "fieldType");
+    checkNotNull(messageClass, "messageClass");
+    return new FieldInfo(
+        field,
+        fieldNumber,
+        fieldType,
+        messageClass,
+        /* presenceField= */ null,
+        /* presenceMask= */ 0,
+        /* required= */ false,
+        /* enforceUtf8= */ false,
+        /* oneof= */ null,
+        /* oneofStoredType= */ null,
+        /* mapDefaultEntry= */ null,
+        /* enumVerifier= */ null,
+        /* cachedSizeField= */ null);
+  }
+
+  public static FieldInfo forFieldWithEnumVerifier(
+      Field field, int fieldNumber, FieldType fieldType, EnumVerifier enumVerifier) {
+    checkFieldNumber(fieldNumber);
+    checkNotNull(field, "field");
+    return new FieldInfo(
+        field,
+        fieldNumber,
+        fieldType,
+        /* messageClass= */ null,
+        /* presenceField= */ null,
+        /* presenceMask= */ 0,
+        /* required= */ false,
+        /* enforceUtf8= */ false,
+        /* oneof= */ null,
+        /* oneofStoredType= */ null,
+        /* mapDefaultEntry= */ null,
+        enumVerifier,
+        /* cachedSizeField= */ null);
+  }
+
+  public static FieldInfo forPackedFieldWithEnumVerifier(
+      Field field,
+      int fieldNumber,
+      FieldType fieldType,
+      EnumVerifier enumVerifier,
+      Field cachedSizeField) {
+    checkFieldNumber(fieldNumber);
+    checkNotNull(field, "field");
+    return new FieldInfo(
+        field,
+        fieldNumber,
+        fieldType,
+        /* messageClass= */ null,
+        /* presenceField= */ null,
+        /* presenceMask= */ 0,
+        /* required= */ false,
+        /* enforceUtf8= */ false,
+        /* oneof= */ null,
+        /* oneofStoredType= */ null,
+        /* mapDefaultEntry= */ null,
+        enumVerifier,
+        cachedSizeField);
+  }
+
+  /** Constructor for a proto2 optional field. */
+  public static FieldInfo forProto2OptionalField(
+      Field field,
+      int fieldNumber,
+      FieldType fieldType,
+      Field presenceField,
+      int presenceMask,
+      boolean enforceUtf8,
+      EnumVerifier enumVerifier) {
+    checkFieldNumber(fieldNumber);
+    checkNotNull(field, "field");
+    checkNotNull(fieldType, "fieldType");
+    checkNotNull(presenceField, "presenceField");
+    if (presenceField != null && !isExactlyOneBitSet(presenceMask)) {
+      throw new IllegalArgumentException(
+          "presenceMask must have exactly one bit set: " + presenceMask);
+    }
+    return new FieldInfo(
+        field,
+        fieldNumber,
+        fieldType,
+        /* messageClass= */ null,
+        presenceField,
+        presenceMask,
+        /* required= */ false,
+        enforceUtf8,
+        /* oneof= */ null,
+        /* oneofStoredType= */ null,
+        /* mapDefaultEntry= */ null,
+        enumVerifier,
+        /* cachedSizeField= */ null);
+  }
+
+  /**
+   * Constructor for a field that is part of a oneof.
+   *
+   * @param fieldNumber the unique field number for this field within the message.
+   * @param fieldType the type of the field (must be non-null).
+   * @param oneof the oneof for which this field is associated (must be non-null).
+   * @param oneofStoredType the actual type stored in the oneof value for this field. Since the
+   *     oneof value is an {@link Object}, primitives will store their boxed type. Must be non-null.
+   * @param enforceUtf8 Only used for string fields. If {@code true}, will enforce UTF-8 on a string
+   *     field.
+   * @return the {@link FieldInfo} describing this field.
+   */
+  public static FieldInfo forOneofMemberField(
+      int fieldNumber,
+      FieldType fieldType,
+      OneofInfo oneof,
+      Class<?> oneofStoredType,
+      boolean enforceUtf8,
+      EnumVerifier enumVerifier) {
+    checkFieldNumber(fieldNumber);
+    checkNotNull(fieldType, "fieldType");
+    checkNotNull(oneof, "oneof");
+    checkNotNull(oneofStoredType, "oneofStoredType");
+    if (!fieldType.isScalar()) {
+      throw new IllegalArgumentException(
+          "Oneof is only supported for scalar fields. Field "
+              + fieldNumber
+              + " is of type "
+              + fieldType);
+    }
+    return new FieldInfo(
+        /* field= */ null,
+        fieldNumber,
+        fieldType,
+        /* messageClass= */ null,
+        /* presenceField= */ null,
+        /* presenceMask= */ 0,
+        /* required= */ false,
+        enforceUtf8,
+        oneof,
+        oneofStoredType,
+        /* mapDefaultEntry= */ null,
+        enumVerifier,
+        /* cachedSizeField= */ null);
+  }
+
+  private static void checkFieldNumber(int fieldNumber) {
+    if (fieldNumber <= 0) {
+      throw new IllegalArgumentException("fieldNumber must be positive: " + fieldNumber);
+    }
+  }
+
+  /** Constructor for a proto2 required field. */
+  public static FieldInfo forProto2RequiredField(
+      Field field,
+      int fieldNumber,
+      FieldType fieldType,
+      Field presenceField,
+      int presenceMask,
+      boolean enforceUtf8,
+      EnumVerifier enumVerifier) {
+    checkFieldNumber(fieldNumber);
+    checkNotNull(field, "field");
+    checkNotNull(fieldType, "fieldType");
+    checkNotNull(presenceField, "presenceField");
+    if (presenceField != null && !isExactlyOneBitSet(presenceMask)) {
+      throw new IllegalArgumentException(
+          "presenceMask must have exactly one bit set: " + presenceMask);
+    }
+    return new FieldInfo(
+        field,
+        fieldNumber,
+        fieldType,
+        /* messageClass= */ null,
+        presenceField,
+        presenceMask,
+        /* required= */ true,
+        enforceUtf8,
+        /* oneof= */ null,
+        /* oneofStoredType= */ null,
+        /* mapDefaultEntry= */ null,
+        /* enumVerifier= */ enumVerifier,
+        /* cachedSizeField= */ null);
+  }
+
+  public static FieldInfo forMapField(
+      Field field, int fieldNumber, Object mapDefaultEntry, EnumVerifier enumVerifier) {
+    checkNotNull(mapDefaultEntry, "mapDefaultEntry");
+    checkFieldNumber(fieldNumber);
+    checkNotNull(field, "field");
+    return new FieldInfo(
+        field,
+        fieldNumber,
+        FieldType.MAP,
+        /* messageClass= */ null,
+        /* presenceField= */ null,
+        /* presenceMask= */ 0,
+        /* required= */ false,
+        /* enforceUtf8= */ true,
+        /* oneof= */ null,
+        /* oneofStoredType= */ null,
+        mapDefaultEntry,
+        enumVerifier,
+        /* cachedSizeField= */ null);
+  }
+
+  private FieldInfo(
+      Field field,
+      int fieldNumber,
+      FieldType type,
+      Class<?> messageClass,
+      Field presenceField,
+      int presenceMask,
+      boolean required,
+      boolean enforceUtf8,
+      OneofInfo oneof,
+      Class<?> oneofStoredType,
+      Object mapDefaultEntry,
+      EnumVerifier enumVerifier,
+      Field cachedSizeField) {
+    this.field = field;
+    this.type = type;
+    this.messageClass = messageClass;
+    this.fieldNumber = fieldNumber;
+    this.presenceField = presenceField;
+    this.presenceMask = presenceMask;
+    this.required = required;
+    this.enforceUtf8 = enforceUtf8;
+    this.oneof = oneof;
+    this.oneofStoredType = oneofStoredType;
+    this.mapDefaultEntry = mapDefaultEntry;
+    this.enumVerifier = enumVerifier;
+    this.cachedSizeField = cachedSizeField;
+  }
+
+  /** Gets the field number for the field. */
+  public int getFieldNumber() {
+    return fieldNumber;
+  }
+
+  /** Gets the subject {@link Field} of this descriptor. */
+  public Field getField() {
+    return field;
+  }
+
+  /** Gets the type information for the field. */
+  public FieldType getType() {
+    return type;
+  }
+
+  /** Gets the oneof for which this field is a member, or {@code null} if not part of a oneof. */
+  public OneofInfo getOneof() {
+    return oneof;
+  }
+
+  /**
+   * Gets the actual type stored in the oneof value by this field. Since the oneof value is an
+   * {@link Object}, primitives will store their boxed type. For non-oneof fields, this will always
+   * be {@code null}.
+   */
+  public Class<?> getOneofStoredType() {
+    return oneofStoredType;
+  }
+
+  /** Gets the {@code EnumVerifier} if the field is an enum field. */
+  public EnumVerifier getEnumVerifier() {
+    return enumVerifier;
+  }
+
+  @Override
+  public int compareTo(FieldInfo o) {
+    return fieldNumber - o.fieldNumber;
+  }
+
+  /**
+   * For repeated message fields, returns the message type of the field. For other fields, returns
+   * {@code null}.
+   */
+  public Class<?> getListElementType() {
+    return messageClass;
+  }
+
+  /** Gets the presence bit field. Only valid for unary fields. For lists, returns {@code null}. */
+  public Field getPresenceField() {
+    return presenceField;
+  }
+
+  public Object getMapDefaultEntry() {
+    return mapDefaultEntry;
+  }
+
+  /**
+   * If {@link #getPresenceField()} is non-{@code null}, returns the mask used to identify the
+   * presence bit for this field in the message.
+   */
+  public int getPresenceMask() {
+    return presenceMask;
+  }
+
+  /** Whether this is a required field. */
+  public boolean isRequired() {
+    return required;
+  }
+
+  /**
+   * Whether a UTF-8 should be enforced on string fields. Only applies to strings and string lists.
+   */
+  public boolean isEnforceUtf8() {
+    return enforceUtf8;
+  }
+
+  public Field getCachedSizeField() {
+    return cachedSizeField;
+  }
+
+  /**
+   * For singular or repeated message fields, returns the message type. For other fields, returns
+   * {@code null}.
+   */
+  public Class<?> getMessageFieldClass() {
+    switch (type) {
+      case MESSAGE:
+      case GROUP:
+        return field != null ? field.getType() : oneofStoredType;
+      case MESSAGE_LIST:
+      case GROUP_LIST:
+        return messageClass;
+      default:
+        return null;
+    }
+  }
+
+  public static Builder newBuilder() {
+    return new Builder();
+  }
+
+  /** A builder for {@link FieldInfo} instances. */
+  public static final class Builder {
+    private Field field;
+    private FieldType type;
+    private int fieldNumber;
+    private Field presenceField;
+    private int presenceMask;
+    private boolean required;
+    private boolean enforceUtf8;
+    private OneofInfo oneof;
+    private Class<?> oneofStoredType;
+    private Object mapDefaultEntry;
+    private EnumVerifier enumVerifier;
+    private Field cachedSizeField;
+
+    private Builder() {}
+
+    /**
+     * Specifies the actual field on the message represented by this field. This should not be
+     * called for oneof member fields.
+     */
+    public Builder withField(Field field) {
+      if (oneof != null) {
+        throw new IllegalStateException("Cannot set field when building a oneof.");
+      }
+      this.field = field;
+      return this;
+    }
+
+    /** Specifies the type of this field. */
+    public Builder withType(FieldType type) {
+      this.type = type;
+      return this;
+    }
+
+    /** Specifies the unique field number for this field within the message. */
+    public Builder withFieldNumber(int fieldNumber) {
+      this.fieldNumber = fieldNumber;
+      return this;
+    }
+
+    /** Specifies proto2 presence information. This should not be called for oneof fields. */
+    public Builder withPresence(Field presenceField, int presenceMask) {
+      this.presenceField = checkNotNull(presenceField, "presenceField");
+      this.presenceMask = presenceMask;
+      return this;
+    }
+
+    /**
+     * Sets the information for building a oneof member field. This is incompatible with {@link
+     * #withField(Field)} and {@link #withPresence(Field, int)}.
+     *
+     * @param oneof the oneof for which this field is associated.
+     * @param oneofStoredType the actual type stored in the oneof value for this field. Since the
+     *     oneof value is an {@link Object}, primitives will store their boxed type.
+     */
+    public Builder withOneof(OneofInfo oneof, Class<?> oneofStoredType) {
+      if (field != null || presenceField != null) {
+        throw new IllegalStateException(
+            "Cannot set oneof when field or presenceField have been provided");
+      }
+      this.oneof = oneof;
+      this.oneofStoredType = oneofStoredType;
+      return this;
+    }
+
+    public Builder withRequired(boolean required) {
+      this.required = required;
+      return this;
+    }
+
+    public Builder withMapDefaultEntry(Object mapDefaultEntry) {
+      this.mapDefaultEntry = mapDefaultEntry;
+      return this;
+    }
+
+    public Builder withEnforceUtf8(boolean enforceUtf8) {
+      this.enforceUtf8 = enforceUtf8;
+      return this;
+    }
+
+    public Builder withEnumVerifier(EnumVerifier enumVerifier) {
+      this.enumVerifier = enumVerifier;
+      return this;
+    }
+
+    public Builder withCachedSizeField(Field cachedSizeField) {
+      this.cachedSizeField = cachedSizeField;
+      return this;
+    }
+
+    public FieldInfo build() {
+      if (oneof != null) {
+        return forOneofMemberField(
+            fieldNumber, type, oneof, oneofStoredType, enforceUtf8, enumVerifier);
+      }
+      if (mapDefaultEntry != null) {
+        return forMapField(field, fieldNumber, mapDefaultEntry, enumVerifier);
+      }
+      if (presenceField != null) {
+        if (required) {
+          return forProto2RequiredField(
+              field, fieldNumber, type, presenceField, presenceMask, enforceUtf8, enumVerifier);
+        } else {
+          return forProto2OptionalField(
+              field, fieldNumber, type, presenceField, presenceMask, enforceUtf8, enumVerifier);
+        }
+      }
+      if (enumVerifier != null) {
+        if (cachedSizeField == null) {
+          return forFieldWithEnumVerifier(field, fieldNumber, type, enumVerifier);
+        } else {
+          return forPackedFieldWithEnumVerifier(
+              field, fieldNumber, type, enumVerifier, cachedSizeField);
+        }
+      } else {
+        if (cachedSizeField == null) {
+          return forField(field, fieldNumber, type, enforceUtf8);
+        } else {
+          return forPackedField(field, fieldNumber, type, cachedSizeField);
+        }
+      }
+    }
+  }
+
+  private static boolean isExactlyOneBitSet(int value) {
+    return value != 0 && (value & (value - 1)) == 0;
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/FieldSet.java b/java/core/src/main/java/com/google/protobuf/FieldSet.java
index 40a3762..ddfd0e5 100644
--- a/java/core/src/main/java/com/google/protobuf/FieldSet.java
+++ b/java/core/src/main/java/com/google/protobuf/FieldSet.java
@@ -218,6 +218,17 @@
     return fields.entrySet().iterator();
   }
 
+  /**
+   * Get an iterator over the fields in the map in descending (i.e. reverse) order. This iterator
+   * should not be leaked out of the protobuf library as it is not protected from mutation when
+   * fields is not immutable.
+   */
+  Iterator<Map.Entry<FieldDescriptorType, Object>> descendingIterator() {
+    if (hasLazyField) {
+      return new LazyIterator<FieldDescriptorType>(fields.descendingEntrySet().iterator());
+    }
+    return fields.descendingEntrySet().iterator();
+  }
 
   /** Useful for implementing {@link Message#hasField(Descriptors.FieldDescriptor)}. */
   public boolean hasField(final FieldDescriptorType descriptor) {
diff --git a/java/core/src/main/java/com/google/protobuf/FieldType.java b/java/core/src/main/java/com/google/protobuf/FieldType.java
new file mode 100755
index 0000000..1b8f9e5
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/FieldType.java
@@ -0,0 +1,346 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.util.List;
+
+/** Enumeration identifying all relevant type information for a protobuf field. */
+@ExperimentalApi
+public enum FieldType {
+  DOUBLE(0, Collection.SCALAR, JavaType.DOUBLE),
+  FLOAT(1, Collection.SCALAR, JavaType.FLOAT),
+  INT64(2, Collection.SCALAR, JavaType.LONG),
+  UINT64(3, Collection.SCALAR, JavaType.LONG),
+  INT32(4, Collection.SCALAR, JavaType.INT),
+  FIXED64(5, Collection.SCALAR, JavaType.LONG),
+  FIXED32(6, Collection.SCALAR, JavaType.INT),
+  BOOL(7, Collection.SCALAR, JavaType.BOOLEAN),
+  STRING(8, Collection.SCALAR, JavaType.STRING),
+  MESSAGE(9, Collection.SCALAR, JavaType.MESSAGE),
+  BYTES(10, Collection.SCALAR, JavaType.BYTE_STRING),
+  UINT32(11, Collection.SCALAR, JavaType.INT),
+  ENUM(12, Collection.SCALAR, JavaType.ENUM),
+  SFIXED32(13, Collection.SCALAR, JavaType.INT),
+  SFIXED64(14, Collection.SCALAR, JavaType.LONG),
+  SINT32(15, Collection.SCALAR, JavaType.INT),
+  SINT64(16, Collection.SCALAR, JavaType.LONG),
+  GROUP(17, Collection.SCALAR, JavaType.MESSAGE),
+  DOUBLE_LIST(18, Collection.VECTOR, JavaType.DOUBLE),
+  FLOAT_LIST(19, Collection.VECTOR, JavaType.FLOAT),
+  INT64_LIST(20, Collection.VECTOR, JavaType.LONG),
+  UINT64_LIST(21, Collection.VECTOR, JavaType.LONG),
+  INT32_LIST(22, Collection.VECTOR, JavaType.INT),
+  FIXED64_LIST(23, Collection.VECTOR, JavaType.LONG),
+  FIXED32_LIST(24, Collection.VECTOR, JavaType.INT),
+  BOOL_LIST(25, Collection.VECTOR, JavaType.BOOLEAN),
+  STRING_LIST(26, Collection.VECTOR, JavaType.STRING),
+  MESSAGE_LIST(27, Collection.VECTOR, JavaType.MESSAGE),
+  BYTES_LIST(28, Collection.VECTOR, JavaType.BYTE_STRING),
+  UINT32_LIST(29, Collection.VECTOR, JavaType.INT),
+  ENUM_LIST(30, Collection.VECTOR, JavaType.ENUM),
+  SFIXED32_LIST(31, Collection.VECTOR, JavaType.INT),
+  SFIXED64_LIST(32, Collection.VECTOR, JavaType.LONG),
+  SINT32_LIST(33, Collection.VECTOR, JavaType.INT),
+  SINT64_LIST(34, Collection.VECTOR, JavaType.LONG),
+  DOUBLE_LIST_PACKED(35, Collection.PACKED_VECTOR, JavaType.DOUBLE),
+  FLOAT_LIST_PACKED(36, Collection.PACKED_VECTOR, JavaType.FLOAT),
+  INT64_LIST_PACKED(37, Collection.PACKED_VECTOR, JavaType.LONG),
+  UINT64_LIST_PACKED(38, Collection.PACKED_VECTOR, JavaType.LONG),
+  INT32_LIST_PACKED(39, Collection.PACKED_VECTOR, JavaType.INT),
+  FIXED64_LIST_PACKED(40, Collection.PACKED_VECTOR, JavaType.LONG),
+  FIXED32_LIST_PACKED(41, Collection.PACKED_VECTOR, JavaType.INT),
+  BOOL_LIST_PACKED(42, Collection.PACKED_VECTOR, JavaType.BOOLEAN),
+  UINT32_LIST_PACKED(43, Collection.PACKED_VECTOR, JavaType.INT),
+  ENUM_LIST_PACKED(44, Collection.PACKED_VECTOR, JavaType.ENUM),
+  SFIXED32_LIST_PACKED(45, Collection.PACKED_VECTOR, JavaType.INT),
+  SFIXED64_LIST_PACKED(46, Collection.PACKED_VECTOR, JavaType.LONG),
+  SINT32_LIST_PACKED(47, Collection.PACKED_VECTOR, JavaType.INT),
+  SINT64_LIST_PACKED(48, Collection.PACKED_VECTOR, JavaType.LONG),
+  GROUP_LIST(49, Collection.VECTOR, JavaType.MESSAGE),
+  MAP(50, Collection.MAP, JavaType.VOID);
+
+  private final JavaType javaType;
+  private final int id;
+  private final Collection collection;
+  private final Class<?> elementType;
+  private final boolean primitiveScalar;
+
+  FieldType(int id, Collection collection, JavaType javaType) {
+    this.id = id;
+    this.collection = collection;
+    this.javaType = javaType;
+
+    switch (collection) {
+      case MAP:
+        elementType = javaType.getBoxedType();
+        break;
+      case VECTOR:
+        elementType = javaType.getBoxedType();
+        break;
+      case SCALAR:
+      default:
+        elementType = null;
+        break;
+    }
+
+    boolean primitiveScalar = false;
+    if (collection == Collection.SCALAR) {
+      switch (javaType) {
+        case BYTE_STRING:
+        case MESSAGE:
+        case STRING:
+          break;
+        default:
+          primitiveScalar = true;
+          break;
+      }
+    }
+    this.primitiveScalar = primitiveScalar;
+  }
+
+  /** A reliable unique identifier for this type. */
+  public int id() {
+    return id;
+  }
+
+  /**
+   * Gets the {@link JavaType} for this field. For lists, this identifies the type of the elements
+   * contained within the list.
+   */
+  public JavaType getJavaType() {
+    return javaType;
+  }
+
+  /** Indicates whether a list field should be represented on the wire in packed form. */
+  public boolean isPacked() {
+    return Collection.PACKED_VECTOR.equals(collection);
+  }
+
+  /**
+   * Indicates whether this field type represents a primitive scalar value. If this is {@code true},
+   * then {@link #isScalar()} will also be {@code true}.
+   */
+  public boolean isPrimitiveScalar() {
+    return primitiveScalar;
+  }
+
+  /** Indicates whether this field type represents a scalar value. */
+  public boolean isScalar() {
+    return collection == Collection.SCALAR;
+  }
+
+  /** Indicates whether this field represents a list of values. */
+  public boolean isList() {
+    return collection.isList();
+  }
+
+  /** Indicates whether this field represents a map. */
+  public boolean isMap() {
+    return collection == Collection.MAP;
+  }
+
+  /** Indicates whether or not this {@link FieldType} can be applied to the given {@link Field}. */
+  public boolean isValidForField(Field field) {
+    if (Collection.VECTOR.equals(collection)) {
+      return isValidForList(field);
+    } else {
+      return javaType.getType().isAssignableFrom(field.getType());
+    }
+  }
+
+  private boolean isValidForList(Field field) {
+    Class<?> clazz = field.getType();
+    if (!javaType.getType().isAssignableFrom(clazz)) {
+      // The field isn't a List type.
+      return false;
+    }
+    Type[] types = EMPTY_TYPES;
+    Type genericType = field.getGenericType();
+    if (genericType instanceof ParameterizedType) {
+      types = ((ParameterizedType) field.getGenericType()).getActualTypeArguments();
+    }
+    Type listParameter = getListParameter(clazz, types);
+    if (!(listParameter instanceof Class)) {
+      // It's a wildcard, we should allow anything in the list.
+      return true;
+    }
+    return elementType.isAssignableFrom((Class<?>) listParameter);
+  }
+
+  /**
+   * Looks up the appropriate {@link FieldType} by it's identifier.
+   *
+   * @return the {@link FieldType} or {@code null} if not found.
+   */
+  /* @Nullable */
+  public static FieldType forId(int id) {
+    if (id < 0 || id >= VALUES.length) {
+      return null;
+    }
+    return VALUES[id];
+  }
+
+  private static final FieldType[] VALUES;
+  private static final Type[] EMPTY_TYPES = new Type[0];
+
+  static {
+    FieldType[] values = values();
+    VALUES = new FieldType[values.length];
+    for (FieldType type : values) {
+      VALUES[type.id] = type;
+    }
+  }
+
+  /**
+   * Given a class, finds a generic super class or interface that extends {@link List}.
+   *
+   * @return the generic super class/interface, or {@code null} if not found.
+   */
+  /* @Nullable */
+  private static Type getGenericSuperList(Class<?> clazz) {
+    // First look at interfaces.
+    Type[] genericInterfaces = clazz.getGenericInterfaces();
+    for (Type genericInterface : genericInterfaces) {
+      if (genericInterface instanceof ParameterizedType) {
+        ParameterizedType parameterizedType = (ParameterizedType) genericInterface;
+        Class<?> rawType = (Class<?>) parameterizedType.getRawType();
+        if (List.class.isAssignableFrom(rawType)) {
+          return genericInterface;
+        }
+      }
+    }
+
+    // Try the subclass
+    Type type = clazz.getGenericSuperclass();
+    if (type instanceof ParameterizedType) {
+      ParameterizedType parameterizedType = (ParameterizedType) type;
+      Class<?> rawType = (Class<?>) parameterizedType.getRawType();
+      if (List.class.isAssignableFrom(rawType)) {
+        return type;
+      }
+    }
+
+    // No super class/interface extends List.
+    return null;
+  }
+
+  /**
+   * Inspects the inheritance hierarchy for the given class and finds the generic type parameter for
+   * {@link List}.
+   *
+   * @param clazz the class to begin the search.
+   * @param realTypes the array of actual type parameters for {@code clazz}. These will be used to
+   *     substitute generic parameters up the inheritance hierarchy. If {@code clazz} does not have
+   *     any generic parameters, this list should be empty.
+   * @return the {@link List} parameter.
+   */
+  private static Type getListParameter(Class<?> clazz, Type[] realTypes) {
+    top:
+    while (clazz != List.class) {
+      // First look at generic subclass and interfaces.
+      Type genericType = getGenericSuperList(clazz);
+      if (genericType instanceof ParameterizedType) {
+        // Replace any generic parameters with the real values.
+        ParameterizedType parameterizedType = (ParameterizedType) genericType;
+        Type[] superArgs = parameterizedType.getActualTypeArguments();
+        for (int i = 0; i < superArgs.length; ++i) {
+          Type superArg = superArgs[i];
+          if (superArg instanceof TypeVariable) {
+            // Get the type variables for this class so that we can match them to the variables
+            // used on the super class.
+            TypeVariable<?>[] clazzParams = clazz.getTypeParameters();
+            if (realTypes.length != clazzParams.length) {
+              throw new RuntimeException("Type array mismatch");
+            }
+
+            // Replace the variable parameter with the real type.
+            boolean foundReplacement = false;
+            for (int j = 0; j < clazzParams.length; ++j) {
+              if (superArg == clazzParams[j]) {
+                Type realType = realTypes[j];
+                superArgs[i] = realType;
+                foundReplacement = true;
+                break;
+              }
+            }
+            if (!foundReplacement) {
+              throw new RuntimeException("Unable to find replacement for " + superArg);
+            }
+          }
+        }
+
+        Class<?> parent = (Class<?>) parameterizedType.getRawType();
+
+        realTypes = superArgs;
+        clazz = parent;
+        continue;
+      }
+
+      // None of the parameterized types inherit List. Just continue up the inheritance hierarchy
+      // toward the List interface until we can identify the parameters.
+      realTypes = EMPTY_TYPES;
+      for (Class<?> iface : clazz.getInterfaces()) {
+        if (List.class.isAssignableFrom(iface)) {
+          clazz = iface;
+          continue top;
+        }
+      }
+      clazz = clazz.getSuperclass();
+    }
+
+    if (realTypes.length != 1) {
+      throw new RuntimeException("Unable to identify parameter type for List<T>");
+    }
+    return realTypes[0];
+  }
+
+  enum Collection {
+    SCALAR(false),
+    VECTOR(true),
+    PACKED_VECTOR(true),
+    MAP(false);
+
+    private final boolean isList;
+
+    Collection(boolean isList) {
+      this.isList = isList;
+    }
+
+    /** @return the isList */
+    public boolean isList() {
+      return isList;
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessageInfoFactory.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessageInfoFactory.java
new file mode 100755
index 0000000..3e3efb9
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageInfoFactory.java
@@ -0,0 +1,65 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/** A factory for message info that is generated into the message itself. */
+@ExperimentalApi
+class GeneratedMessageInfoFactory implements MessageInfoFactory {
+
+  private static final GeneratedMessageInfoFactory instance = new GeneratedMessageInfoFactory();
+
+  // Disallow construction - it's a singleton.
+  private GeneratedMessageInfoFactory() {}
+
+  public static GeneratedMessageInfoFactory getInstance() {
+    return instance;
+  }
+
+  @Override
+  public boolean isSupported(Class<?> messageType) {
+    return GeneratedMessageLite.class.isAssignableFrom(messageType);
+  }
+
+  @Override
+  public MessageInfo messageInfoFor(Class<?> messageType) {
+    if (!GeneratedMessageLite.class.isAssignableFrom(messageType)) {
+      throw new IllegalArgumentException("Unsupported message type: " + messageType.getName());
+    }
+
+    try {
+      return (MessageInfo) GeneratedMessageLite.getDefaultInstance(
+          messageType.asSubclass(GeneratedMessageLite.class))
+          .buildMessageInfo();
+    } catch (Exception e) {
+      throw new RuntimeException("Unable to get message info for " + messageType.getName(), e);
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
index 619ef09..61cbed6 100644
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
@@ -61,12 +61,6 @@
         MessageType extends GeneratedMessageLite<MessageType, BuilderType>,
         BuilderType extends GeneratedMessageLite.Builder<MessageType, BuilderType>>
     extends AbstractMessageLite<MessageType, BuilderType> {
-  // BEGIN REGULAR
-  static final boolean ENABLE_EXPERIMENTAL_RUNTIME_AT_BUILD_TIME = false;
-  // END REGULAR
-  // BEGIN EXPERIMENTAL
-  // static final boolean ENABLE_EXPERIMENTAL_RUNTIME_AT_BUILD_TIME = true;
-  // END EXPERIMENTAL
 
   /** For use by generated code only. Lazily initialized to reduce allocations. */
   protected UnknownFieldSetLite unknownFields = UnknownFieldSetLite.getDefaultInstance();
@@ -115,31 +109,9 @@
     if (memoizedHashCode != 0) {
       return memoizedHashCode;
     }
-    // BEGIN EXPERIMENTAL
-    // memoizedHashCode = Protobuf.getInstance().schemaFor(this).hashCode(this);
-    // return memoizedHashCode;
-    // END EXPERIMENTAL
-    // BEGIN REGULAR
-    HashCodeVisitor visitor = new HashCodeVisitor();
-    visit(visitor, (MessageType) this);
-    memoizedHashCode = visitor.hashCode;
-    return memoizedHashCode;
-    // END REGULAR
-  }
-
-  // BEGIN REGULAR
-  @SuppressWarnings("unchecked") // Guaranteed by runtime
-  int hashCode(HashCodeVisitor visitor) {
-    if (memoizedHashCode == 0) {
-      int inProgressHashCode = visitor.hashCode;
-      visitor.hashCode = 0;
-      visit(visitor, (MessageType) this);
-      memoizedHashCode = visitor.hashCode;
-      visitor.hashCode = inProgressHashCode;
-    }
+    memoizedHashCode = Protobuf.getInstance().schemaFor(this).hashCode(this);
     return memoizedHashCode;
   }
-  // END REGULAR
 
   @SuppressWarnings("unchecked") // Guaranteed by isInstance + runtime
   @Override
@@ -152,37 +124,9 @@
       return false;
     }
 
-    // BEGIN EXPERIMENTAL
-    // return Protobuf.getInstance().schemaFor(this).equals(this, (MessageType) other);
-    // END EXPERIMENTAL
-    // BEGIN REGULAR
-
-    try {
-      visit(EqualsVisitor.INSTANCE, (MessageType) other);
-    } catch (EqualsVisitor.NotEqualsException e) {
-      return false;
-    }
-    return true;
-    // END REGULAR
+    return Protobuf.getInstance().schemaFor(this).equals(this, (MessageType) other);
   }
 
-  // BEGIN REGULAR
-  /** Same as {@link #equals(Object)} but throws {@code NotEqualsException}. */
-  @SuppressWarnings("unchecked") // Guaranteed by isInstance + runtime
-  boolean equals(EqualsVisitor visitor, MessageLite other) {
-    if (this == other) {
-      return true;
-    }
-
-    if (!getDefaultInstanceForType().getClass().isInstance(other)) {
-      return false;
-    }
-
-    visit(visitor, (MessageType) other);
-    return true;
-  }
-  // END REGULAR
-
   // The general strategy for unknown fields is to use an UnknownFieldSetLite that is treated as
   // mutable during the parsing constructor and immutable after. This allows us to avoid
   // any unnecessary intermediary allocations while reducing the generated code size.
@@ -223,13 +167,7 @@
 
   /** Called by subclasses to complete parsing. For use by generated code only. */
   protected void makeImmutable() {
-    // BEGIN REGULAR
-    dynamicMethod(MethodToInvoke.MAKE_IMMUTABLE);
-    unknownFields.makeImmutable();
-    // END REGULAR
-    // BEGIN EXPERIMENTAL
-    // Protobuf.getInstance().schemaFor(this).makeImmutable(this);
-    // END EXPERIMENTAL
+    Protobuf.getInstance().schemaFor(this).makeImmutable(this);
   }
 
   protected final <
@@ -266,17 +204,12 @@
    * <p>For use by generated code only.
    */
   public static enum MethodToInvoke {
-    // BEGIN REGULAR
-    IS_INITIALIZED,
-    VISIT,
-    MERGE_FROM_STREAM,
-    MAKE_IMMUTABLE,
-    // END REGULAR
     // Rely on/modify instance state
     GET_MEMOIZED_IS_INITIALIZED,
     SET_MEMOIZED_IS_INITIALIZED,
 
     // Rely on static state
+    BUILD_MESSAGE_INFO,
     NEW_MUTABLE_INSTANCE,
     NEW_BUILDER,
     GET_DEFAULT_INSTANCE,
@@ -290,10 +223,6 @@
    * count.
    *
    * <ul>
-   *   <li>{@code MERGE_FROM_STREAM} is parameterized with an {@link CodedInputStream} and {@link
-   *       ExtensionRegistryLite}. It consumes the input stream, parsing the contents into the
-   *       returned protocol buffer. If parsing throws an {@link InvalidProtocolBufferException},
-   *       the implementation wraps it in a RuntimeException.
    *   <li>{@code NEW_INSTANCE} returns a new instance of the protocol buffer that has not yet been
    *       made immutable. See {@code MAKE_IMMUTABLE}.
    *   <li>{@code IS_INITIALIZED} returns {@code null} for false and the default instance for true.
@@ -303,9 +232,6 @@
    *   <li>{@code SET_MEMOIZED_IS_INITIALIZED} sets the memoized {@code isInitilaized} byte value to
    *       1 if the first parameter is not null, or to 0 if the first parameter is null.
    *   <li>{@code NEW_BUILDER} returns a {@code BuilderType} instance.
-   *   <li>{@code VISIT} is parameterized with a {@code Visitor} and a {@code MessageType} and
-   *       recursively iterates through the fields side by side between this and the instance.
-   *   <li>{@code MAKE_IMMUTABLE} sets all internal fields to an immutable state.
    * </ul>
    *
    * This method, plus the implementation of the Builder, enables the Builder class to be proguarded
@@ -325,13 +251,6 @@
     return dynamicMethod(method, null, null);
   }
 
-  // BEGIN REGULAR
-  void visit(Visitor visitor, MessageType other) {
-    dynamicMethod(MethodToInvoke.VISIT, visitor, other);
-    unknownFields = visitor.visitUnknownFields(unknownFields, other.unknownFields);
-  }
-  // END REGULAR
-
   @Override
   int getMemoizedSerializedSize() {
     return memoizedSerializedSize;
@@ -342,7 +261,60 @@
     memoizedSerializedSize = size;
   }
 
+  public void writeTo(CodedOutputStream output) throws IOException {
+    writeToInternal(output);
+  }
 
+  public int getSerializedSize() {
+    if (memoizedSerializedSize == -1) {
+      memoizedSerializedSize = getSerializedSizeInternal();
+    }
+    return memoizedSerializedSize;
+  }
+
+  /** Constructs a {@link MessageInfo} for this message type. */
+  Object buildMessageInfo() throws Exception {
+    return dynamicMethod(MethodToInvoke.BUILD_MESSAGE_INFO);
+  }
+
+  private static Map<Object, GeneratedMessageLite<?, ?>> defaultInstanceMap =
+      new ConcurrentHashMap<Object, GeneratedMessageLite<?, ?>>();
+
+  @SuppressWarnings("unchecked")
+  static <T extends GeneratedMessageLite<?, ?>> T getDefaultInstance(Class<T> clazz) {
+    T result = (T) defaultInstanceMap.get(clazz);
+    if (result == null) {
+      // Foo.class does not initialize the class so we need to force the initialization in order to
+      // get the default instance registered.
+      try {
+        Class.forName(clazz.getName(), true, clazz.getClassLoader());
+      } catch (ClassNotFoundException e) {
+        throw new IllegalStateException("Class initialization cannot fail.", e);
+      }
+      result = (T) defaultInstanceMap.get(clazz);
+    }
+    if (result == null) {
+      // On some Samsung devices, this still doesn't return a valid value for some reason. We add a
+      // reflective fallback to keep the device running. See b/114675342.
+      result = (T) UnsafeUtil.allocateInstance(clazz).getDefaultInstanceForType();
+      // A sanity check to ensure that <clinit> was actually invoked.
+      if (result == null) {
+        throw new IllegalStateException();
+      }
+      defaultInstanceMap.put(clazz, result);
+    }
+    return result;
+  }
+
+  protected static <T extends GeneratedMessageLite<?, ?>> void registerDefaultInstance(
+      Class<T> clazz, T defaultInstance) {
+    defaultInstanceMap.put(clazz, defaultInstance);
+  }
+
+  protected static Object newMessageInfo(
+      MessageLite defaultInstance, String info, Object[] objects) {
+    return new RawMessageInfo(defaultInstance, info, objects);
+  }
 
   /**
    * Merge some unknown fields into the {@link UnknownFieldSetLite} for this message.
@@ -437,12 +409,7 @@
     }
 
     private void mergeFromInstance(MessageType dest, MessageType src) {
-      // BEGIN EXPERIMENTAL
-      // Protobuf.getInstance().schemaFor(dest).mergeFrom(dest, src);
-      // END EXPERIMENTAL
-      // BEGIN REGULAR
-      dest.visit(MergeFromVisitor.INSTANCE, src);
-      // END REGULAR
+      Protobuf.getInstance().schemaFor(dest).mergeFrom(dest, src);
     }
 
     @Override
@@ -454,36 +421,26 @@
     public BuilderType mergeFrom(
         byte[] input, int offset, int length, ExtensionRegistryLite extensionRegistry)
         throws InvalidProtocolBufferException {
-      // BEGIN REGULAR
-      return super.mergeFrom(input, offset, length, extensionRegistry);
-      // END REGULAR
-      // BEGIN EXPERIMENTAL
-      // copyOnWrite();
-      // try {
-      //   Protobuf.getInstance().schemaFor(instance).mergeFrom(
-      //       instance, input, offset, offset + length,
-      //       new ArrayDecoders.Registers(extensionRegistry));
-      // } catch (InvalidProtocolBufferException e) {
-      //   throw e;
-      // } catch (IndexOutOfBoundsException e) {
-      //   throw InvalidProtocolBufferException.truncatedMessage();
-      // } catch (IOException e) {
-      //   throw new RuntimeException("Reading from byte array should not throw IOException.", e);
-      // }
-      // return (BuilderType) this;
-      // END EXPERIMENTAL
+      copyOnWrite();
+      try {
+        Protobuf.getInstance().schemaFor(instance).mergeFrom(
+            instance, input, offset, offset + length,
+            new ArrayDecoders.Registers(extensionRegistry));
+      } catch (InvalidProtocolBufferException e) {
+        throw e;
+      } catch (IndexOutOfBoundsException e) {
+        throw InvalidProtocolBufferException.truncatedMessage();
+      } catch (IOException e) {
+        throw new RuntimeException("Reading from byte array should not throw IOException.", e);
+      }
+      return (BuilderType) this;
     }
 
     @Override
     public BuilderType mergeFrom(
         byte[] input, int offset, int length)
         throws InvalidProtocolBufferException {
-      // BEGIN REGULAR
-      return super.mergeFrom(input, offset, length);
-      // END REGULAR
-      // BEGIN EXPERIMENTAL
-      // return mergeFrom(input, offset, length, ExtensionRegistryLite.getEmptyRegistry());
-      // END EXPERIMENTAL
+      return mergeFrom(input, offset, length, ExtensionRegistryLite.getEmptyRegistry());
     }
 
     @Override
@@ -493,15 +450,10 @@
         throws IOException {
       copyOnWrite();
       try {
-        // BEGIN REGULAR
-        instance.dynamicMethod(MethodToInvoke.MERGE_FROM_STREAM, input, extensionRegistry);
-        // END REGULAR
-        // BEGIN EXPERIMENTAL
-        // // TODO(yilunchong): Try to make input with type CodedInpuStream.ArrayDecoder use
-        // // fast path.
-        // Protobuf.getInstance().schemaFor(instance).mergeFrom(
-        //     instance, CodedInputStreamReader.forCodedInput(input), extensionRegistry);
-        // END EXPERIMENTAL
+        // TODO(yilunchong): Try to make input with type CodedInpuStream.ArrayDecoder use
+        // fast path.
+        Protobuf.getInstance().schemaFor(instance).mergeFrom(
+            instance, CodedInputStreamReader.forCodedInput(input), extensionRegistry);
       } catch (RuntimeException e) {
         if (e.getCause() instanceof IOException) {
           throw (IOException) e.getCause();
@@ -553,14 +505,6 @@
       extensions.mergeFrom(((ExtendableMessage) other).extensions);
     }
 
-    // BEGIN REGULAR
-    @Override
-    final void visit(Visitor visitor, MessageType other) {
-      super.visit(visitor, other);
-      extensions = visitor.visitExtensions(extensions, other.extensions);
-    }
-    // END REGULAR
-
     /**
      * Parse an unknown field or an extension. For use by generated code only.
      *
@@ -898,14 +842,6 @@
       return extensions.isInitialized();
     }
 
-    @Override
-    protected final void makeImmutable() {
-      super.makeImmutable();
-      // BEGIN REGULAR
-      extensions.makeImmutable();
-      // END REGULAR
-    }
-
     /**
      * Used by subclasses to serialize extensions. Extension ranges may be interleaved with field
      * numbers, but we must write them in canonical (sorted by field number) order. ExtensionWriter
@@ -1479,13 +1415,7 @@
     if (memoizedIsInitialized == 0) {
       return false;
     }
-    // BEGIN EXPERIMENTAL
-    // boolean isInitialized = Protobuf.getInstance().schemaFor(message).isInitialized(message);
-    // END EXPERIMENTAL
-    // BEGIN REGULAR
-    boolean isInitialized =
-        message.dynamicMethod(MethodToInvoke.IS_INITIALIZED, Boolean.FALSE) != null;
-    // END REGULAR
+    boolean isInitialized = Protobuf.getInstance().schemaFor(message).isInitialized(message);
     if (shouldMemoize) {
       message.dynamicMethod(
           MethodToInvoke.SET_MEMOIZED_IS_INITIALIZED, isInitialized ? message : null);
@@ -1593,23 +1523,16 @@
     @SuppressWarnings("unchecked") // Guaranteed by protoc
     T result = (T) instance.dynamicMethod(MethodToInvoke.NEW_MUTABLE_INSTANCE);
     try {
-      // BEGIN REGULAR
-      result.dynamicMethod(MethodToInvoke.MERGE_FROM_STREAM, input, extensionRegistry);
-      // END REGULAR
-      // BEGIN EXPERIMENTAL
-      // // TODO(yilunchong): Try to make input with type CodedInpuStream.ArrayDecoder use
-      // // fast path.
-      // Protobuf.getInstance().schemaFor(result).mergeFrom(
-      //     result, CodedInputStreamReader.forCodedInput(input), extensionRegistry);
-      // END EXPERIMENTAL
+      // TODO(yilunchong): Try to make input with type CodedInpuStream.ArrayDecoder use
+      // fast path.
+      Protobuf.getInstance().schemaFor(result).mergeFrom(
+          result, CodedInputStreamReader.forCodedInput(input), extensionRegistry);
       result.makeImmutable();
-      // BEGIN EXPERIMENTAL
-      // } catch (IOException e) {
-      //   if (e.getCause() instanceof InvalidProtocolBufferException) {
-      //     throw (InvalidProtocolBufferException) e.getCause();
-      //   }
-      //   throw new InvalidProtocolBufferException(e.getMessage()).setUnfinishedMessage(result);
-      // END EXPERIMENTAL
+    } catch (IOException e) {
+      if (e.getCause() instanceof InvalidProtocolBufferException) {
+        throw (InvalidProtocolBufferException) e.getCause();
+      }
+      throw new InvalidProtocolBufferException(e.getMessage()).setUnfinishedMessage(result);
     } catch (RuntimeException e) {
       if (e.getCause() instanceof InvalidProtocolBufferException) {
         throw (InvalidProtocolBufferException) e.getCause();
@@ -1623,42 +1546,25 @@
   static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom(
       T instance, byte[] input, int offset, int length, ExtensionRegistryLite extensionRegistry)
       throws InvalidProtocolBufferException {
-    // BEGIN REGULAR
-    T message;
+    @SuppressWarnings("unchecked") // Guaranteed by protoc
+    T result = (T) instance.dynamicMethod(MethodToInvoke.NEW_MUTABLE_INSTANCE);
     try {
-      CodedInputStream cis = CodedInputStream.newInstance(input, offset, length);
-      message = parsePartialFrom(instance, cis, extensionRegistry);
-      try {
-        cis.checkLastTagWas(0);
-      } catch (InvalidProtocolBufferException e) {
-        throw e.setUnfinishedMessage(message);
+      Protobuf.getInstance().schemaFor(result).mergeFrom(
+          result, input, offset, offset + length,
+          new ArrayDecoders.Registers(extensionRegistry));
+      result.makeImmutable();
+      if (result.memoizedHashCode != 0) {
+        throw new RuntimeException();
       }
-      return message;
-    } catch (InvalidProtocolBufferException e) {
-      throw e;
+    } catch (IOException e) {
+      if (e.getCause() instanceof InvalidProtocolBufferException) {
+        throw (InvalidProtocolBufferException) e.getCause();
+      }
+      throw new InvalidProtocolBufferException(e.getMessage()).setUnfinishedMessage(result);
+    } catch (IndexOutOfBoundsException e) {
+      throw InvalidProtocolBufferException.truncatedMessage().setUnfinishedMessage(result);
     }
-    // END REGULAR
-    // BEGIN EXPERIMENTAL
-    // @SuppressWarnings("unchecked") // Guaranteed by protoc
-    // T result = (T) instance.dynamicMethod(MethodToInvoke.NEW_MUTABLE_INSTANCE);
-    // try {
-    //   Protobuf.getInstance().schemaFor(result).mergeFrom(
-    //       result, input, offset, offset + length,
-    //       new ArrayDecoders.Registers(extensionRegistry));
-    //   result.makeImmutable();
-    //   if (result.memoizedHashCode != 0) {
-    //     throw new RuntimeException();
-    //   }
-    // } catch (IOException e) {
-    //   if (e.getCause() instanceof InvalidProtocolBufferException) {
-    //     throw (InvalidProtocolBufferException) e.getCause();
-    //   }
-    //   throw new InvalidProtocolBufferException(e.getMessage()).setUnfinishedMessage(result);
-    // } catch (IndexOutOfBoundsException e) {
-    //   throw InvalidProtocolBufferException.truncatedMessage().setUnfinishedMessage(result);
-    // }
-    // return result;
-    // END EXPERIMENTAL
+    return result;
   }
 
   protected static <T extends GeneratedMessageLite<T, ?>> T parsePartialFrom(
@@ -1825,701 +1731,4 @@
     }
     return message;
   }
-
-  // BEGIN REGULAR
-  /**
-   * An abstract visitor that the generated code calls into that we use to implement various
-   * features. Fields that are not members of oneofs are always visited. Members of a oneof are only
-   * visited when they are the set oneof case value on the "other" proto. The visitOneofNotSet
-   * method is invoked if other's oneof case is not set.
-   */
-  protected interface Visitor {
-    boolean visitBoolean(boolean minePresent, boolean mine, boolean otherPresent, boolean other);
-
-    int visitInt(boolean minePresent, int mine, boolean otherPresent, int other);
-
-    double visitDouble(boolean minePresent, double mine, boolean otherPresent, double other);
-
-    float visitFloat(boolean minePresent, float mine, boolean otherPresent, float other);
-
-    long visitLong(boolean minePresent, long mine, boolean otherPresent, long other);
-
-    String visitString(boolean minePresent, String mine, boolean otherPresent, String other);
-
-    ByteString visitByteString(
-        boolean minePresent, ByteString mine, boolean otherPresent, ByteString other);
-
-    Object visitOneofBoolean(boolean minePresent, Object mine, Object other);
-
-    Object visitOneofInt(boolean minePresent, Object mine, Object other);
-
-    Object visitOneofDouble(boolean minePresent, Object mine, Object other);
-
-    Object visitOneofFloat(boolean minePresent, Object mine, Object other);
-
-    Object visitOneofLong(boolean minePresent, Object mine, Object other);
-
-    Object visitOneofString(boolean minePresent, Object mine, Object other);
-
-    Object visitOneofByteString(boolean minePresent, Object mine, Object other);
-
-    Object visitOneofMessage(boolean minePresent, Object mine, Object other);
-
-    void visitOneofNotSet(boolean minePresent);
-
-    /** Message fields use null sentinals. */
-    <T extends MessageLite> T visitMessage(T mine, T other);
-
-    <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other);
-
-    BooleanList visitBooleanList(BooleanList mine, BooleanList other);
-
-    IntList visitIntList(IntList mine, IntList other);
-
-    DoubleList visitDoubleList(DoubleList mine, DoubleList other);
-
-    FloatList visitFloatList(FloatList mine, FloatList other);
-
-    LongList visitLongList(LongList mine, LongList other);
-
-    FieldSet<ExtensionDescriptor> visitExtensions(
-        FieldSet<ExtensionDescriptor> mine, FieldSet<ExtensionDescriptor> other);
-
-    UnknownFieldSetLite visitUnknownFields(UnknownFieldSetLite mine, UnknownFieldSetLite other);
-
-    <K, V> MapFieldLite<K, V> visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other);
-  }
-
-  /** Implements equals. Throws a {@link NotEqualsException} when not equal. */
-  static class EqualsVisitor implements Visitor {
-
-    static final class NotEqualsException extends RuntimeException {}
-
-    static final EqualsVisitor INSTANCE = new EqualsVisitor();
-
-    static final NotEqualsException NOT_EQUALS = new NotEqualsException();
-
-    private EqualsVisitor() {}
-
-    @Override
-    public boolean visitBoolean(
-        boolean minePresent, boolean mine, boolean otherPresent, boolean other) {
-      if (minePresent != otherPresent || mine != other) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public int visitInt(boolean minePresent, int mine, boolean otherPresent, int other) {
-      if (minePresent != otherPresent || mine != other) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public double visitDouble(
-        boolean minePresent, double mine, boolean otherPresent, double other) {
-      if (minePresent != otherPresent || mine != other) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public float visitFloat(boolean minePresent, float mine, boolean otherPresent, float other) {
-      if (minePresent != otherPresent || mine != other) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public long visitLong(boolean minePresent, long mine, boolean otherPresent, long other) {
-      if (minePresent != otherPresent || mine != other) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public String visitString(
-        boolean minePresent, String mine, boolean otherPresent, String other) {
-      if (minePresent != otherPresent || !mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public ByteString visitByteString(
-        boolean minePresent, ByteString mine, boolean otherPresent, ByteString other) {
-      if (minePresent != otherPresent || !mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public Object visitOneofBoolean(boolean minePresent, Object mine, Object other) {
-      if (minePresent && mine.equals(other)) {
-        return mine;
-      }
-      throw NOT_EQUALS;
-    }
-
-    @Override
-    public Object visitOneofInt(boolean minePresent, Object mine, Object other) {
-      if (minePresent && mine.equals(other)) {
-        return mine;
-      }
-      throw NOT_EQUALS;
-    }
-
-    @Override
-    public Object visitOneofDouble(boolean minePresent, Object mine, Object other) {
-      if (minePresent && mine.equals(other)) {
-        return mine;
-      }
-      throw NOT_EQUALS;
-    }
-
-    @Override
-    public Object visitOneofFloat(boolean minePresent, Object mine, Object other) {
-      if (minePresent && mine.equals(other)) {
-        return mine;
-      }
-      throw NOT_EQUALS;
-    }
-
-    @Override
-    public Object visitOneofLong(boolean minePresent, Object mine, Object other) {
-      if (minePresent && mine.equals(other)) {
-        return mine;
-      }
-      throw NOT_EQUALS;
-    }
-
-    @Override
-    public Object visitOneofString(boolean minePresent, Object mine, Object other) {
-      if (minePresent && mine.equals(other)) {
-        return mine;
-      }
-      throw NOT_EQUALS;
-    }
-
-    @Override
-    public Object visitOneofByteString(boolean minePresent, Object mine, Object other) {
-      if (minePresent && mine.equals(other)) {
-        return mine;
-      }
-      throw NOT_EQUALS;
-    }
-
-    @Override
-    public Object visitOneofMessage(boolean minePresent, Object mine, Object other) {
-      if (minePresent && ((GeneratedMessageLite<?, ?>) mine).equals(this, (MessageLite) other)) {
-        return mine;
-      }
-      throw NOT_EQUALS;
-    }
-
-    @Override
-    public void visitOneofNotSet(boolean minePresent) {
-      if (minePresent) {
-        throw NOT_EQUALS;
-      }
-    }
-
-    @Override
-    public <T extends MessageLite> T visitMessage(T mine, T other) {
-      if (mine == null && other == null) {
-        return null;
-      }
-
-      if (mine == null || other == null) {
-        throw NOT_EQUALS;
-      }
-
-      ((GeneratedMessageLite<?, ?>) mine).equals(this, other);
-
-      return mine;
-    }
-
-    @Override
-    public <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other) {
-      if (!mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public BooleanList visitBooleanList(BooleanList mine, BooleanList other) {
-      if (!mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public IntList visitIntList(IntList mine, IntList other) {
-      if (!mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public DoubleList visitDoubleList(DoubleList mine, DoubleList other) {
-      if (!mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public FloatList visitFloatList(FloatList mine, FloatList other) {
-      if (!mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public LongList visitLongList(LongList mine, LongList other) {
-      if (!mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public FieldSet<ExtensionDescriptor> visitExtensions(
-        FieldSet<ExtensionDescriptor> mine, FieldSet<ExtensionDescriptor> other) {
-      if (!mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public UnknownFieldSetLite visitUnknownFields(
-        UnknownFieldSetLite mine, UnknownFieldSetLite other) {
-      if (!mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-
-    @Override
-    public <K, V> MapFieldLite<K, V> visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other) {
-      if (!mine.equals(other)) {
-        throw NOT_EQUALS;
-      }
-      return mine;
-    }
-  }
-
-  /** Implements hashCode by accumulating state. */
-  static class HashCodeVisitor implements Visitor {
-
-    // The caller must ensure that the visitor is invoked parameterized with this and this such that
-    // other is this. This is required due to how oneof cases are handled. See the class comment
-    // on Visitor for more information.
-
-    int hashCode = 0;
-
-    @Override
-    public boolean visitBoolean(
-        boolean minePresent, boolean mine, boolean otherPresent, boolean other) {
-      hashCode = (53 * hashCode) + Internal.hashBoolean(mine);
-      return mine;
-    }
-
-    @Override
-    public int visitInt(boolean minePresent, int mine, boolean otherPresent, int other) {
-      hashCode = (53 * hashCode) + mine;
-      return mine;
-    }
-
-    @Override
-    public double visitDouble(
-        boolean minePresent, double mine, boolean otherPresent, double other) {
-      hashCode = (53 * hashCode) + Internal.hashLong(Double.doubleToLongBits(mine));
-      return mine;
-    }
-
-    @Override
-    public float visitFloat(boolean minePresent, float mine, boolean otherPresent, float other) {
-      hashCode = (53 * hashCode) + Float.floatToIntBits(mine);
-      return mine;
-    }
-
-    @Override
-    public long visitLong(boolean minePresent, long mine, boolean otherPresent, long other) {
-      hashCode = (53 * hashCode) + Internal.hashLong(mine);
-      return mine;
-    }
-
-    @Override
-    public String visitString(
-        boolean minePresent, String mine, boolean otherPresent, String other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public ByteString visitByteString(
-        boolean minePresent, ByteString mine, boolean otherPresent, ByteString other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public Object visitOneofBoolean(boolean minePresent, Object mine, Object other) {
-      hashCode = (53 * hashCode) + Internal.hashBoolean(((Boolean) mine));
-      return mine;
-    }
-
-    @Override
-    public Object visitOneofInt(boolean minePresent, Object mine, Object other) {
-      hashCode = (53 * hashCode) + (Integer) mine;
-      return mine;
-    }
-
-    @Override
-    public Object visitOneofDouble(boolean minePresent, Object mine, Object other) {
-      hashCode = (53 * hashCode) + Internal.hashLong(Double.doubleToLongBits((Double) mine));
-      return mine;
-    }
-
-    @Override
-    public Object visitOneofFloat(boolean minePresent, Object mine, Object other) {
-      hashCode = (53 * hashCode) + Float.floatToIntBits((Float) mine);
-      return mine;
-    }
-
-    @Override
-    public Object visitOneofLong(boolean minePresent, Object mine, Object other) {
-      hashCode = (53 * hashCode) + Internal.hashLong((Long) mine);
-      return mine;
-    }
-
-    @Override
-    public Object visitOneofString(boolean minePresent, Object mine, Object other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public Object visitOneofByteString(boolean minePresent, Object mine, Object other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public Object visitOneofMessage(boolean minePresent, Object mine, Object other) {
-      return visitMessage((MessageLite) mine, (MessageLite) other);
-    }
-
-    @Override
-    public void visitOneofNotSet(boolean minePresent) {
-      if (minePresent) {
-        throw new IllegalStateException(); // Can't happen if other == this.
-      }
-    }
-
-    @Override
-    public <T extends MessageLite> T visitMessage(T mine, T other) {
-      final int protoHash;
-      if (mine != null) {
-        if (mine instanceof GeneratedMessageLite) {
-          protoHash = ((GeneratedMessageLite) mine).hashCode(this);
-        } else {
-          protoHash = mine.hashCode();
-        }
-      } else {
-        protoHash = 37;
-      }
-      hashCode = (53 * hashCode) + protoHash;
-      return mine;
-    }
-
-    @Override
-    public <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public BooleanList visitBooleanList(BooleanList mine, BooleanList other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public IntList visitIntList(IntList mine, IntList other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public DoubleList visitDoubleList(DoubleList mine, DoubleList other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public FloatList visitFloatList(FloatList mine, FloatList other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public LongList visitLongList(LongList mine, LongList other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public FieldSet<ExtensionDescriptor> visitExtensions(
-        FieldSet<ExtensionDescriptor> mine, FieldSet<ExtensionDescriptor> other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public UnknownFieldSetLite visitUnknownFields(
-        UnknownFieldSetLite mine, UnknownFieldSetLite other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-
-    @Override
-    public <K, V> MapFieldLite<K, V> visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other) {
-      hashCode = (53 * hashCode) + mine.hashCode();
-      return mine;
-    }
-  }
-
-  /** Implements field merging semantics over the visitor interface. */
-  protected static class MergeFromVisitor implements Visitor {
-
-    public static final MergeFromVisitor INSTANCE = new MergeFromVisitor();
-
-    private MergeFromVisitor() {}
-
-    @Override
-    public boolean visitBoolean(
-        boolean minePresent, boolean mine, boolean otherPresent, boolean other) {
-      return otherPresent ? other : mine;
-    }
-
-    @Override
-    public int visitInt(boolean minePresent, int mine, boolean otherPresent, int other) {
-      return otherPresent ? other : mine;
-    }
-
-    @Override
-    public double visitDouble(
-        boolean minePresent, double mine, boolean otherPresent, double other) {
-      return otherPresent ? other : mine;
-    }
-
-    @Override
-    public float visitFloat(boolean minePresent, float mine, boolean otherPresent, float other) {
-      return otherPresent ? other : mine;
-    }
-
-    @Override
-    public long visitLong(boolean minePresent, long mine, boolean otherPresent, long other) {
-      return otherPresent ? other : mine;
-    }
-
-    @Override
-    public String visitString(
-        boolean minePresent, String mine, boolean otherPresent, String other) {
-      return otherPresent ? other : mine;
-    }
-
-    @Override
-    public ByteString visitByteString(
-        boolean minePresent, ByteString mine, boolean otherPresent, ByteString other) {
-      return otherPresent ? other : mine;
-    }
-
-    @Override
-    public Object visitOneofBoolean(boolean minePresent, Object mine, Object other) {
-      return other;
-    }
-
-    @Override
-    public Object visitOneofInt(boolean minePresent, Object mine, Object other) {
-      return other;
-    }
-
-    @Override
-    public Object visitOneofDouble(boolean minePresent, Object mine, Object other) {
-      return other;
-    }
-
-    @Override
-    public Object visitOneofFloat(boolean minePresent, Object mine, Object other) {
-      return other;
-    }
-
-    @Override
-    public Object visitOneofLong(boolean minePresent, Object mine, Object other) {
-      return other;
-    }
-
-    @Override
-    public Object visitOneofString(boolean minePresent, Object mine, Object other) {
-      return other;
-    }
-
-    @Override
-    public Object visitOneofByteString(boolean minePresent, Object mine, Object other) {
-      return other;
-    }
-
-    @Override
-    public Object visitOneofMessage(boolean minePresent, Object mine, Object other) {
-      if (minePresent) {
-        return visitMessage((MessageLite) mine, (MessageLite) other);
-      }
-      return other;
-    }
-
-    @Override
-    public void visitOneofNotSet(boolean minePresent) {
-      return;
-    }
-
-    @SuppressWarnings("unchecked") // Guaranteed by runtime.
-    @Override
-    public <T extends MessageLite> T visitMessage(T mine, T other) {
-      if (mine != null && other != null) {
-        return (T) mine.toBuilder().mergeFrom(other).build();
-      }
-
-      return mine != null ? mine : other;
-    }
-
-    @Override
-    public <T> ProtobufList<T> visitList(ProtobufList<T> mine, ProtobufList<T> other) {
-      int size = mine.size();
-      int otherSize = other.size();
-      if (size > 0 && otherSize > 0) {
-        if (!mine.isModifiable()) {
-          mine = mine.mutableCopyWithCapacity(size + otherSize);
-        }
-        mine.addAll(other);
-      }
-
-      return size > 0 ? mine : other;
-    }
-
-    @Override
-    public BooleanList visitBooleanList(BooleanList mine, BooleanList other) {
-      int size = mine.size();
-      int otherSize = other.size();
-      if (size > 0 && otherSize > 0) {
-        if (!mine.isModifiable()) {
-          mine = mine.mutableCopyWithCapacity(size + otherSize);
-        }
-        mine.addAll(other);
-      }
-
-      return size > 0 ? mine : other;
-    }
-
-    @Override
-    public IntList visitIntList(IntList mine, IntList other) {
-      int size = mine.size();
-      int otherSize = other.size();
-      if (size > 0 && otherSize > 0) {
-        if (!mine.isModifiable()) {
-          mine = mine.mutableCopyWithCapacity(size + otherSize);
-        }
-        mine.addAll(other);
-      }
-
-      return size > 0 ? mine : other;
-    }
-
-    @Override
-    public DoubleList visitDoubleList(DoubleList mine, DoubleList other) {
-      int size = mine.size();
-      int otherSize = other.size();
-      if (size > 0 && otherSize > 0) {
-        if (!mine.isModifiable()) {
-          mine = mine.mutableCopyWithCapacity(size + otherSize);
-        }
-        mine.addAll(other);
-      }
-
-      return size > 0 ? mine : other;
-    }
-
-    @Override
-    public FloatList visitFloatList(FloatList mine, FloatList other) {
-      int size = mine.size();
-      int otherSize = other.size();
-      if (size > 0 && otherSize > 0) {
-        if (!mine.isModifiable()) {
-          mine = mine.mutableCopyWithCapacity(size + otherSize);
-        }
-        mine.addAll(other);
-      }
-
-      return size > 0 ? mine : other;
-    }
-
-    @Override
-    public LongList visitLongList(LongList mine, LongList other) {
-      int size = mine.size();
-      int otherSize = other.size();
-      if (size > 0 && otherSize > 0) {
-        if (!mine.isModifiable()) {
-          mine = mine.mutableCopyWithCapacity(size + otherSize);
-        }
-        mine.addAll(other);
-      }
-
-      return size > 0 ? mine : other;
-    }
-
-    @Override
-    public FieldSet<ExtensionDescriptor> visitExtensions(
-        FieldSet<ExtensionDescriptor> mine, FieldSet<ExtensionDescriptor> other) {
-      if (mine.isImmutable()) {
-        mine = mine.clone();
-      }
-      mine.mergeFrom(other);
-      return mine;
-    }
-
-    @Override
-    public UnknownFieldSetLite visitUnknownFields(
-        UnknownFieldSetLite mine, UnknownFieldSetLite other) {
-      return other == UnknownFieldSetLite.getDefaultInstance()
-          ? mine
-          : UnknownFieldSetLite.mutableCopyOf(mine, other);
-    }
-
-    @Override
-    public <K, V> MapFieldLite<K, V> visitMap(MapFieldLite<K, V> mine, MapFieldLite<K, V> other) {
-      if (!other.isEmpty()) {
-        if (!mine.isMutable()) {
-          mine = mine.mutableCopy();
-        }
-        mine.mergeFrom(other);
-      }
-      return mine;
-    }
-  }
-  // END REGULAR
 }
diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
index e9eb34f..0ed7243 100644
--- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
+++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageV3.java
@@ -459,6 +459,29 @@
 
 
   /**
+   * This class is used to make a generated protected method inaccessible from user's code (e.g.,
+   * the {@link #newInstance} method below). When this class is used as a parameter's type in a
+   * generated protected method, the method is visible to user's code in the same package, but
+   * since the constructor of this class is private to protobuf runtime, user's code can't obtain
+   * an instance of this class and as such can't actually make a method call on the protected
+   * method.
+   */
+  protected static final class UnusedPrivateParameter {
+    static final UnusedPrivateParameter INSTANCE = new UnusedPrivateParameter();
+
+    private UnusedPrivateParameter() {
+    }
+  }
+
+  /**
+   * Creates a new instance of this message type. Overridden in the generated code.
+   */
+  @SuppressWarnings({"unused"})
+  protected Object newInstance(UnusedPrivateParameter unused) {
+    throw new UnsupportedOperationException("This method must be overridden by the subclass.");
+  }
+
+  /**
    * Used by parsing constructors in generated classes.
    */
   protected void makeExtensionsImmutable() {
diff --git a/java/core/src/main/java/com/google/protobuf/Internal.java b/java/core/src/main/java/com/google/protobuf/Internal.java
index 713ccb5..15deb37 100644
--- a/java/core/src/main/java/com/google/protobuf/Internal.java
+++ b/java/core/src/main/java/com/google/protobuf/Internal.java
@@ -540,6 +540,24 @@
         }
         return valueConverter.doForward(oldValue);
       }
+
+      @Override
+      public boolean equals(Object o) {
+        if (o == this) {
+          return true;
+        }
+        if (!(o instanceof Map.Entry)) {
+          return false;
+        }
+        @SuppressWarnings("unchecked")
+        Map.Entry<?, ?> other = (Map.Entry<?, ?>) o;
+        return getKey().equals(other.getKey()) && getValue().equals(getValue());
+      }
+
+      @Override
+      public int hashCode() {
+        return realEntry.hashCode();
+      }
     }
   }
 
diff --git a/java/core/src/main/java/com/google/protobuf/JavaType.java b/java/core/src/main/java/com/google/protobuf/JavaType.java
new file mode 100755
index 0000000..770aa9e
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/JavaType.java
@@ -0,0 +1,76 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/** Enum that identifies the Java types required to store protobuf fields. */
+@ExperimentalApi
+public enum JavaType {
+  VOID(Void.class, Void.class, null),
+  INT(int.class, Integer.class, 0),
+  LONG(long.class, Long.class, 0L),
+  FLOAT(float.class, Float.class, 0F),
+  DOUBLE(double.class, Double.class, 0D),
+  BOOLEAN(boolean.class, Boolean.class, false),
+  STRING(String.class, String.class, ""),
+  BYTE_STRING(ByteString.class, ByteString.class, ByteString.EMPTY),
+  ENUM(int.class, Integer.class, null),
+  MESSAGE(Object.class, Object.class, null);
+
+  private final Class<?> type;
+  private final Class<?> boxedType;
+  private final Object defaultDefault;
+
+  JavaType(Class<?> type, Class<?> boxedType, Object defaultDefault) {
+    this.type = type;
+    this.boxedType = boxedType;
+    this.defaultDefault = defaultDefault;
+  }
+
+  /** The default default value for fields of this type, if it's a primitive type. */
+  public Object getDefaultDefault() {
+    return defaultDefault;
+  }
+
+  /** Gets the required type for a field that would hold a value of this type. */
+  public Class<?> getType() {
+    return type;
+  }
+
+  /** @return the boxedType */
+  public Class<?> getBoxedType() {
+    return boxedType;
+  }
+
+  /** Indicates whether or not this {@link JavaType} can be applied to a field of the given type. */
+  public boolean isValidType(Class<?> t) {
+    return type.isAssignableFrom(t);
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/LazyFieldLite.java b/java/core/src/main/java/com/google/protobuf/LazyFieldLite.java
index 5651e13..d6b594d 100644
--- a/java/core/src/main/java/com/google/protobuf/LazyFieldLite.java
+++ b/java/core/src/main/java/com/google/protobuf/LazyFieldLite.java
@@ -388,6 +388,18 @@
     }
   }
 
+  /** Writes this lazy field into a {@link Writer}. */
+  void writeTo(Writer writer, int fieldNumber) throws IOException {
+    if (memoizedBytes != null) {
+      writer.writeBytes(fieldNumber, memoizedBytes);
+    } else if (delayedBytes != null) {
+      writer.writeBytes(fieldNumber, delayedBytes);
+    } else if (value != null) {
+      writer.writeMessage(fieldNumber, value);
+    } else {
+      writer.writeBytes(fieldNumber, ByteString.EMPTY);
+    }
+  }
 
   /** Might lazily parse the bytes that were previously passed in. Is thread-safe. */
   protected void ensureInitialized(MessageLite defaultInstance) {
diff --git a/java/core/src/main/java/com/google/protobuf/ListFieldSchema.java b/java/core/src/main/java/com/google/protobuf/ListFieldSchema.java
new file mode 100755
index 0000000..ebc8561
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/ListFieldSchema.java
@@ -0,0 +1,190 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.Internal.ProtobufList;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Utility class that aids in properly manipulating list fields for either the lite or full runtime.
+ */
+abstract class ListFieldSchema {
+  // Disallow construction.
+  private ListFieldSchema() {}
+
+  private static final ListFieldSchema FULL_INSTANCE = new ListFieldSchemaFull();
+  private static final ListFieldSchema LITE_INSTANCE = new ListFieldSchemaLite();
+
+  abstract <L> List<L> mutableListAt(Object msg, long offset);
+
+  abstract void makeImmutableListAt(Object msg, long offset);
+
+  abstract <L> void mergeListsAt(Object msg, Object otherMsg, long offset);
+
+  static ListFieldSchema full() {
+    return FULL_INSTANCE;
+  }
+
+  static ListFieldSchema lite() {
+    return LITE_INSTANCE;
+  }
+
+  /** Implementation for the full runtime. */
+  private static final class ListFieldSchemaFull extends ListFieldSchema {
+
+    private static final Class<?> UNMODIFIABLE_LIST_CLASS =
+        Collections.unmodifiableList(Collections.emptyList()).getClass();
+
+    @Override
+    <L> List<L> mutableListAt(Object message, long offset) {
+      return mutableListAt(message, offset, AbstractProtobufList.DEFAULT_CAPACITY);
+    }
+
+    @Override
+    void makeImmutableListAt(Object message, long offset) {
+      List<?> list = (List<?>) UnsafeUtil.getObject(message, offset);
+      Object immutable = null;
+      if (list instanceof LazyStringList) {
+        immutable = ((LazyStringList) list).getUnmodifiableView();
+      } else if (UNMODIFIABLE_LIST_CLASS.isAssignableFrom(list.getClass())) {
+        // already immutable
+        return;
+      } else if (list instanceof PrimitiveNonBoxingCollection && list instanceof ProtobufList) {
+        if (((ProtobufList<?>) list).isModifiable()) {
+          ((ProtobufList<?>) list).makeImmutable();
+        }
+        return;
+      } else {
+        immutable = Collections.unmodifiableList((List<?>) list);
+      }
+      UnsafeUtil.putObject(message, offset, immutable);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static <L> List<L> mutableListAt(Object message, long offset, int additionalCapacity) {
+      List<L> list = getList(message, offset);
+      if (list.isEmpty()) {
+        if (list instanceof LazyStringList) {
+          list = (List<L>) new LazyStringArrayList(additionalCapacity);
+        } else if (list instanceof PrimitiveNonBoxingCollection && list instanceof ProtobufList) {
+          list = ((ProtobufList<L>) list).mutableCopyWithCapacity(additionalCapacity);
+        } else {
+          list = new ArrayList<L>(additionalCapacity);
+        }
+        UnsafeUtil.putObject(message, offset, list);
+      } else if (UNMODIFIABLE_LIST_CLASS.isAssignableFrom(list.getClass())) {
+        ArrayList<L> newList = new ArrayList<L>(list.size() + additionalCapacity);
+        newList.addAll(list);
+        list = newList;
+        UnsafeUtil.putObject(message, offset, list);
+      } else if (list instanceof UnmodifiableLazyStringList) {
+        LazyStringArrayList newList = new LazyStringArrayList(list.size() + additionalCapacity);
+        newList.addAll((UnmodifiableLazyStringList) list);
+        list = (List<L>) newList;
+        UnsafeUtil.putObject(message, offset, list);
+      } else if (list instanceof PrimitiveNonBoxingCollection
+          && list instanceof ProtobufList
+          && !((ProtobufList<L>) list).isModifiable()) {
+        list = ((ProtobufList<L>) list).mutableCopyWithCapacity(list.size() + additionalCapacity);
+        UnsafeUtil.putObject(message, offset, list);
+      }
+      return list;
+    }
+
+    @Override
+    <E> void mergeListsAt(Object msg, Object otherMsg, long offset) {
+      List<E> other = getList(otherMsg, offset);
+      List<E> mine = mutableListAt(msg, offset, other.size());
+
+      int size = mine.size();
+      int otherSize = other.size();
+      if (size > 0 && otherSize > 0) {
+        mine.addAll(other);
+      }
+
+      List<E> merged = size > 0 ? mine : other;
+      UnsafeUtil.putObject(msg, offset, merged);
+    }
+
+    @SuppressWarnings("unchecked")
+    static <E> List<E> getList(Object message, long offset) {
+      return (List<E>) UnsafeUtil.getObject(message, offset);
+    }
+  }
+
+  /** Implementation for the lite runtime. */
+  private static final class ListFieldSchemaLite extends ListFieldSchema {
+
+    @Override
+    <L> List<L> mutableListAt(Object message, long offset) {
+      ProtobufList<L> list = getProtobufList(message, offset);
+      if (!list.isModifiable()) {
+        int size = list.size();
+        list =
+            list.mutableCopyWithCapacity(
+                size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2);
+        UnsafeUtil.putObject(message, offset, list);
+      }
+      return list;
+    }
+
+    @Override
+    void makeImmutableListAt(Object message, long offset) {
+      ProtobufList<?> list = getProtobufList(message, offset);
+      list.makeImmutable();
+    }
+
+    @Override
+    <E> void mergeListsAt(Object msg, Object otherMsg, long offset) {
+      ProtobufList<E> mine = getProtobufList(msg, offset);
+      ProtobufList<E> other = getProtobufList(otherMsg, offset);
+
+      int size = mine.size();
+      int otherSize = other.size();
+      if (size > 0 && otherSize > 0) {
+        if (!mine.isModifiable()) {
+          mine = mine.mutableCopyWithCapacity(size + otherSize);
+        }
+        mine.addAll(other);
+      }
+
+      ProtobufList<E> merged = size > 0 ? mine : other;
+      UnsafeUtil.putObject(msg, offset, merged);
+    }
+
+    @SuppressWarnings("unchecked")
+    static <E> ProtobufList<E> getProtobufList(Object message, long offset) {
+      return (ProtobufList<E>) UnsafeUtil.getObject(message, offset);
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/ManifestSchemaFactory.java b/java/core/src/main/java/com/google/protobuf/ManifestSchemaFactory.java
new file mode 100755
index 0000000..84ca9ae
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/ManifestSchemaFactory.java
@@ -0,0 +1,172 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.Internal.checkNotNull;
+
+/**
+ * Dynamically generates a manifest-based (i.e. table-based) schema for a given protobuf message.
+ */
+@ExperimentalApi
+final class ManifestSchemaFactory implements SchemaFactory {
+
+  private final MessageInfoFactory messageInfoFactory;
+
+  public ManifestSchemaFactory() {
+    this(getDefaultMessageInfoFactory());
+  }
+
+  private ManifestSchemaFactory(MessageInfoFactory messageInfoFactory) {
+    this.messageInfoFactory = checkNotNull(messageInfoFactory, "messageInfoFactory");
+  }
+
+  @Override
+  public <T> Schema<T> createSchema(Class<T> messageType) {
+    SchemaUtil.requireGeneratedMessage(messageType);
+
+    MessageInfo messageInfo = messageInfoFactory.messageInfoFor(messageType);
+
+    // MessageSet has a special schema.
+    if (messageInfo.isMessageSetWireFormat()) {
+      if (GeneratedMessageLite.class.isAssignableFrom(messageType)) {
+        return MessageSetSchema.newSchema(
+            SchemaUtil.unknownFieldSetLiteSchema(),
+            ExtensionSchemas.lite(),
+            messageInfo.getDefaultInstance());
+      }
+      return MessageSetSchema.newSchema(
+          SchemaUtil.proto2UnknownFieldSetSchema(),
+          ExtensionSchemas.full(),
+          messageInfo.getDefaultInstance());
+    }
+
+    return newSchema(messageType, messageInfo);
+  }
+
+  private static <T> Schema<T> newSchema(Class<T> messageType, MessageInfo messageInfo) {
+    if (GeneratedMessageLite.class.isAssignableFrom(messageType)) {
+      return isProto2(messageInfo)
+          ? MessageSchema.newSchema(
+              messageType,
+              messageInfo,
+              NewInstanceSchemas.lite(),
+              ListFieldSchema.lite(),
+              SchemaUtil.unknownFieldSetLiteSchema(),
+              ExtensionSchemas.lite(),
+              MapFieldSchemas.lite())
+          : MessageSchema.newSchema(
+              messageType,
+              messageInfo,
+              NewInstanceSchemas.lite(),
+              ListFieldSchema.lite(),
+              SchemaUtil.unknownFieldSetLiteSchema(),
+              /* extensionSchema= */ null,
+              MapFieldSchemas.lite());
+    }
+    return isProto2(messageInfo)
+        ? MessageSchema.newSchema(
+            messageType,
+            messageInfo,
+            NewInstanceSchemas.full(),
+            ListFieldSchema.full(),
+            SchemaUtil.proto2UnknownFieldSetSchema(),
+            ExtensionSchemas.full(),
+            MapFieldSchemas.full())
+        : MessageSchema.newSchema(
+            messageType,
+            messageInfo,
+            NewInstanceSchemas.full(),
+            ListFieldSchema.full(),
+            SchemaUtil.proto3UnknownFieldSetSchema(),
+            /* extensionSchema= */ null,
+            MapFieldSchemas.full());
+  }
+
+  private static boolean isProto2(MessageInfo messageInfo) {
+    return messageInfo.getSyntax() == ProtoSyntax.PROTO2;
+  }
+
+  private static MessageInfoFactory getDefaultMessageInfoFactory() {
+    return new CompositeMessageInfoFactory(
+        GeneratedMessageInfoFactory.getInstance(), getDescriptorMessageInfoFactory());
+  }
+
+  private static class CompositeMessageInfoFactory implements MessageInfoFactory {
+    private MessageInfoFactory[] factories;
+
+    CompositeMessageInfoFactory(MessageInfoFactory... factories) {
+      this.factories = factories;
+    }
+
+    @Override
+    public boolean isSupported(Class<?> clazz) {
+      for (MessageInfoFactory factory : factories) {
+        if (factory.isSupported(clazz)) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    @Override
+    public MessageInfo messageInfoFor(Class<?> clazz) {
+      for (MessageInfoFactory factory : factories) {
+        if (factory.isSupported(clazz)) {
+          return factory.messageInfoFor(clazz);
+        }
+      }
+      throw new UnsupportedOperationException(
+          "No factory is available for message type: " + clazz.getName());
+    }
+  }
+
+  private static final MessageInfoFactory EMPTY_FACTORY =
+      new MessageInfoFactory() {
+        @Override
+        public boolean isSupported(Class<?> clazz) {
+          return false;
+        }
+
+        @Override
+        public MessageInfo messageInfoFor(Class<?> clazz) {
+          throw new IllegalStateException("This should never be called.");
+        }
+      };
+
+  private static MessageInfoFactory getDescriptorMessageInfoFactory() {
+    try {
+      Class<?> clazz = Class.forName("com.google.protobuf.DescriptorMessageInfoFactory");
+      return (MessageInfoFactory) clazz.getDeclaredMethod("getInstance").invoke(null);
+    } catch (Exception e) {
+      return EMPTY_FACTORY;
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/MapFieldSchema.java b/java/core/src/main/java/com/google/protobuf/MapFieldSchema.java
new file mode 100755
index 0000000..195126e
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/MapFieldSchema.java
@@ -0,0 +1,63 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.Map;
+
+interface MapFieldSchema {
+  /** Returns the map data for mutation. */
+  Map<?, ?> forMutableMapData(Object mapField);
+
+  /** Returns the map data for read. */
+  Map<?, ?> forMapData(Object mapField);
+
+  /** Whether toImmutable() has been called on this map field. */
+  boolean isImmutable(Object mapField);
+
+  /**
+   * Returns an immutable instance of the map field. It may make the parameter immutable and return
+   * the parameter, or create an immutable copy. The status of the parameter after the call is
+   * undefined.
+   */
+  Object toImmutable(Object mapField);
+
+  /** Returns a new instance of the map field given a map default entry. */
+  Object newMapField(Object mapDefaultEntry);
+
+  /** Returns the metadata from a default entry. */
+  MapEntryLite.Metadata<?, ?> forMapMetadata(Object mapDefaultEntry);
+
+  /** Merges {@code srcMapField} into {@code destMapField}, and returns the merged instance. */
+  Object mergeFrom(Object destMapField, Object srcMapField);
+
+  /** Compute the serialized size for the map with a given field number. */
+  int getSerializedSize(int fieldNumber, Object mapField, Object mapDefaultEntry);
+}
diff --git a/java/core/src/main/java/com/google/protobuf/MapFieldSchemaFull.java b/java/core/src/main/java/com/google/protobuf/MapFieldSchemaFull.java
new file mode 100755
index 0000000..1efaab3
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/MapFieldSchemaFull.java
@@ -0,0 +1,112 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.MapEntryLite.Metadata;
+import java.util.Map;
+
+class MapFieldSchemaFull implements MapFieldSchema {
+  @Override
+  public Map<?, ?> forMutableMapData(Object mapField) {
+    return ((MapField<?, ?>) mapField).getMutableMap();
+  }
+
+  @Override
+  public Map<?, ?> forMapData(Object mapField) {
+    return ((MapField<?, ?>) mapField).getMap();
+  }
+
+  @Override
+  public boolean isImmutable(Object mapField) {
+    return !((MapField<?, ?>) mapField).isMutable();
+  }
+
+  @Override
+  public Object toImmutable(Object mapField) {
+    ((MapField<?, ?>) mapField).makeImmutable();
+    return mapField;
+  }
+
+  @Override
+  public Object newMapField(Object mapDefaultEntry) {
+    return MapField.newMapField((MapEntry<?, ?>) mapDefaultEntry);
+  }
+
+  @Override
+  public Metadata<?, ?> forMapMetadata(Object mapDefaultEntry) {
+    return ((MapEntry<?, ?>) mapDefaultEntry).getMetadata();
+  }
+
+  @Override
+  public Object mergeFrom(Object destMapField, Object srcMapField) {
+    return mergeFromFull(destMapField, srcMapField);
+  }
+
+  @SuppressWarnings("unchecked")
+  private static <K, V> Object mergeFromFull(Object destMapField, Object srcMapField) {
+    MapField<K, V> mine = (MapField<K, V>) destMapField;
+    MapField<K, V> other = (MapField<K, V>) srcMapField;
+    if (!mine.isMutable()) {
+      mine.copy();
+    }
+    mine.mergeFrom(other);
+    return mine;
+  }
+
+  @Override
+  public int getSerializedSize(int number, Object mapField, Object mapDefaultEntry) {
+    return getSerializedSizeFull(number, mapField, mapDefaultEntry);
+  }
+
+  @SuppressWarnings("unchecked")
+  private static <K, V> int getSerializedSizeFull(
+      int number, Object mapField, Object defaultEntryObject) {
+    // Full runtime allocates map fields lazily.
+    if (mapField == null) {
+      return 0;
+    }
+
+    Map<K, V> map = ((MapField<K, V>) mapField).getMap();
+    MapEntry<K, V> defaultEntry = (MapEntry<K, V>) defaultEntryObject;
+    if (map.isEmpty()) {
+      return 0;
+    }
+    int size = 0;
+    for (Map.Entry<K, V> entry : map.entrySet()) {
+      size +=
+          CodedOutputStream.computeTagSize(number)
+              + CodedOutputStream.computeLengthDelimitedFieldSize(
+                  MapEntryLite.computeSerializedSize(
+                      defaultEntry.getMetadata(), entry.getKey(), entry.getValue()));
+    }
+    return size;
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/MapFieldSchemaLite.java b/java/core/src/main/java/com/google/protobuf/MapFieldSchemaLite.java
new file mode 100755
index 0000000..8a8c78d
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/MapFieldSchemaLite.java
@@ -0,0 +1,107 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.MapEntryLite.Metadata;
+import java.util.Map;
+
+class MapFieldSchemaLite implements MapFieldSchema {
+
+  @Override
+  public Map<?, ?> forMutableMapData(Object mapField) {
+    return (MapFieldLite<?, ?>) mapField;
+  }
+
+  @Override
+  public Metadata<?, ?> forMapMetadata(Object mapDefaultEntry) {
+    return ((MapEntryLite<?, ?>) mapDefaultEntry).getMetadata();
+  }
+
+  @Override
+  public Map<?, ?> forMapData(Object mapField) {
+    return (MapFieldLite<?, ?>) mapField;
+  }
+
+  @Override
+  public boolean isImmutable(Object mapField) {
+    return !((MapFieldLite<?, ?>) mapField).isMutable();
+  }
+
+  @Override
+  public Object toImmutable(Object mapField) {
+    ((MapFieldLite<?, ?>) mapField).makeImmutable();
+    return mapField;
+  }
+
+  @Override
+  public Object newMapField(Object unused) {
+    return MapFieldLite.emptyMapField().mutableCopy();
+  }
+
+  @Override
+  public Object mergeFrom(Object destMapField, Object srcMapField) {
+    return mergeFromLite(destMapField, srcMapField);
+  }
+
+  @SuppressWarnings("unchecked")
+  private static <K, V> MapFieldLite<K, V> mergeFromLite(Object destMapField, Object srcMapField) {
+    MapFieldLite<K, V> mine = (MapFieldLite<K, V>) destMapField;
+    MapFieldLite<K, V> other = (MapFieldLite<K, V>) srcMapField;
+    if (!other.isEmpty()) {
+      if (!mine.isMutable()) {
+        mine = mine.mutableCopy();
+      }
+      mine.mergeFrom(other);
+    }
+    return mine;
+  }
+
+  @Override
+  public int getSerializedSize(int fieldNumber, Object mapField, Object mapDefaultEntry) {
+    return getSerializedSizeLite(fieldNumber, mapField, mapDefaultEntry);
+  }
+
+  @SuppressWarnings("unchecked")
+  private static <K, V> int getSerializedSizeLite(
+      int fieldNumber, Object mapField, Object defaultEntry) {
+    MapFieldLite<K, V> mapFieldLite = (MapFieldLite<K, V>) mapField;
+    MapEntryLite<K, V> defaultEntryLite = (MapEntryLite<K, V>) defaultEntry;
+
+    if (mapFieldLite.isEmpty()) {
+      return 0;
+    }
+    int size = 0;
+    for (Map.Entry<K, V> entry : mapFieldLite.entrySet()) {
+      size += defaultEntryLite.computeMessageSize(fieldNumber, entry.getKey(), entry.getValue());
+    }
+    return size;
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/MapFieldSchemas.java b/java/core/src/main/java/com/google/protobuf/MapFieldSchemas.java
new file mode 100755
index 0000000..b398c61
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/MapFieldSchemas.java
@@ -0,0 +1,53 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+final class MapFieldSchemas {
+  private static final MapFieldSchema FULL_SCHEMA = loadSchemaForFullRuntime();
+  private static final MapFieldSchema LITE_SCHEMA = new MapFieldSchemaLite();
+
+  static MapFieldSchema full() {
+    return FULL_SCHEMA;
+  }
+
+  static MapFieldSchema lite() {
+    return LITE_SCHEMA;
+  }
+
+  private static MapFieldSchema loadSchemaForFullRuntime() {
+    try {
+      Class<?> clazz = Class.forName("com.google.protobuf.MapFieldSchemaFull");
+      return (MapFieldSchema) clazz.getDeclaredConstructor().newInstance();
+    } catch (Exception e) {
+      return null;
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/MessageInfo.java b/java/core/src/main/java/com/google/protobuf/MessageInfo.java
new file mode 100755
index 0000000..69e3186
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/MessageInfo.java
@@ -0,0 +1,43 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/** A MesageInfo object describes a proto message type. */
+interface MessageInfo {
+  /** Gets syntax for this type. */
+  ProtoSyntax getSyntax();
+
+  /** Whether this type is MessageSet. */
+  boolean isMessageSetWireFormat();
+
+  /** Gets the default instance of this type. */
+  MessageLite getDefaultInstance();
+}
diff --git a/java/core/src/main/java/com/google/protobuf/MessageInfoFactory.java b/java/core/src/main/java/com/google/protobuf/MessageInfoFactory.java
new file mode 100755
index 0000000..005c26d
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/MessageInfoFactory.java
@@ -0,0 +1,41 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/** A factory that creates {@link MessageInfo} instances for message types. */
+@ExperimentalApi
+interface MessageInfoFactory {
+  /** Whether the message class is supported by this factory. */
+  boolean isSupported(Class<?> clazz);
+
+  /** Returns a information of the message class. */
+  MessageInfo messageInfoFor(Class<?> clazz);
+}
diff --git a/java/core/src/main/java/com/google/protobuf/MessageSchema.java b/java/core/src/main/java/com/google/protobuf/MessageSchema.java
new file mode 100755
index 0000000..0c6cf99
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/MessageSchema.java
@@ -0,0 +1,5884 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.ArrayDecoders.decodeBoolList;
+import static com.google.protobuf.ArrayDecoders.decodeBytes;
+import static com.google.protobuf.ArrayDecoders.decodeBytesList;
+import static com.google.protobuf.ArrayDecoders.decodeDouble;
+import static com.google.protobuf.ArrayDecoders.decodeDoubleList;
+import static com.google.protobuf.ArrayDecoders.decodeExtensionOrUnknownField;
+import static com.google.protobuf.ArrayDecoders.decodeFixed32;
+import static com.google.protobuf.ArrayDecoders.decodeFixed32List;
+import static com.google.protobuf.ArrayDecoders.decodeFixed64;
+import static com.google.protobuf.ArrayDecoders.decodeFixed64List;
+import static com.google.protobuf.ArrayDecoders.decodeFloat;
+import static com.google.protobuf.ArrayDecoders.decodeFloatList;
+import static com.google.protobuf.ArrayDecoders.decodeGroupField;
+import static com.google.protobuf.ArrayDecoders.decodeGroupList;
+import static com.google.protobuf.ArrayDecoders.decodeMessageField;
+import static com.google.protobuf.ArrayDecoders.decodeMessageList;
+import static com.google.protobuf.ArrayDecoders.decodePackedBoolList;
+import static com.google.protobuf.ArrayDecoders.decodePackedDoubleList;
+import static com.google.protobuf.ArrayDecoders.decodePackedFixed32List;
+import static com.google.protobuf.ArrayDecoders.decodePackedFixed64List;
+import static com.google.protobuf.ArrayDecoders.decodePackedFloatList;
+import static com.google.protobuf.ArrayDecoders.decodePackedSInt32List;
+import static com.google.protobuf.ArrayDecoders.decodePackedSInt64List;
+import static com.google.protobuf.ArrayDecoders.decodePackedVarint32List;
+import static com.google.protobuf.ArrayDecoders.decodePackedVarint64List;
+import static com.google.protobuf.ArrayDecoders.decodeSInt32List;
+import static com.google.protobuf.ArrayDecoders.decodeSInt64List;
+import static com.google.protobuf.ArrayDecoders.decodeString;
+import static com.google.protobuf.ArrayDecoders.decodeStringList;
+import static com.google.protobuf.ArrayDecoders.decodeStringListRequireUtf8;
+import static com.google.protobuf.ArrayDecoders.decodeStringRequireUtf8;
+import static com.google.protobuf.ArrayDecoders.decodeUnknownField;
+import static com.google.protobuf.ArrayDecoders.decodeVarint32;
+import static com.google.protobuf.ArrayDecoders.decodeVarint32List;
+import static com.google.protobuf.ArrayDecoders.decodeVarint64;
+import static com.google.protobuf.ArrayDecoders.decodeVarint64List;
+import static com.google.protobuf.ArrayDecoders.skipField;
+
+import com.google.protobuf.ArrayDecoders.Registers;
+import com.google.protobuf.ByteString.CodedBuilder;
+import com.google.protobuf.FieldSet.FieldDescriptorLite;
+import com.google.protobuf.Internal.EnumVerifier;
+import com.google.protobuf.Internal.ProtobufList;
+import com.google.protobuf.MapEntryLite.Metadata;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/** Schema used for standard messages. */
+final class MessageSchema<T> implements Schema<T> {
+  private static final int INTS_PER_FIELD = 3;
+  private static final int OFFSET_BITS = 20;
+  private static final int OFFSET_MASK = 0XFFFFF;
+  private static final int FIELD_TYPE_MASK = 0x0FF00000;
+  private static final int REQUIRED_MASK = 0x10000000;
+  private static final int ENFORCE_UTF8_MASK = 0x20000000;
+  private static final int[] EMPTY_INT_ARRAY = new int[0];
+
+  /** An offset applied to the field type ID for scalar fields that are a member of a oneof. */
+  static final int ONEOF_TYPE_OFFSET = 51 /* FieldType.MAP + 1 */;
+
+  /**
+   * Keep a direct reference to the unsafe object so we don't need to go through the UnsafeUtil
+   * wrapper for every call.
+   */
+  private static final sun.misc.Unsafe UNSAFE = UnsafeUtil.getUnsafe();
+
+  /**
+   * Holds all information for accessing the message fields. The layout is as follows (field
+   * positions are relative to the offset of the start of the field in the buffer):
+   *
+   * <p>
+   *
+   * <pre>
+   * [ 0 -    3] unused
+   * [ 4 -   31] field number
+   * [32 -   33] unused
+   * [34 -   34] whether UTF-8 enforcement should be applied to a string field.
+   * [35 -   35] whether the field is required
+   * [36 -   43] field type / for oneof: field type + {@link #ONEOF_TYPE_OFFSET}
+   * [44 -   63] field offset / oneof value field offset
+   * [64 -   69] unused
+   * [70 -   75] field presence mask shift (unused for oneof/repeated fields)
+   * [76 -   95] presence field offset / oneof case field offset / cached size field offset
+   * </pre>
+   */
+  private final int[] buffer;
+
+  /**
+   * Holds object references for fields. For each field entry in {@code buffer}, there are two
+   * corresponding entries in this array. The content is different from different field types:
+   *
+   * <pre>
+   *   Map fields:
+   *     objects[pos] = map default entry instance
+   *     objects[pos + 1] = EnumVerifier if map value is enum, or message class reference if map
+   *                        value is message.
+   *   Message fields:
+   *     objects[pos] = null or cached message schema
+   *     objects[pos + 1] = message class reference
+   *   Enum fields:
+   *     objects[pos] = null
+   *     objects[pos + 1] = EnumVerifier
+   * </pre>
+   */
+  private final Object[] objects;
+
+  private final int minFieldNumber;
+  private final int maxFieldNumber;
+
+  private final MessageLite defaultInstance;
+  private final boolean hasExtensions;
+  private final boolean lite;
+  private final boolean proto3;
+  // TODO(xiaofeng): Make both full-runtime and lite-runtime support cached field size.
+  private final boolean useCachedSizeField;
+
+  /** Represents [checkInitialized positions, map field positions, repeated field offsets]. */
+  private final int[] intArray;
+
+  /**
+   * Values at indices 0 -> checkInitializedCount in intArray are positions to check for
+   * initialization.
+   */
+  private final int checkInitializedCount;
+
+  /**
+   * Values at indices checkInitializedCount -> repeatedFieldOffsetStart are map positions.
+   * Everything after that are repeated field offsets.
+   */
+  private final int repeatedFieldOffsetStart;
+
+  private final NewInstanceSchema newInstanceSchema;
+  private final ListFieldSchema listFieldSchema;
+  private final UnknownFieldSchema<?, ?> unknownFieldSchema;
+  private final ExtensionSchema<?> extensionSchema;
+  private final MapFieldSchema mapFieldSchema;
+
+  private MessageSchema(
+      int[] buffer,
+      Object[] objects,
+      int minFieldNumber,
+      int maxFieldNumber,
+      MessageLite defaultInstance,
+      boolean proto3,
+      boolean useCachedSizeField,
+      int[] intArray,
+      int checkInitialized,
+      int mapFieldPositions,
+      NewInstanceSchema newInstanceSchema,
+      ListFieldSchema listFieldSchema,
+      UnknownFieldSchema<?, ?> unknownFieldSchema,
+      ExtensionSchema<?> extensionSchema,
+      MapFieldSchema mapFieldSchema) {
+    this.buffer = buffer;
+    this.objects = objects;
+    this.minFieldNumber = minFieldNumber;
+    this.maxFieldNumber = maxFieldNumber;
+
+    this.lite = defaultInstance instanceof GeneratedMessageLite;
+    this.proto3 = proto3;
+    this.hasExtensions = extensionSchema != null && extensionSchema.hasExtensions(defaultInstance);
+    this.useCachedSizeField = useCachedSizeField;
+
+    this.intArray = intArray;
+    this.checkInitializedCount = checkInitialized;
+    this.repeatedFieldOffsetStart = mapFieldPositions;
+
+    this.newInstanceSchema = newInstanceSchema;
+    this.listFieldSchema = listFieldSchema;
+    this.unknownFieldSchema = unknownFieldSchema;
+    this.extensionSchema = extensionSchema;
+    this.defaultInstance = defaultInstance;
+    this.mapFieldSchema = mapFieldSchema;
+  }
+
+  static <T> MessageSchema<T> newSchema(
+      Class<T> messageClass,
+      MessageInfo messageInfo,
+      NewInstanceSchema newInstanceSchema,
+      ListFieldSchema listFieldSchema,
+      UnknownFieldSchema<?, ?> unknownFieldSchema,
+      ExtensionSchema<?> extensionSchema,
+      MapFieldSchema mapFieldSchema) {
+    if (messageInfo instanceof RawMessageInfo) {
+      return newSchemaForRawMessageInfo(
+          (RawMessageInfo) messageInfo,
+          newInstanceSchema,
+          listFieldSchema,
+          unknownFieldSchema,
+          extensionSchema,
+          mapFieldSchema);
+
+    } else {
+      return newSchemaForMessageInfo(
+          (StructuralMessageInfo) messageInfo,
+          newInstanceSchema,
+          listFieldSchema,
+          unknownFieldSchema,
+          extensionSchema,
+          mapFieldSchema);
+    }
+  }
+
+  static <T> MessageSchema<T> newSchemaForRawMessageInfo(
+      RawMessageInfo messageInfo,
+      NewInstanceSchema newInstanceSchema,
+      ListFieldSchema listFieldSchema,
+      UnknownFieldSchema<?, ?> unknownFieldSchema,
+      ExtensionSchema<?> extensionSchema,
+      MapFieldSchema mapFieldSchema) {
+    final boolean isProto3 = messageInfo.getSyntax() == ProtoSyntax.PROTO3;
+
+    String info = messageInfo.getStringInfo();
+    final int length = info.length();
+    int i = 0;
+
+    int next = info.charAt(i++);
+    if (next >= 0xD800) {
+      int result = next & 0x1FFF;
+      int shift = 13;
+      while ((next = info.charAt(i++)) >= 0xD800) {
+        result |= (next & 0x1FFF) << shift;
+        shift += 13;
+      }
+      next = result | (next << shift);
+    }
+    final int flags = next;
+
+    next = info.charAt(i++);
+    if (next >= 0xD800) {
+      int result = next & 0x1FFF;
+      int shift = 13;
+      while ((next = info.charAt(i++)) >= 0xD800) {
+        result |= (next & 0x1FFF) << shift;
+        shift += 13;
+      }
+      next = result | (next << shift);
+    }
+    final int fieldCount = next;
+
+    final int oneofCount;
+    final int hasBitsCount;
+    final int minFieldNumber;
+    final int maxFieldNumber;
+    final int numEntries;
+    final int mapFieldCount;
+    final int repeatedFieldCount;
+    final int checkInitialized;
+    final int[] intArray;
+    int objectsPosition;
+    if (fieldCount == 0) {
+      oneofCount = 0;
+      hasBitsCount = 0;
+      minFieldNumber = 0;
+      maxFieldNumber = 0;
+      numEntries = 0;
+      mapFieldCount = 0;
+      repeatedFieldCount = 0;
+      checkInitialized = 0;
+      intArray = EMPTY_INT_ARRAY;
+      objectsPosition = 0;
+    } else {
+      next = info.charAt(i++);
+      if (next >= 0xD800) {
+        int result = next & 0x1FFF;
+        int shift = 13;
+        while ((next = info.charAt(i++)) >= 0xD800) {
+          result |= (next & 0x1FFF) << shift;
+          shift += 13;
+        }
+        next = result | (next << shift);
+      }
+      oneofCount = next;
+
+      next = info.charAt(i++);
+      if (next >= 0xD800) {
+        int result = next & 0x1FFF;
+        int shift = 13;
+        while ((next = info.charAt(i++)) >= 0xD800) {
+          result |= (next & 0x1FFF) << shift;
+          shift += 13;
+        }
+        next = result | (next << shift);
+      }
+      hasBitsCount = next;
+
+      next = info.charAt(i++);
+      if (next >= 0xD800) {
+        int result = next & 0x1FFF;
+        int shift = 13;
+        while ((next = info.charAt(i++)) >= 0xD800) {
+          result |= (next & 0x1FFF) << shift;
+          shift += 13;
+        }
+        next = result | (next << shift);
+      }
+      minFieldNumber = next;
+
+      next = info.charAt(i++);
+      if (next >= 0xD800) {
+        int result = next & 0x1FFF;
+        int shift = 13;
+        while ((next = info.charAt(i++)) >= 0xD800) {
+          result |= (next & 0x1FFF) << shift;
+          shift += 13;
+        }
+        next = result | (next << shift);
+      }
+      maxFieldNumber = next;
+
+      next = info.charAt(i++);
+      if (next >= 0xD800) {
+        int result = next & 0x1FFF;
+        int shift = 13;
+        while ((next = info.charAt(i++)) >= 0xD800) {
+          result |= (next & 0x1FFF) << shift;
+          shift += 13;
+        }
+        next = result | (next << shift);
+      }
+      numEntries = next;
+
+      next = info.charAt(i++);
+      if (next >= 0xD800) {
+        int result = next & 0x1FFF;
+        int shift = 13;
+        while ((next = info.charAt(i++)) >= 0xD800) {
+          result |= (next & 0x1FFF) << shift;
+          shift += 13;
+        }
+        next = result | (next << shift);
+      }
+      mapFieldCount = next;
+
+      next = info.charAt(i++);
+      if (next >= 0xD800) {
+        int result = next & 0x1FFF;
+        int shift = 13;
+        while ((next = info.charAt(i++)) >= 0xD800) {
+          result |= (next & 0x1FFF) << shift;
+          shift += 13;
+        }
+        next = result | (next << shift);
+      }
+      repeatedFieldCount = next;
+
+      next = info.charAt(i++);
+      if (next >= 0xD800) {
+        int result = next & 0x1FFF;
+        int shift = 13;
+        while ((next = info.charAt(i++)) >= 0xD800) {
+          result |= (next & 0x1FFF) << shift;
+          shift += 13;
+        }
+        next = result | (next << shift);
+      }
+      checkInitialized = next;
+      intArray = new int[checkInitialized + mapFieldCount + repeatedFieldCount];
+      // Field objects are after a list of (oneof, oneofCase) pairs  + a list of hasbits fields.
+      objectsPosition = oneofCount * 2 + hasBitsCount;
+    }
+
+    final sun.misc.Unsafe unsafe = UNSAFE;
+    final Object[] messageInfoObjects = messageInfo.getObjects();
+    int checkInitializedPosition = 0;
+    final Class<?> messageClass = messageInfo.getDefaultInstance().getClass();
+    int[] buffer = new int[numEntries * INTS_PER_FIELD];
+    Object[] objects = new Object[numEntries * 2];
+
+    int mapFieldIndex = checkInitialized;
+    int repeatedFieldIndex = checkInitialized + mapFieldCount;
+
+    int bufferIndex = 0;
+    while (i < length) {
+      final int fieldNumber;
+      final int fieldTypeWithExtraBits;
+      final int fieldType;
+
+      next = info.charAt(i++);
+      if (next >= 0xD800) {
+        int result = next & 0x1FFF;
+        int shift = 13;
+        while ((next = info.charAt(i++)) >= 0xD800) {
+          result |= (next & 0x1FFF) << shift;
+          shift += 13;
+        }
+        next = result | (next << shift);
+      }
+      fieldNumber = next;
+
+      next = info.charAt(i++);
+      if (next >= 0xD800) {
+        int result = next & 0x1FFF;
+        int shift = 13;
+        while ((next = info.charAt(i++)) >= 0xD800) {
+          result |= (next & 0x1FFF) << shift;
+          shift += 13;
+        }
+        next = result | (next << shift);
+      }
+      fieldTypeWithExtraBits = next;
+      fieldType = fieldTypeWithExtraBits & 0xFF;
+
+      if ((fieldTypeWithExtraBits & 0x400) != 0) {
+        intArray[checkInitializedPosition++] = bufferIndex;
+      }
+
+      final int fieldOffset;
+      final int presenceMaskShift;
+      final int presenceFieldOffset;
+
+      // Oneof
+      if (fieldType >= ONEOF_TYPE_OFFSET) {
+        next = info.charAt(i++);
+        if (next >= 0xD800) {
+          int result = next & 0x1FFF;
+          int shift = 13;
+          while ((next = info.charAt(i++)) >= 0xD800) {
+            result |= (next & 0x1FFF) << shift;
+            shift += 13;
+          }
+          next = result | (next << shift);
+        }
+        int oneofIndex = next;
+
+        final int oneofFieldType = fieldType - ONEOF_TYPE_OFFSET;
+        if (oneofFieldType == 9 /* FieldType.MESSAGE */
+            || oneofFieldType == 17 /* FieldType.GROUP */) {
+          objects[bufferIndex / INTS_PER_FIELD * 2 + 1] = messageInfoObjects[objectsPosition++];
+        } else if (oneofFieldType == 12 /* FieldType.ENUM */) {
+          // proto2
+          if ((flags & 0x1) == 0x1) {
+            objects[bufferIndex / INTS_PER_FIELD * 2 + 1] = messageInfoObjects[objectsPosition++];
+          }
+        }
+
+        final java.lang.reflect.Field oneofField;
+        int index = oneofIndex * 2;
+        Object o = messageInfoObjects[index];
+        if (o instanceof java.lang.reflect.Field) {
+          oneofField = (java.lang.reflect.Field) o;
+        } else {
+          oneofField = reflectField(messageClass, (String) o);
+          // Memoize java.lang.reflect.Field instances for oneof/hasbits fields, since they're
+          // potentially used for many Protobuf fields.  Since there's a 1-1 mapping from the
+          // Protobuf field to the Java Field for non-oneofs, there's no benefit for memoizing
+          // those.
+          messageInfoObjects[index] = oneofField;
+        }
+
+        fieldOffset = (int) unsafe.objectFieldOffset(oneofField);
+
+        final java.lang.reflect.Field oneofCaseField;
+        index++;
+        o = messageInfoObjects[index];
+        if (o instanceof java.lang.reflect.Field) {
+          oneofCaseField = (java.lang.reflect.Field) o;
+        } else {
+          oneofCaseField = reflectField(messageClass, (String) o);
+          messageInfoObjects[index] = oneofCaseField;
+        }
+
+        presenceFieldOffset = (int) unsafe.objectFieldOffset(oneofCaseField);
+        presenceMaskShift = 0;
+      } else {
+        Field field = reflectField(messageClass, (String) messageInfoObjects[objectsPosition++]);
+        if (fieldType == 9 /* FieldType.MESSAGE */ || fieldType == 17 /* FieldType.GROUP */) {
+          objects[bufferIndex / INTS_PER_FIELD * 2 + 1] = field.getType();
+        } else if (fieldType == 27 /* FieldType.MESSAGE_LIST */
+            || fieldType == 49 /* FieldType.GROUP_LIST */) {
+          objects[bufferIndex / INTS_PER_FIELD * 2 + 1] = messageInfoObjects[objectsPosition++];
+        } else if (fieldType == 12 /* FieldType.ENUM */
+            || fieldType == 30 /* FieldType.ENUM_LIST */
+            || fieldType == 44 /* FieldType.ENUM_LIST_PACKED */) {
+          if ((flags & 0x1) == 0x1) {
+            objects[bufferIndex / INTS_PER_FIELD * 2 + 1] = messageInfoObjects[objectsPosition++];
+          }
+        } else if (fieldType == 50 /* FieldType.MAP */) {
+          intArray[mapFieldIndex++] = bufferIndex;
+          objects[bufferIndex / INTS_PER_FIELD * 2] = messageInfoObjects[objectsPosition++];
+          if ((fieldTypeWithExtraBits & 0x800) != 0) {
+            objects[bufferIndex / INTS_PER_FIELD * 2 + 1] = messageInfoObjects[objectsPosition++];
+          }
+        }
+
+        fieldOffset = (int) unsafe.objectFieldOffset(field);
+        if ((flags & 0x1) == 0x1 && fieldType <= 17 /* FieldType.GROUP */) {
+          next = info.charAt(i++);
+          if (next >= 0xD800) {
+            int result = next & 0x1FFF;
+            int shift = 13;
+            while ((next = info.charAt(i++)) >= 0xD800) {
+              result |= (next & 0x1FFF) << shift;
+              shift += 13;
+            }
+            next = result | (next << shift);
+          }
+          int hasBitsIndex = next;
+
+          final java.lang.reflect.Field hasBitsField;
+          int index = oneofCount * 2 + hasBitsIndex / 32;
+          Object o = messageInfoObjects[index];
+          if (o instanceof java.lang.reflect.Field) {
+            hasBitsField = (java.lang.reflect.Field) o;
+          } else {
+            hasBitsField = reflectField(messageClass, (String) o);
+            messageInfoObjects[index] = hasBitsField;
+          }
+
+          presenceFieldOffset = (int) unsafe.objectFieldOffset(hasBitsField);
+          presenceMaskShift = hasBitsIndex % 32;
+        } else {
+          presenceFieldOffset = 0;
+          presenceMaskShift = 0;
+        }
+
+        if (fieldType >= 18 && fieldType <= 49) {
+          // Field types of repeated fields are in a consecutive range from 18 (DOUBLE_LIST) to
+          // 49 (GROUP_LIST).
+          intArray[repeatedFieldIndex++] = fieldOffset;
+        }
+      }
+
+      buffer[bufferIndex++] = fieldNumber;
+      buffer[bufferIndex++] =
+          ((fieldTypeWithExtraBits & 0x200) != 0 ? ENFORCE_UTF8_MASK : 0)
+              | ((fieldTypeWithExtraBits & 0x100) != 0 ? REQUIRED_MASK : 0)
+              | (fieldType << OFFSET_BITS)
+              | fieldOffset;
+      buffer[bufferIndex++] = (presenceMaskShift << OFFSET_BITS) | presenceFieldOffset;
+    }
+
+    return new MessageSchema<T>(
+        buffer,
+        objects,
+        minFieldNumber,
+        maxFieldNumber,
+        messageInfo.getDefaultInstance(),
+        isProto3,
+        /* useCachedSizeField= */ false,
+        intArray,
+        checkInitialized,
+        checkInitialized + mapFieldCount,
+        newInstanceSchema,
+        listFieldSchema,
+        unknownFieldSchema,
+        extensionSchema,
+        mapFieldSchema);
+  }
+
+  private static java.lang.reflect.Field reflectField(Class<?> messageClass, String fieldName) {
+    try {
+      return messageClass.getDeclaredField(fieldName);
+    } catch (NoSuchFieldException e) {
+      // Some Samsung devices lie about what fields are present via the getDeclaredField API so
+      // we do the for loop properly that they seem to have messed up...
+      java.lang.reflect.Field[] fields = messageClass.getDeclaredFields();
+      for (java.lang.reflect.Field field : fields) {
+        if (fieldName.equals(field.getName())) {
+          return field;
+        }
+      }
+
+      // If we make it here, the runtime still lies about what we know to be true at compile
+      // time. We throw to alert server monitoring for further remediation.
+      throw new RuntimeException(
+          "Field "
+              + fieldName
+              + " for "
+              + messageClass.getName()
+              + " not found. Known fields are "
+              + Arrays.toString(fields));
+    }
+  }
+
+  static <T> MessageSchema<T> newSchemaForMessageInfo(
+      StructuralMessageInfo messageInfo,
+      NewInstanceSchema newInstanceSchema,
+      ListFieldSchema listFieldSchema,
+      UnknownFieldSchema<?, ?> unknownFieldSchema,
+      ExtensionSchema<?> extensionSchema,
+      MapFieldSchema mapFieldSchema) {
+    final boolean isProto3 = messageInfo.getSyntax() == ProtoSyntax.PROTO3;
+    FieldInfo[] fis = messageInfo.getFields();
+    final int minFieldNumber;
+    final int maxFieldNumber;
+    if (fis.length == 0) {
+      minFieldNumber = 0;
+      maxFieldNumber = 0;
+    } else {
+      minFieldNumber = fis[0].getFieldNumber();
+      maxFieldNumber = fis[fis.length - 1].getFieldNumber();
+    }
+
+    final int numEntries = fis.length;
+
+    int[] buffer = new int[numEntries * INTS_PER_FIELD];
+    Object[] objects = new Object[numEntries * 2];
+
+    int mapFieldCount = 0;
+    int repeatedFieldCount = 0;
+    for (FieldInfo fi : fis) {
+      if (fi.getType() == FieldType.MAP) {
+        mapFieldCount++;
+      } else if (fi.getType().id() >= 18 && fi.getType().id() <= 49) {
+        // Field types of repeated fields are in a consecutive range from 18 (DOUBLE_LIST) to
+        // 49 (GROUP_LIST).
+        repeatedFieldCount++;
+      }
+    }
+    int[] mapFieldPositions = mapFieldCount > 0 ? new int[mapFieldCount] : null;
+    int[] repeatedFieldOffsets = repeatedFieldCount > 0 ? new int[repeatedFieldCount] : null;
+    mapFieldCount = 0;
+    repeatedFieldCount = 0;
+
+    int[] checkInitialized = messageInfo.getCheckInitialized();
+    if (checkInitialized == null) {
+      checkInitialized = EMPTY_INT_ARRAY;
+    }
+    int checkInitializedIndex = 0;
+    // Fill in the manifest data from the descriptors.
+    int fieldIndex = 0;
+    for (int bufferIndex = 0; fieldIndex < fis.length; bufferIndex += INTS_PER_FIELD) {
+      final FieldInfo fi = fis[fieldIndex];
+      final int fieldNumber = fi.getFieldNumber();
+
+      // We found the entry for the next field. Store the entry in the manifest for
+      // this field and increment the field index.
+      storeFieldData(fi, buffer, bufferIndex, isProto3, objects);
+
+      // Convert field number to index
+      if (checkInitializedIndex < checkInitialized.length
+          && checkInitialized[checkInitializedIndex] == fieldNumber) {
+        checkInitialized[checkInitializedIndex++] = bufferIndex;
+      }
+
+      if (fi.getType() == FieldType.MAP) {
+        mapFieldPositions[mapFieldCount++] = bufferIndex;
+      } else if (fi.getType().id() >= 18 && fi.getType().id() <= 49) {
+        // Field types of repeated fields are in a consecutive range from 18 (DOUBLE_LIST) to
+        // 49 (GROUP_LIST).
+        repeatedFieldOffsets[repeatedFieldCount++] =
+            (int) UnsafeUtil.objectFieldOffset(fi.getField());
+      }
+
+      fieldIndex++;
+    }
+
+    if (mapFieldPositions == null) {
+      mapFieldPositions = EMPTY_INT_ARRAY;
+    }
+    if (repeatedFieldOffsets == null) {
+      repeatedFieldOffsets = EMPTY_INT_ARRAY;
+    }
+    int[] combined =
+        new int[checkInitialized.length + mapFieldPositions.length + repeatedFieldOffsets.length];
+    System.arraycopy(checkInitialized, 0, combined, 0, checkInitialized.length);
+    System.arraycopy(
+        mapFieldPositions, 0, combined, checkInitialized.length, mapFieldPositions.length);
+    System.arraycopy(
+        repeatedFieldOffsets,
+        0,
+        combined,
+        checkInitialized.length + mapFieldPositions.length,
+        repeatedFieldOffsets.length);
+
+    return new MessageSchema<T>(
+        buffer,
+        objects,
+        minFieldNumber,
+        maxFieldNumber,
+        messageInfo.getDefaultInstance(),
+        isProto3,
+        /* useCachedSizeField= */ true,
+        combined,
+        checkInitialized.length,
+        checkInitialized.length + mapFieldPositions.length,
+        newInstanceSchema,
+        listFieldSchema,
+        unknownFieldSchema,
+        extensionSchema,
+        mapFieldSchema);
+  }
+
+  private static void storeFieldData(
+      FieldInfo fi, int[] buffer, int bufferIndex, boolean proto3, Object[] objects) {
+    final int fieldOffset;
+    final int typeId;
+    final int presenceMaskShift;
+    final int presenceFieldOffset;
+
+    OneofInfo oneof = fi.getOneof();
+    if (oneof != null) {
+      typeId = fi.getType().id() + ONEOF_TYPE_OFFSET;
+      fieldOffset = (int) UnsafeUtil.objectFieldOffset(oneof.getValueField());
+      presenceFieldOffset = (int) UnsafeUtil.objectFieldOffset(oneof.getCaseField());
+      presenceMaskShift = 0;
+    } else {
+      FieldType type = fi.getType();
+      fieldOffset = (int) UnsafeUtil.objectFieldOffset(fi.getField());
+      typeId = type.id();
+      if (!proto3 && !type.isList() && !type.isMap()) {
+        presenceFieldOffset = (int) UnsafeUtil.objectFieldOffset(fi.getPresenceField());
+        presenceMaskShift = Integer.numberOfTrailingZeros(fi.getPresenceMask());
+      } else {
+        if (fi.getCachedSizeField() == null) {
+          presenceFieldOffset = 0;
+          presenceMaskShift = 0;
+        } else {
+          presenceFieldOffset = (int) UnsafeUtil.objectFieldOffset(fi.getCachedSizeField());
+          presenceMaskShift = 0;
+        }
+      }
+    }
+
+    buffer[bufferIndex] = fi.getFieldNumber();
+    buffer[bufferIndex + 1] =
+        (fi.isEnforceUtf8() ? ENFORCE_UTF8_MASK : 0)
+            | (fi.isRequired() ? REQUIRED_MASK : 0)
+            | (typeId << OFFSET_BITS)
+            | fieldOffset;
+    buffer[bufferIndex + 2] = (presenceMaskShift << OFFSET_BITS) | presenceFieldOffset;
+
+    Object messageFieldClass = fi.getMessageFieldClass();
+    if (fi.getMapDefaultEntry() != null) {
+      objects[bufferIndex / INTS_PER_FIELD * 2] = fi.getMapDefaultEntry();
+      if (messageFieldClass != null) {
+        objects[bufferIndex / INTS_PER_FIELD * 2 + 1] = messageFieldClass;
+      } else if (fi.getEnumVerifier() != null) {
+        objects[bufferIndex / INTS_PER_FIELD * 2 + 1] = fi.getEnumVerifier();
+      }
+    } else {
+      if (messageFieldClass != null) {
+        objects[bufferIndex / INTS_PER_FIELD * 2 + 1] = messageFieldClass;
+      } else if (fi.getEnumVerifier() != null) {
+        objects[bufferIndex / INTS_PER_FIELD * 2 + 1] = fi.getEnumVerifier();
+      }
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public T newInstance() {
+    return (T) newInstanceSchema.newInstance(defaultInstance);
+  }
+
+  @Override
+  public boolean equals(T message, T other) {
+    final int bufferLength = buffer.length;
+    for (int pos = 0; pos < bufferLength; pos += INTS_PER_FIELD) {
+      if (!equals(message, other, pos)) {
+        return false;
+      }
+    }
+
+    Object messageUnknown = unknownFieldSchema.getFromMessage(message);
+    Object otherUnknown = unknownFieldSchema.getFromMessage(other);
+    if (!messageUnknown.equals(otherUnknown)) {
+      return false;
+    }
+
+    if (hasExtensions) {
+      FieldSet<?> messageExtensions = extensionSchema.getExtensions(message);
+      FieldSet<?> otherExtensions = extensionSchema.getExtensions(other);
+      return messageExtensions.equals(otherExtensions);
+    }
+    return true;
+  }
+
+  private boolean equals(T message, T other, int pos) {
+    final int typeAndOffset = typeAndOffsetAt(pos);
+    final long offset = offset(typeAndOffset);
+
+    switch (type(typeAndOffset)) {
+      case 0: // DOUBLE:
+        return arePresentForEquals(message, other, pos)
+            && Double.doubleToLongBits(UnsafeUtil.getDouble(message, offset))
+                == Double.doubleToLongBits(UnsafeUtil.getDouble(other, offset));
+      case 1: // FLOAT:
+        return arePresentForEquals(message, other, pos)
+            && Float.floatToIntBits(UnsafeUtil.getFloat(message, offset))
+                == Float.floatToIntBits(UnsafeUtil.getFloat(other, offset));
+      case 2: // INT64:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getLong(message, offset) == UnsafeUtil.getLong(other, offset);
+      case 3: // UINT64:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getLong(message, offset) == UnsafeUtil.getLong(other, offset);
+      case 4: // INT32:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getInt(message, offset) == UnsafeUtil.getInt(other, offset);
+      case 5: // FIXED64:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getLong(message, offset) == UnsafeUtil.getLong(other, offset);
+      case 6: // FIXED32:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getInt(message, offset) == UnsafeUtil.getInt(other, offset);
+      case 7: // BOOL:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getBoolean(message, offset) == UnsafeUtil.getBoolean(other, offset);
+      case 8: // STRING:
+        return arePresentForEquals(message, other, pos)
+            && SchemaUtil.safeEquals(
+                UnsafeUtil.getObject(message, offset), UnsafeUtil.getObject(other, offset));
+      case 9: // MESSAGE:
+        return arePresentForEquals(message, other, pos)
+            && SchemaUtil.safeEquals(
+                UnsafeUtil.getObject(message, offset), UnsafeUtil.getObject(other, offset));
+      case 10: // BYTES:
+        return arePresentForEquals(message, other, pos)
+            && SchemaUtil.safeEquals(
+                UnsafeUtil.getObject(message, offset), UnsafeUtil.getObject(other, offset));
+      case 11: // UINT32:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getInt(message, offset) == UnsafeUtil.getInt(other, offset);
+      case 12: // ENUM:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getInt(message, offset) == UnsafeUtil.getInt(other, offset);
+      case 13: // SFIXED32:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getInt(message, offset) == UnsafeUtil.getInt(other, offset);
+      case 14: // SFIXED64:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getLong(message, offset) == UnsafeUtil.getLong(other, offset);
+      case 15: // SINT32:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getInt(message, offset) == UnsafeUtil.getInt(other, offset);
+      case 16: // SINT64:
+        return arePresentForEquals(message, other, pos)
+            && UnsafeUtil.getLong(message, offset) == UnsafeUtil.getLong(other, offset);
+      case 17: // GROUP:
+        return arePresentForEquals(message, other, pos)
+            && SchemaUtil.safeEquals(
+                UnsafeUtil.getObject(message, offset), UnsafeUtil.getObject(other, offset));
+
+      case 18: // DOUBLE_LIST:
+      case 19: // FLOAT_LIST:
+      case 20: // INT64_LIST:
+      case 21: // UINT64_LIST:
+      case 22: // INT32_LIST:
+      case 23: // FIXED64_LIST:
+      case 24: // FIXED32_LIST:
+      case 25: // BOOL_LIST:
+      case 26: // STRING_LIST:
+      case 27: // MESSAGE_LIST:
+      case 28: // BYTES_LIST:
+      case 29: // UINT32_LIST:
+      case 30: // ENUM_LIST:
+      case 31: // SFIXED32_LIST:
+      case 32: // SFIXED64_LIST:
+      case 33: // SINT32_LIST:
+      case 34: // SINT64_LIST:
+      case 35: // DOUBLE_LIST_PACKED:
+      case 36: // FLOAT_LIST_PACKED:
+      case 37: // INT64_LIST_PACKED:
+      case 38: // UINT64_LIST_PACKED:
+      case 39: // INT32_LIST_PACKED:
+      case 40: // FIXED64_LIST_PACKED:
+      case 41: // FIXED32_LIST_PACKED:
+      case 42: // BOOL_LIST_PACKED:
+      case 43: // UINT32_LIST_PACKED:
+      case 44: // ENUM_LIST_PACKED:
+      case 45: // SFIXED32_LIST_PACKED:
+      case 46: // SFIXED64_LIST_PACKED:
+      case 47: // SINT32_LIST_PACKED:
+      case 48: // SINT64_LIST_PACKED:
+      case 49: // GROUP_LIST:
+        return SchemaUtil.safeEquals(
+            UnsafeUtil.getObject(message, offset), UnsafeUtil.getObject(other, offset));
+      case 50: // MAP:
+        return SchemaUtil.safeEquals(
+            UnsafeUtil.getObject(message, offset), UnsafeUtil.getObject(other, offset));
+      case 51: // ONEOF_DOUBLE:
+      case 52: // ONEOF_FLOAT:
+      case 53: // ONEOF_INT64:
+      case 54: // ONEOF_UINT64:
+      case 55: // ONEOF_INT32:
+      case 56: // ONEOF_FIXED64:
+      case 57: // ONEOF_FIXED32:
+      case 58: // ONEOF_BOOL:
+      case 59: // ONEOF_STRING:
+      case 60: // ONEOF_MESSAGE:
+      case 61: // ONEOF_BYTES:
+      case 62: // ONEOF_UINT32:
+      case 63: // ONEOF_ENUM:
+      case 64: // ONEOF_SFIXED32:
+      case 65: // ONEOF_SFIXED64:
+      case 66: // ONEOF_SINT32:
+      case 67: // ONEOF_SINT64:
+      case 68: // ONEOF_GROUP:
+        return isOneofCaseEqual(message, other, pos)
+            && SchemaUtil.safeEquals(
+                UnsafeUtil.getObject(message, offset), UnsafeUtil.getObject(other, offset));
+      default:
+        // Assume it's an empty entry - just go to the next entry.
+        return true;
+    }
+  }
+
+  @Override
+  public int hashCode(T message) {
+    int hashCode = 0;
+    final int bufferLength = buffer.length;
+    for (int pos = 0; pos < bufferLength; pos += INTS_PER_FIELD) {
+      final int typeAndOffset = typeAndOffsetAt(pos);
+      final int entryNumber = numberAt(pos);
+
+      final long offset = offset(typeAndOffset);
+
+      switch (type(typeAndOffset)) {
+        case 0: // DOUBLE:
+          hashCode =
+              (hashCode * 53)
+                  + Internal.hashLong(
+                      Double.doubleToLongBits(UnsafeUtil.getDouble(message, offset)));
+          break;
+        case 1: // FLOAT:
+          hashCode = (hashCode * 53) + Float.floatToIntBits(UnsafeUtil.getFloat(message, offset));
+          break;
+        case 2: // INT64:
+          hashCode = (hashCode * 53) + Internal.hashLong(UnsafeUtil.getLong(message, offset));
+          break;
+        case 3: // UINT64:
+          hashCode = (hashCode * 53) + Internal.hashLong(UnsafeUtil.getLong(message, offset));
+          break;
+        case 4: // INT32:
+          hashCode = (hashCode * 53) + (UnsafeUtil.getInt(message, offset));
+          break;
+        case 5: // FIXED64:
+          hashCode = (hashCode * 53) + Internal.hashLong(UnsafeUtil.getLong(message, offset));
+          break;
+        case 6: // FIXED32:
+          hashCode = (hashCode * 53) + (UnsafeUtil.getInt(message, offset));
+          break;
+        case 7: // BOOL:
+          hashCode = (hashCode * 53) + Internal.hashBoolean(UnsafeUtil.getBoolean(message, offset));
+          break;
+        case 8: // STRING:
+          hashCode = (hashCode * 53) + ((String) UnsafeUtil.getObject(message, offset)).hashCode();
+          break;
+        case 9: // MESSAGE:
+          {
+            int protoHash = 37;
+            Object submessage = UnsafeUtil.getObject(message, offset);
+            if (submessage != null) {
+              protoHash = submessage.hashCode();
+            }
+            hashCode = (53 * hashCode) + protoHash;
+            break;
+          }
+        case 10: // BYTES:
+          hashCode = (hashCode * 53) + UnsafeUtil.getObject(message, offset).hashCode();
+          break;
+        case 11: // UINT32:
+          hashCode = (hashCode * 53) + (UnsafeUtil.getInt(message, offset));
+          break;
+        case 12: // ENUM:
+          hashCode = (hashCode * 53) + (UnsafeUtil.getInt(message, offset));
+          break;
+        case 13: // SFIXED32:
+          hashCode = (hashCode * 53) + (UnsafeUtil.getInt(message, offset));
+          break;
+        case 14: // SFIXED64:
+          hashCode = (hashCode * 53) + Internal.hashLong(UnsafeUtil.getLong(message, offset));
+          break;
+        case 15: // SINT32:
+          hashCode = (hashCode * 53) + (UnsafeUtil.getInt(message, offset));
+          break;
+        case 16: // SINT64:
+          hashCode = (hashCode * 53) + Internal.hashLong(UnsafeUtil.getLong(message, offset));
+          break;
+
+        case 17: // GROUP:
+          {
+            int protoHash = 37;
+            Object submessage = UnsafeUtil.getObject(message, offset);
+            if (submessage != null) {
+              protoHash = submessage.hashCode();
+            }
+            hashCode = (53 * hashCode) + protoHash;
+            break;
+          }
+        case 18: // DOUBLE_LIST:
+        case 19: // FLOAT_LIST:
+        case 20: // INT64_LIST:
+        case 21: // UINT64_LIST:
+        case 22: // INT32_LIST:
+        case 23: // FIXED64_LIST:
+        case 24: // FIXED32_LIST:
+        case 25: // BOOL_LIST:
+        case 26: // STRING_LIST:
+        case 27: // MESSAGE_LIST:
+        case 28: // BYTES_LIST:
+        case 29: // UINT32_LIST:
+        case 30: // ENUM_LIST:
+        case 31: // SFIXED32_LIST:
+        case 32: // SFIXED64_LIST:
+        case 33: // SINT32_LIST:
+        case 34: // SINT64_LIST:
+        case 35: // DOUBLE_LIST_PACKED:
+        case 36: // FLOAT_LIST_PACKED:
+        case 37: // INT64_LIST_PACKED:
+        case 38: // UINT64_LIST_PACKED:
+        case 39: // INT32_LIST_PACKED:
+        case 40: // FIXED64_LIST_PACKED:
+        case 41: // FIXED32_LIST_PACKED:
+        case 42: // BOOL_LIST_PACKED:
+        case 43: // UINT32_LIST_PACKED:
+        case 44: // ENUM_LIST_PACKED:
+        case 45: // SFIXED32_LIST_PACKED:
+        case 46: // SFIXED64_LIST_PACKED:
+        case 47: // SINT32_LIST_PACKED:
+        case 48: // SINT64_LIST_PACKED:
+        case 49: // GROUP_LIST:
+          hashCode = (hashCode * 53) + UnsafeUtil.getObject(message, offset).hashCode();
+          break;
+        case 50: // MAP:
+          hashCode = (hashCode * 53) + UnsafeUtil.getObject(message, offset).hashCode();
+          break;
+        case 51: // ONEOF_DOUBLE:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode =
+                (hashCode * 53)
+                    + Internal.hashLong(Double.doubleToLongBits(oneofDoubleAt(message, offset)));
+          }
+          break;
+        case 52: // ONEOF_FLOAT:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + Float.floatToIntBits(oneofFloatAt(message, offset));
+          }
+          break;
+        case 53: // ONEOF_INT64:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + Internal.hashLong(oneofLongAt(message, offset));
+          }
+          break;
+        case 54: // ONEOF_UINT64:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + Internal.hashLong(oneofLongAt(message, offset));
+          }
+          break;
+        case 55: // ONEOF_INT32:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + (oneofIntAt(message, offset));
+          }
+          break;
+        case 56: // ONEOF_FIXED64:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + Internal.hashLong(oneofLongAt(message, offset));
+          }
+          break;
+        case 57: // ONEOF_FIXED32:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + (oneofIntAt(message, offset));
+          }
+          break;
+        case 58: // ONEOF_BOOL:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + Internal.hashBoolean(oneofBooleanAt(message, offset));
+          }
+          break;
+        case 59: // ONEOF_STRING:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode =
+                (hashCode * 53) + ((String) UnsafeUtil.getObject(message, offset)).hashCode();
+          }
+          break;
+        case 60: // ONEOF_MESSAGE:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            Object submessage = UnsafeUtil.getObject(message, offset);
+            hashCode = (53 * hashCode) + submessage.hashCode();
+          }
+          break;
+        case 61: // ONEOF_BYTES:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + UnsafeUtil.getObject(message, offset).hashCode();
+          }
+          break;
+        case 62: // ONEOF_UINT32:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + (oneofIntAt(message, offset));
+          }
+          break;
+        case 63: // ONEOF_ENUM:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + (oneofIntAt(message, offset));
+          }
+          break;
+        case 64: // ONEOF_SFIXED32:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + (oneofIntAt(message, offset));
+          }
+          break;
+        case 65: // ONEOF_SFIXED64:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + Internal.hashLong(oneofLongAt(message, offset));
+          }
+          break;
+        case 66: // ONEOF_SINT32:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + (oneofIntAt(message, offset));
+          }
+          break;
+        case 67: // ONEOF_SINT64:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            hashCode = (hashCode * 53) + Internal.hashLong(oneofLongAt(message, offset));
+          }
+          break;
+        case 68: // ONEOF_GROUP:
+          if (isOneofPresent(message, entryNumber, pos)) {
+            Object submessage = UnsafeUtil.getObject(message, offset);
+            hashCode = (53 * hashCode) + submessage.hashCode();
+          }
+          break;
+        default:
+          // Assume it's an empty entry - just go to the next entry.
+          break;
+      }
+    }
+
+    hashCode = (hashCode * 53) + unknownFieldSchema.getFromMessage(message).hashCode();
+
+    if (hasExtensions) {
+      hashCode = (hashCode * 53) + extensionSchema.getExtensions(message).hashCode();
+    }
+
+    return hashCode;
+  }
+
+  @Override
+  public void mergeFrom(T message, T other) {
+    if (other == null) {
+      throw new NullPointerException();
+    }
+    for (int i = 0; i < buffer.length; i += INTS_PER_FIELD) {
+      // A separate method allows for better JIT optimizations
+      mergeSingleField(message, other, i);
+    }
+
+    if (!proto3) {
+      SchemaUtil.mergeUnknownFields(unknownFieldSchema, message, other);
+
+      if (hasExtensions) {
+        SchemaUtil.mergeExtensions(extensionSchema, message, other);
+      }
+    }
+  }
+
+  private void mergeSingleField(T message, T other, int pos) {
+    final int typeAndOffset = typeAndOffsetAt(pos);
+    final long offset = offset(typeAndOffset);
+    final int number = numberAt(pos);
+
+    switch (type(typeAndOffset)) {
+      case 0: // DOUBLE:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putDouble(message, offset, UnsafeUtil.getDouble(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 1: // FLOAT:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putFloat(message, offset, UnsafeUtil.getFloat(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 2: // INT64:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putLong(message, offset, UnsafeUtil.getLong(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 3: // UINT64:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putLong(message, offset, UnsafeUtil.getLong(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 4: // INT32:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putInt(message, offset, UnsafeUtil.getInt(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 5: // FIXED64:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putLong(message, offset, UnsafeUtil.getLong(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 6: // FIXED32:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putInt(message, offset, UnsafeUtil.getInt(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 7: // BOOL:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putBoolean(message, offset, UnsafeUtil.getBoolean(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 8: // STRING:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putObject(message, offset, UnsafeUtil.getObject(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 9: // MESSAGE:
+        mergeMessage(message, other, pos);
+        break;
+      case 10: // BYTES:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putObject(message, offset, UnsafeUtil.getObject(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 11: // UINT32:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putInt(message, offset, UnsafeUtil.getInt(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 12: // ENUM:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putInt(message, offset, UnsafeUtil.getInt(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 13: // SFIXED32:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putInt(message, offset, UnsafeUtil.getInt(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 14: // SFIXED64:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putLong(message, offset, UnsafeUtil.getLong(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 15: // SINT32:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putInt(message, offset, UnsafeUtil.getInt(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 16: // SINT64:
+        if (isFieldPresent(other, pos)) {
+          UnsafeUtil.putLong(message, offset, UnsafeUtil.getLong(other, offset));
+          setFieldPresent(message, pos);
+        }
+        break;
+      case 17: // GROUP:
+        mergeMessage(message, other, pos);
+        break;
+      case 18: // DOUBLE_LIST:
+      case 19: // FLOAT_LIST:
+      case 20: // INT64_LIST:
+      case 21: // UINT64_LIST:
+      case 22: // INT32_LIST:
+      case 23: // FIXED64_LIST:
+      case 24: // FIXED32_LIST:
+      case 25: // BOOL_LIST:
+      case 26: // STRING_LIST:
+      case 27: // MESSAGE_LIST:
+      case 28: // BYTES_LIST:
+      case 29: // UINT32_LIST:
+      case 30: // ENUM_LIST:
+      case 31: // SFIXED32_LIST:
+      case 32: // SFIXED64_LIST:
+      case 33: // SINT32_LIST:
+      case 34: // SINT64_LIST:
+      case 35: // DOUBLE_LIST_PACKED:
+      case 36: // FLOAT_LIST_PACKED:
+      case 37: // INT64_LIST_PACKED:
+      case 38: // UINT64_LIST_PACKED:
+      case 39: // INT32_LIST_PACKED:
+      case 40: // FIXED64_LIST_PACKED:
+      case 41: // FIXED32_LIST_PACKED:
+      case 42: // BOOL_LIST_PACKED:
+      case 43: // UINT32_LIST_PACKED:
+      case 44: // ENUM_LIST_PACKED:
+      case 45: // SFIXED32_LIST_PACKED:
+      case 46: // SFIXED64_LIST_PACKED:
+      case 47: // SINT32_LIST_PACKED:
+      case 48: // SINT64_LIST_PACKED:
+      case 49: // GROUP_LIST:
+        listFieldSchema.mergeListsAt(message, other, offset);
+        break;
+      case 50: // MAP:
+        SchemaUtil.mergeMap(mapFieldSchema, message, other, offset);
+        break;
+      case 51: // ONEOF_DOUBLE:
+      case 52: // ONEOF_FLOAT:
+      case 53: // ONEOF_INT64:
+      case 54: // ONEOF_UINT64:
+      case 55: // ONEOF_INT32:
+      case 56: // ONEOF_FIXED64:
+      case 57: // ONEOF_FIXED32:
+      case 58: // ONEOF_BOOL:
+      case 59: // ONEOF_STRING:
+        if (isOneofPresent(other, number, pos)) {
+          UnsafeUtil.putObject(message, offset, UnsafeUtil.getObject(other, offset));
+          setOneofPresent(message, number, pos);
+        }
+        break;
+
+      case 60: // ONEOF_MESSAGE:
+        mergeOneofMessage(message, other, pos);
+        break;
+      case 61: // ONEOF_BYTES:
+      case 62: // ONEOF_UINT32:
+      case 63: // ONEOF_ENUM:
+      case 64: // ONEOF_SFIXED32:
+      case 65: // ONEOF_SFIXED64:
+      case 66: // ONEOF_SINT32:
+      case 67: // ONEOF_SINT64:
+        if (isOneofPresent(other, number, pos)) {
+          UnsafeUtil.putObject(message, offset, UnsafeUtil.getObject(other, offset));
+          setOneofPresent(message, number, pos);
+        }
+        break;
+      case 68: // ONEOF_GROUP:
+        mergeOneofMessage(message, other, pos);
+        break;
+      default:
+        break;
+    }
+  }
+
+  private void mergeMessage(T message, T other, int pos) {
+    final int typeAndOffset = typeAndOffsetAt(pos);
+    final long offset = offset(typeAndOffset);
+
+    if (!isFieldPresent(other, pos)) {
+      return;
+    }
+
+    Object mine = UnsafeUtil.getObject(message, offset);
+    Object theirs = UnsafeUtil.getObject(other, offset);
+    if (mine != null && theirs != null) {
+      Object merged = Internal.mergeMessage(mine, theirs);
+      UnsafeUtil.putObject(message, offset, merged);
+      setFieldPresent(message, pos);
+    } else if (theirs != null) {
+      UnsafeUtil.putObject(message, offset, theirs);
+      setFieldPresent(message, pos);
+    }
+  }
+
+  private void mergeOneofMessage(T message, T other, int pos) {
+    int typeAndOffset = typeAndOffsetAt(pos);
+    int number = numberAt(pos);
+    long offset = offset(typeAndOffset);
+
+    if (!isOneofPresent(other, number, pos)) {
+      return;
+    }
+
+    Object mine = UnsafeUtil.getObject(message, offset);
+    Object theirs = UnsafeUtil.getObject(other, offset);
+    if (mine != null && theirs != null) {
+      Object merged = Internal.mergeMessage(mine, theirs);
+      UnsafeUtil.putObject(message, offset, merged);
+      setOneofPresent(message, number, pos);
+    } else if (theirs != null) {
+      UnsafeUtil.putObject(message, offset, theirs);
+      setOneofPresent(message, number, pos);
+    }
+  }
+
+  @Override
+  public int getSerializedSize(T message) {
+    return proto3 ? getSerializedSizeProto3(message) : getSerializedSizeProto2(message);
+  }
+  
+  @SuppressWarnings("unchecked")
+  private int getSerializedSizeProto2(T message) {
+    int size = 0;
+
+    final sun.misc.Unsafe unsafe = UNSAFE;
+    int currentPresenceFieldOffset = -1;
+    int currentPresenceField = 0;
+    for (int i = 0; i < buffer.length; i += INTS_PER_FIELD) {
+      final int typeAndOffset = typeAndOffsetAt(i);
+      final int number = numberAt(i);
+
+      int fieldType = type(typeAndOffset);
+      int presenceMaskAndOffset = 0;
+      int presenceMask = 0;
+      if (fieldType <= 17) {
+        presenceMaskAndOffset = buffer[i + 2];
+        final int presenceFieldOffset = presenceMaskAndOffset & OFFSET_MASK;
+        presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
+        if (presenceFieldOffset != currentPresenceFieldOffset) {
+          currentPresenceFieldOffset = presenceFieldOffset;
+          currentPresenceField = unsafe.getInt(message, (long) presenceFieldOffset);
+        }
+      } else if (useCachedSizeField
+          && fieldType >= FieldType.DOUBLE_LIST_PACKED.id()
+          && fieldType <= FieldType.SINT64_LIST_PACKED.id()) {
+        presenceMaskAndOffset = buffer[i + 2] & OFFSET_MASK;
+      }
+
+      final long offset = offset(typeAndOffset);
+
+      switch (fieldType) {
+        case 0: // DOUBLE:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeDoubleSize(number, 0);
+          }
+          break;
+        case 1: // FLOAT:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeFloatSize(number, 0);
+          }
+          break;
+        case 2: // INT64:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeInt64Size(number, unsafe.getLong(message, offset));
+          }
+          break;
+        case 3: // UINT64:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeUInt64Size(number, unsafe.getLong(message, offset));
+          }
+          break;
+        case 4: // INT32:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeInt32Size(number, unsafe.getInt(message, offset));
+          }
+          break;
+        case 5: // FIXED64:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeFixed64Size(number, 0);
+          }
+          break;
+        case 6: // FIXED32:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeFixed32Size(number, 0);
+          }
+          break;
+        case 7: // BOOL:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeBoolSize(number, true);
+          }
+          break;
+        case 8: // STRING:
+          if ((currentPresenceField & presenceMask) != 0) {
+            Object value = unsafe.getObject(message, offset);
+            if (value instanceof ByteString) {
+              size += CodedOutputStream.computeBytesSize(number, (ByteString) value);
+            } else {
+              size += CodedOutputStream.computeStringSize(number, (String) value);
+            }
+          }
+          break;
+        case 9: // MESSAGE:
+          if ((currentPresenceField & presenceMask) != 0) {
+            Object value = unsafe.getObject(message, offset);
+            size += SchemaUtil.computeSizeMessage(number, value, getMessageFieldSchema(i));
+          }
+          break;
+        case 10: // BYTES:
+          if ((currentPresenceField & presenceMask) != 0) {
+            ByteString value = (ByteString) unsafe.getObject(message, offset);
+            size += CodedOutputStream.computeBytesSize(number, value);
+          }
+          break;
+        case 11: // UINT32:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeUInt32Size(number, unsafe.getInt(message, offset));
+          }
+          break;
+        case 12: // ENUM:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeEnumSize(number, unsafe.getInt(message, offset));
+          }
+          break;
+        case 13: // SFIXED32:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeSFixed32Size(number, 0);
+          }
+          break;
+        case 14: // SFIXED64:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeSFixed64Size(number, 0);
+          }
+          break;
+        case 15: // SINT32:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeSInt32Size(number, unsafe.getInt(message, offset));
+          }
+          break;
+        case 16: // SINT64:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size += CodedOutputStream.computeSInt64Size(number, unsafe.getLong(message, offset));
+          }
+          break;
+        case 17: // GROUP:
+          if ((currentPresenceField & presenceMask) != 0) {
+            size +=
+                CodedOutputStream.computeGroupSize(
+                    number,
+                    (MessageLite) unsafe.getObject(message, offset),
+                    getMessageFieldSchema(i));
+          }
+          break;
+        case 18: // DOUBLE_LIST:
+          size +=
+              SchemaUtil.computeSizeFixed64List(
+                  number, (List<?>) unsafe.getObject(message, offset), false);
+          break;
+        case 19: // FLOAT_LIST:
+          size +=
+              SchemaUtil.computeSizeFixed32List(
+                  number, (List<?>) unsafe.getObject(message, offset), false);
+          break;
+        case 20: // INT64_LIST:
+          size +=
+              SchemaUtil.computeSizeInt64List(
+                  number, (List<Long>) unsafe.getObject(message, offset), false);
+          break;
+        case 21: // UINT64_LIST:
+          size +=
+              SchemaUtil.computeSizeUInt64List(
+                  number, (List<Long>) unsafe.getObject(message, offset), false);
+          break;
+        case 22: // INT32_LIST:
+          size +=
+              SchemaUtil.computeSizeInt32List(
+                  number, (List<Integer>) unsafe.getObject(message, offset), false);
+          break;
+        case 23: // FIXED64_LIST:
+          size +=
+              SchemaUtil.computeSizeFixed64List(
+                  number, (List<?>) unsafe.getObject(message, offset), false);
+          break;
+        case 24: // FIXED32_LIST:
+          size +=
+              SchemaUtil.computeSizeFixed32List(
+                  number, (List<?>) unsafe.getObject(message, offset), false);
+          break;
+        case 25: // BOOL_LIST:
+          size +=
+              SchemaUtil.computeSizeBoolList(
+                  number, (List<?>) unsafe.getObject(message, offset), false);
+          break;
+        case 26: // STRING_LIST:
+          size +=
+              SchemaUtil.computeSizeStringList(number, (List<?>) unsafe.getObject(message, offset));
+          break;
+        case 27: // MESSAGE_LIST:
+          size +=
+              SchemaUtil.computeSizeMessageList(
+                  number, (List<?>) unsafe.getObject(message, offset), getMessageFieldSchema(i));
+          break;
+        case 28: // BYTES_LIST:
+          size +=
+              SchemaUtil.computeSizeByteStringList(
+                  number, (List<ByteString>) unsafe.getObject(message, offset));
+          break;
+        case 29: // UINT32_LIST:
+          size +=
+              SchemaUtil.computeSizeUInt32List(
+                  number, (List<Integer>) unsafe.getObject(message, offset), false);
+          break;
+        case 30: // ENUM_LIST:
+          size +=
+              SchemaUtil.computeSizeEnumList(
+                  number, (List<Integer>) unsafe.getObject(message, offset), false);
+          break;
+        case 31: // SFIXED32_LIST:
+          size +=
+              SchemaUtil.computeSizeFixed32List(
+                  number, (List<Integer>) unsafe.getObject(message, offset), false);
+          break;
+        case 32: // SFIXED64_LIST:
+          size +=
+              SchemaUtil.computeSizeFixed64List(
+                  number, (List<Long>) unsafe.getObject(message, offset), false);
+          break;
+        case 33: // SINT32_LIST:
+          size +=
+              SchemaUtil.computeSizeSInt32List(
+                  number, (List<Integer>) unsafe.getObject(message, offset), false);
+          break;
+        case 34: // SINT64_LIST:
+          size +=
+              SchemaUtil.computeSizeSInt64List(
+                  number, (List<Long>) unsafe.getObject(message, offset), false);
+          break;
+        case 35:
+          { // DOUBLE_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed64ListNoTag(
+                    (List<Double>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 36:
+          { // FLOAT_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed32ListNoTag(
+                    (List<Float>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 37:
+          { // INT64_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeInt64ListNoTag(
+                    (List<Long>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 38:
+          { // UINT64_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeUInt64ListNoTag(
+                    (List<Long>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 39:
+          { // INT32_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeInt32ListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 40:
+          { // FIXED64_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed64ListNoTag(
+                    (List<Long>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 41:
+          { // FIXED32_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed32ListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 42:
+          { // BOOL_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeBoolListNoTag(
+                    (List<Boolean>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 43:
+          { // UINT32_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeUInt32ListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 44:
+          { // ENUM_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeEnumListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 45:
+          { // SFIXED32_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed32ListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 46:
+          { // SFIXED64_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed64ListNoTag(
+                    (List<Long>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 47:
+          { // SINT32_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeSInt32ListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 48:
+          { // SINT64_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeSInt64ListNoTag(
+                    (List<Long>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) presenceMaskAndOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 49: // GROUP_LIST:
+          size +=
+              SchemaUtil.computeSizeGroupList(
+                  number,
+                  (List<MessageLite>) unsafe.getObject(message, offset),
+                  getMessageFieldSchema(i));
+          break;
+        case 50: // MAP:
+          // TODO(dweis): Use schema cache.
+          size +=
+              mapFieldSchema.getSerializedSize(
+                  number, unsafe.getObject(message, offset), getMapFieldDefaultEntry(i));
+          break;
+        case 51: // ONEOF_DOUBLE:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeDoubleSize(number, 0);
+          }
+          break;
+        case 52: // ONEOF_FLOAT:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeFloatSize(number, 0);
+          }
+          break;
+        case 53: // ONEOF_INT64:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeInt64Size(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 54: // ONEOF_UINT64:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeUInt64Size(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 55: // ONEOF_INT32:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeInt32Size(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 56: // ONEOF_FIXED64:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeFixed64Size(number, 0);
+          }
+          break;
+        case 57: // ONEOF_FIXED32:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeFixed32Size(number, 0);
+          }
+          break;
+        case 58: // ONEOF_BOOL:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeBoolSize(number, true);
+          }
+          break;
+        case 59: // ONEOF_STRING:
+          if (isOneofPresent(message, number, i)) {
+            Object value = unsafe.getObject(message, offset);
+            if (value instanceof ByteString) {
+              size += CodedOutputStream.computeBytesSize(number, (ByteString) value);
+            } else {
+              size += CodedOutputStream.computeStringSize(number, (String) value);
+            }
+          }
+          break;
+        case 60: // ONEOF_MESSAGE:
+          if (isOneofPresent(message, number, i)) {
+            Object value = unsafe.getObject(message, offset);
+            size += SchemaUtil.computeSizeMessage(number, value, getMessageFieldSchema(i));
+          }
+          break;
+        case 61: // ONEOF_BYTES:
+          if (isOneofPresent(message, number, i)) {
+            size +=
+                CodedOutputStream.computeBytesSize(
+                    number, (ByteString) unsafe.getObject(message, offset));
+          }
+          break;
+        case 62: // ONEOF_UINT32:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeUInt32Size(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 63: // ONEOF_ENUM:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeEnumSize(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 64: // ONEOF_SFIXED32:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeSFixed32Size(number, 0);
+          }
+          break;
+        case 65: // ONEOF_SFIXED64:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeSFixed64Size(number, 0);
+          }
+          break;
+        case 66: // ONEOF_SINT32:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeSInt32Size(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 67: // ONEOF_SINT64:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeSInt64Size(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 68: // ONEOF_GROUP:
+          if (isOneofPresent(message, number, i)) {
+            size +=
+                CodedOutputStream.computeGroupSize(
+                    number,
+                    (MessageLite) unsafe.getObject(message, offset),
+                    getMessageFieldSchema(i));
+          }
+          break;
+        default:
+          // Assume it's an empty entry.
+      }
+    }
+
+    size += getUnknownFieldsSerializedSize(unknownFieldSchema, message);
+
+    if (hasExtensions) {
+      size += extensionSchema.getExtensions(message).getSerializedSize();
+    }
+
+    return size;
+  }
+
+  private int getSerializedSizeProto3(T message) {
+    final sun.misc.Unsafe unsafe = UNSAFE;
+    int size = 0;
+    for (int i = 0; i < buffer.length; i += INTS_PER_FIELD) {
+      final int typeAndOffset = typeAndOffsetAt(i);
+      final int fieldType = type(typeAndOffset);
+      final int number = numberAt(i);
+
+      final long offset = offset(typeAndOffset);
+      final int cachedSizeOffset =
+          fieldType >= FieldType.DOUBLE_LIST_PACKED.id()
+                  && fieldType <= FieldType.SINT64_LIST_PACKED.id()
+              ? buffer[i + 2] & OFFSET_MASK
+              : 0;
+
+      switch (fieldType) {
+        case 0: // DOUBLE:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeDoubleSize(number, 0);
+          }
+          break;
+        case 1: // FLOAT:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeFloatSize(number, 0);
+          }
+          break;
+        case 2: // INT64:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeInt64Size(number, UnsafeUtil.getLong(message, offset));
+          }
+          break;
+        case 3: // UINT64:
+          if (isFieldPresent(message, i)) {
+            size +=
+                CodedOutputStream.computeUInt64Size(number, UnsafeUtil.getLong(message, offset));
+          }
+          break;
+        case 4: // INT32:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeInt32Size(number, UnsafeUtil.getInt(message, offset));
+          }
+          break;
+        case 5: // FIXED64:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeFixed64Size(number, 0);
+          }
+          break;
+        case 6: // FIXED32:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeFixed32Size(number, 0);
+          }
+          break;
+        case 7: // BOOL:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeBoolSize(number, true);
+          }
+          break;
+        case 8: // STRING:
+          if (isFieldPresent(message, i)) {
+            Object value = UnsafeUtil.getObject(message, offset);
+            if (value instanceof ByteString) {
+              size += CodedOutputStream.computeBytesSize(number, (ByteString) value);
+            } else {
+              size += CodedOutputStream.computeStringSize(number, (String) value);
+            }
+          }
+          break;
+        case 9: // MESSAGE:
+          if (isFieldPresent(message, i)) {
+            Object value = UnsafeUtil.getObject(message, offset);
+            size += SchemaUtil.computeSizeMessage(number, value, getMessageFieldSchema(i));
+          }
+          break;
+        case 10: // BYTES:
+          if (isFieldPresent(message, i)) {
+            ByteString value = (ByteString) UnsafeUtil.getObject(message, offset);
+            size += CodedOutputStream.computeBytesSize(number, value);
+          }
+          break;
+        case 11: // UINT32:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeUInt32Size(number, UnsafeUtil.getInt(message, offset));
+          }
+          break;
+        case 12: // ENUM:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeEnumSize(number, UnsafeUtil.getInt(message, offset));
+          }
+          break;
+        case 13: // SFIXED32:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeSFixed32Size(number, 0);
+          }
+          break;
+        case 14: // SFIXED64:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeSFixed64Size(number, 0);
+          }
+          break;
+        case 15: // SINT32:
+          if (isFieldPresent(message, i)) {
+            size += CodedOutputStream.computeSInt32Size(number, UnsafeUtil.getInt(message, offset));
+          }
+          break;
+        case 16: // SINT64:
+          if (isFieldPresent(message, i)) {
+            size +=
+                CodedOutputStream.computeSInt64Size(number, UnsafeUtil.getLong(message, offset));
+          }
+          break;
+        case 17: // GROUP:
+          if (isFieldPresent(message, i)) {
+            size +=
+                CodedOutputStream.computeGroupSize(
+                    number,
+                    (MessageLite) UnsafeUtil.getObject(message, offset),
+                    getMessageFieldSchema(i));
+          }
+          break;
+        case 18: // DOUBLE_LIST:
+          size += SchemaUtil.computeSizeFixed64List(number, listAt(message, offset), false);
+          break;
+        case 19: // FLOAT_LIST:
+          size += SchemaUtil.computeSizeFixed32List(number, listAt(message, offset), false);
+          break;
+        case 20: // INT64_LIST:
+          size +=
+              SchemaUtil.computeSizeInt64List(number, (List<Long>) listAt(message, offset), false);
+          break;
+        case 21: // UINT64_LIST:
+          size +=
+              SchemaUtil.computeSizeUInt64List(number, (List<Long>) listAt(message, offset), false);
+          break;
+        case 22: // INT32_LIST:
+          size +=
+              SchemaUtil.computeSizeInt32List(
+                  number, (List<Integer>) listAt(message, offset), false);
+          break;
+        case 23: // FIXED64_LIST:
+          size += SchemaUtil.computeSizeFixed64List(number, listAt(message, offset), false);
+          break;
+        case 24: // FIXED32_LIST:
+          size += SchemaUtil.computeSizeFixed32List(number, listAt(message, offset), false);
+          break;
+        case 25: // BOOL_LIST:
+          size += SchemaUtil.computeSizeBoolList(number, listAt(message, offset), false);
+          break;
+        case 26: // STRING_LIST:
+          size += SchemaUtil.computeSizeStringList(number, listAt(message, offset));
+          break;
+        case 27: // MESSAGE_LIST:
+          size +=
+              SchemaUtil.computeSizeMessageList(
+                  number, listAt(message, offset), getMessageFieldSchema(i));
+          break;
+        case 28: // BYTES_LIST:
+          size +=
+              SchemaUtil.computeSizeByteStringList(
+                  number, (List<ByteString>) listAt(message, offset));
+          break;
+        case 29: // UINT32_LIST:
+          size +=
+              SchemaUtil.computeSizeUInt32List(
+                  number, (List<Integer>) listAt(message, offset), false);
+          break;
+        case 30: // ENUM_LIST:
+          size +=
+              SchemaUtil.computeSizeEnumList(
+                  number, (List<Integer>) listAt(message, offset), false);
+          break;
+        case 31: // SFIXED32_LIST:
+          size += SchemaUtil.computeSizeFixed32List(number, listAt(message, offset), false);
+          break;
+        case 32: // SFIXED64_LIST:
+          size += SchemaUtil.computeSizeFixed64List(number, listAt(message, offset), false);
+          break;
+        case 33: // SINT32_LIST:
+          size +=
+              SchemaUtil.computeSizeSInt32List(
+                  number, (List<Integer>) listAt(message, offset), false);
+          break;
+        case 34: // SINT64_LIST:
+          size +=
+              SchemaUtil.computeSizeSInt64List(number, (List<Long>) listAt(message, offset), false);
+          break;
+        case 35:
+          { // DOUBLE_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed64ListNoTag(
+                    (List<Double>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 36:
+          { // FLOAT_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed32ListNoTag(
+                    (List<Float>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 37:
+          { // INT64_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeInt64ListNoTag(
+                    (List<Long>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 38:
+          { // UINT64_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeUInt64ListNoTag(
+                    (List<Long>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 39:
+          { // INT32_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeInt32ListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 40:
+          { // FIXED64_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed64ListNoTag(
+                    (List<Long>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 41:
+          { // FIXED32_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed32ListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 42:
+          { // BOOL_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeBoolListNoTag(
+                    (List<Boolean>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 43:
+          { // UINT32_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeUInt32ListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 44:
+          { // ENUM_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeEnumListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 45:
+          { // SFIXED32_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed32ListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 46:
+          { // SFIXED64_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeFixed64ListNoTag(
+                    (List<Long>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 47:
+          { // SINT32_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeSInt32ListNoTag(
+                    (List<Integer>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 48:
+          { // SINT64_LIST_PACKED:
+            int fieldSize =
+                SchemaUtil.computeSizeSInt64ListNoTag(
+                    (List<Long>) unsafe.getObject(message, offset));
+            if (fieldSize > 0) {
+              if (useCachedSizeField) {
+                unsafe.putInt(message, (long) cachedSizeOffset, fieldSize);
+              }
+              size +=
+                  CodedOutputStream.computeTagSize(number)
+                      + CodedOutputStream.computeUInt32SizeNoTag(fieldSize)
+                      + fieldSize;
+            }
+            break;
+          }
+        case 49: // GROUP_LIST:
+          size +=
+              SchemaUtil.computeSizeGroupList(
+                  number, (List<MessageLite>) listAt(message, offset), getMessageFieldSchema(i));
+          break;
+        case 50: // MAP:
+          // TODO(dweis): Use schema cache.
+          size +=
+              mapFieldSchema.getSerializedSize(
+                  number, UnsafeUtil.getObject(message, offset), getMapFieldDefaultEntry(i));
+          break;
+        case 51: // ONEOF_DOUBLE:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeDoubleSize(number, 0);
+          }
+          break;
+        case 52: // ONEOF_FLOAT:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeFloatSize(number, 0);
+          }
+          break;
+        case 53: // ONEOF_INT64:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeInt64Size(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 54: // ONEOF_UINT64:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeUInt64Size(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 55: // ONEOF_INT32:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeInt32Size(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 56: // ONEOF_FIXED64:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeFixed64Size(number, 0);
+          }
+          break;
+        case 57: // ONEOF_FIXED32:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeFixed32Size(number, 0);
+          }
+          break;
+        case 58: // ONEOF_BOOL:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeBoolSize(number, true);
+          }
+          break;
+        case 59: // ONEOF_STRING:
+          if (isOneofPresent(message, number, i)) {
+            Object value = UnsafeUtil.getObject(message, offset);
+            if (value instanceof ByteString) {
+              size += CodedOutputStream.computeBytesSize(number, (ByteString) value);
+            } else {
+              size += CodedOutputStream.computeStringSize(number, (String) value);
+            }
+          }
+          break;
+        case 60: // ONEOF_MESSAGE:
+          if (isOneofPresent(message, number, i)) {
+            Object value = UnsafeUtil.getObject(message, offset);
+            size += SchemaUtil.computeSizeMessage(number, value, getMessageFieldSchema(i));
+          }
+          break;
+        case 61: // ONEOF_BYTES:
+          if (isOneofPresent(message, number, i)) {
+            size +=
+                CodedOutputStream.computeBytesSize(
+                    number, (ByteString) UnsafeUtil.getObject(message, offset));
+          }
+          break;
+        case 62: // ONEOF_UINT32:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeUInt32Size(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 63: // ONEOF_ENUM:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeEnumSize(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 64: // ONEOF_SFIXED32:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeSFixed32Size(number, 0);
+          }
+          break;
+        case 65: // ONEOF_SFIXED64:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeSFixed64Size(number, 0);
+          }
+          break;
+        case 66: // ONEOF_SINT32:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeSInt32Size(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 67: // ONEOF_SINT64:
+          if (isOneofPresent(message, number, i)) {
+            size += CodedOutputStream.computeSInt64Size(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 68: // ONEOF_GROUP:
+          if (isOneofPresent(message, number, i)) {
+            size +=
+                CodedOutputStream.computeGroupSize(
+                    number,
+                    (MessageLite) UnsafeUtil.getObject(message, offset),
+                    getMessageFieldSchema(i));
+          }
+          break;
+        default:
+          // Assume it's an empty entry.
+      }
+    }
+
+    size += getUnknownFieldsSerializedSize(unknownFieldSchema, message);
+
+    return size;
+  }
+
+  private <UT, UB> int getUnknownFieldsSerializedSize(
+      UnknownFieldSchema<UT, UB> schema, T message) {
+    UT unknowns = schema.getFromMessage(message);
+    return schema.getSerializedSize(unknowns);
+  }
+
+  private static List<?> listAt(Object message, long offset) {
+    return (List<?>) UnsafeUtil.getObject(message, offset);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  // TODO(nathanmittler): Consider serializing oneof fields last so that only one entry per
+  // oneof is actually serialized. This would mean that we would violate the serialization order
+  // contract. It should also be noted that Go currently does this.
+  public void writeTo(T message, Writer writer) throws IOException {
+    if (writer.fieldOrder() == Writer.FieldOrder.DESCENDING) {
+      writeFieldsInDescendingOrder(message, writer);
+    } else {
+      if (proto3) {
+        writeFieldsInAscendingOrderProto3(message, writer);
+      } else {
+        writeFieldsInAscendingOrderProto2(message, writer);
+      }
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private void writeFieldsInAscendingOrderProto2(T message, Writer writer) throws IOException {
+    Iterator<? extends Map.Entry<?, ?>> extensionIterator = null;
+    Map.Entry nextExtension = null;
+    if (hasExtensions) {
+      FieldSet<?> extensions = extensionSchema.getExtensions(message);
+      if (!extensions.isEmpty()) {
+        extensionIterator = extensions.iterator();
+        nextExtension = extensionIterator.next();
+      }
+    }
+    int currentPresenceFieldOffset = -1;
+    int currentPresenceField = 0;
+    final int bufferLength = buffer.length;
+    final sun.misc.Unsafe unsafe = UNSAFE;
+    for (int pos = 0; pos < bufferLength; pos += INTS_PER_FIELD) {
+      final int typeAndOffset = typeAndOffsetAt(pos);
+      final int number = numberAt(pos);
+      final int fieldType = type(typeAndOffset);
+
+      int presenceMaskAndOffset = 0;
+      int presenceMask = 0;
+      if (!proto3 && fieldType <= 17) {
+        presenceMaskAndOffset = buffer[pos + 2];
+        final int presenceFieldOffset = presenceMaskAndOffset & OFFSET_MASK;
+        if (presenceFieldOffset != currentPresenceFieldOffset) {
+          currentPresenceFieldOffset = presenceFieldOffset;
+          currentPresenceField = unsafe.getInt(message, (long) presenceFieldOffset);
+        }
+        presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
+      }
+
+      // Write any extensions that need to be written before the current field.
+      while (nextExtension != null && extensionSchema.extensionNumber(nextExtension) <= number) {
+        extensionSchema.serializeExtension(writer, nextExtension);
+        nextExtension = extensionIterator.hasNext() ? extensionIterator.next() : null;
+      }
+      final long offset = offset(typeAndOffset);
+
+      switch (fieldType) {
+        case 0: // DOUBLE:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeDouble(number, doubleAt(message, offset));
+          }
+          break;
+        case 1: // FLOAT:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeFloat(number, floatAt(message, offset));
+          }
+          break;
+        case 2: // INT64:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeInt64(number, unsafe.getLong(message, offset));
+          }
+          break;
+        case 3: // UINT64:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeUInt64(number, unsafe.getLong(message, offset));
+          }
+          break;
+        case 4: // INT32:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeInt32(number, unsafe.getInt(message, offset));
+          }
+          break;
+        case 5: // FIXED64:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeFixed64(number, unsafe.getLong(message, offset));
+          }
+          break;
+        case 6: // FIXED32:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeFixed32(number, unsafe.getInt(message, offset));
+          }
+          break;
+        case 7: // BOOL:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeBool(number, booleanAt(message, offset));
+          }
+          break;
+        case 8: // STRING:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writeString(number, unsafe.getObject(message, offset), writer);
+          }
+          break;
+        case 9: // MESSAGE:
+          if ((currentPresenceField & presenceMask) != 0) {
+            Object value = unsafe.getObject(message, offset);
+            writer.writeMessage(number, value, getMessageFieldSchema(pos));
+          }
+          break;
+        case 10: // BYTES:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeBytes(number, (ByteString) unsafe.getObject(message, offset));
+          }
+          break;
+        case 11: // UINT32:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeUInt32(number, unsafe.getInt(message, offset));
+          }
+          break;
+        case 12: // ENUM:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeEnum(number, unsafe.getInt(message, offset));
+          }
+          break;
+        case 13: // SFIXED32:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeSFixed32(number, unsafe.getInt(message, offset));
+          }
+          break;
+        case 14: // SFIXED64:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeSFixed64(number, unsafe.getLong(message, offset));
+          }
+          break;
+        case 15: // SINT32:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeSInt32(number, unsafe.getInt(message, offset));
+          }
+          break;
+        case 16: // SINT64:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeSInt64(number, unsafe.getLong(message, offset));
+          }
+          break;
+        case 17: // GROUP:
+          if ((currentPresenceField & presenceMask) != 0) {
+            writer.writeGroup(
+                number, unsafe.getObject(message, offset), getMessageFieldSchema(pos));
+          }
+          break;
+        case 18: // DOUBLE_LIST:
+          SchemaUtil.writeDoubleList(
+              numberAt(pos), (List<Double>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 19: // FLOAT_LIST:
+          SchemaUtil.writeFloatList(
+              numberAt(pos), (List<Float>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 20: // INT64_LIST:
+          SchemaUtil.writeInt64List(
+              numberAt(pos), (List<Long>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 21: // UINT64_LIST:
+          SchemaUtil.writeUInt64List(
+              numberAt(pos), (List<Long>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 22: // INT32_LIST:
+          SchemaUtil.writeInt32List(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 23: // FIXED64_LIST:
+          SchemaUtil.writeFixed64List(
+              numberAt(pos), (List<Long>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 24: // FIXED32_LIST:
+          SchemaUtil.writeFixed32List(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 25: // BOOL_LIST:
+          SchemaUtil.writeBoolList(
+              numberAt(pos), (List<Boolean>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 26: // STRING_LIST:
+          SchemaUtil.writeStringList(
+              numberAt(pos), (List<String>) unsafe.getObject(message, offset), writer);
+          break;
+        case 27: // MESSAGE_LIST:
+          SchemaUtil.writeMessageList(
+              numberAt(pos),
+              (List<?>) unsafe.getObject(message, offset),
+              writer,
+              getMessageFieldSchema(pos));
+          break;
+        case 28: // BYTES_LIST:
+          SchemaUtil.writeBytesList(
+              numberAt(pos), (List<ByteString>) unsafe.getObject(message, offset), writer);
+          break;
+        case 29: // UINT32_LIST:
+          SchemaUtil.writeUInt32List(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 30: // ENUM_LIST:
+          SchemaUtil.writeEnumList(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 31: // SFIXED32_LIST:
+          SchemaUtil.writeSFixed32List(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 32: // SFIXED64_LIST:
+          SchemaUtil.writeSFixed64List(
+              numberAt(pos), (List<Long>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 33: // SINT32_LIST:
+          SchemaUtil.writeSInt32List(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 34: // SINT64_LIST:
+          SchemaUtil.writeSInt64List(
+              numberAt(pos), (List<Long>) unsafe.getObject(message, offset), writer, false);
+          break;
+        case 35: // DOUBLE_LIST_PACKED:
+          // TODO(xiaofeng): Make use of cached field size to speed up serialization.
+          SchemaUtil.writeDoubleList(
+              numberAt(pos), (List<Double>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 36: // FLOAT_LIST_PACKED:
+          SchemaUtil.writeFloatList(
+              numberAt(pos), (List<Float>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 37: // INT64_LIST_PACKED:
+          SchemaUtil.writeInt64List(
+              numberAt(pos), (List<Long>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 38: // UINT64_LIST_PACKED:
+          SchemaUtil.writeUInt64List(
+              numberAt(pos), (List<Long>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 39: // INT32_LIST_PACKED:
+          SchemaUtil.writeInt32List(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 40: // FIXED64_LIST_PACKED:
+          SchemaUtil.writeFixed64List(
+              numberAt(pos), (List<Long>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 41: // FIXED32_LIST_PACKED:
+          SchemaUtil.writeFixed32List(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, true);
+
+          break;
+        case 42: // BOOL_LIST_PACKED:
+          SchemaUtil.writeBoolList(
+              numberAt(pos), (List<Boolean>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 43: // UINT32_LIST_PACKED:
+          SchemaUtil.writeUInt32List(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 44: // ENUM_LIST_PACKED:
+          SchemaUtil.writeEnumList(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 45: // SFIXED32_LIST_PACKED:
+          SchemaUtil.writeSFixed32List(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 46: // SFIXED64_LIST_PACKED:
+          SchemaUtil.writeSFixed64List(
+              numberAt(pos), (List<Long>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 47: // SINT32_LIST_PACKED:
+          SchemaUtil.writeSInt32List(
+              numberAt(pos), (List<Integer>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 48: // SINT64_LIST_PACKED:
+          SchemaUtil.writeSInt64List(
+              numberAt(pos), (List<Long>) unsafe.getObject(message, offset), writer, true);
+          break;
+        case 49: // GROUP_LIST:
+          SchemaUtil.writeGroupList(
+              numberAt(pos),
+              (List<?>) unsafe.getObject(message, offset),
+              writer,
+              getMessageFieldSchema(pos));
+          break;
+        case 50: // MAP:
+          // TODO(dweis): Use schema cache.
+          writeMapHelper(writer, number, unsafe.getObject(message, offset), pos);
+          break;
+        case 51: // ONEOF_DOUBLE:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeDouble(number, oneofDoubleAt(message, offset));
+          }
+          break;
+        case 52: // ONEOF_FLOAT:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeFloat(number, oneofFloatAt(message, offset));
+          }
+          break;
+        case 53: // ONEOF_INT64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeInt64(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 54: // ONEOF_UINT64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeUInt64(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 55: // ONEOF_INT32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeInt32(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 56: // ONEOF_FIXED64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeFixed64(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 57: // ONEOF_FIXED32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeFixed32(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 58: // ONEOF_BOOL:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeBool(number, oneofBooleanAt(message, offset));
+          }
+          break;
+        case 59: // ONEOF_STRING:
+          if (isOneofPresent(message, number, pos)) {
+            writeString(number, unsafe.getObject(message, offset), writer);
+          }
+          break;
+        case 60: // ONEOF_MESSAGE:
+          if (isOneofPresent(message, number, pos)) {
+            Object value = unsafe.getObject(message, offset);
+            writer.writeMessage(number, value, getMessageFieldSchema(pos));
+          }
+          break;
+        case 61: // ONEOF_BYTES:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeBytes(number, (ByteString) unsafe.getObject(message, offset));
+          }
+          break;
+        case 62: // ONEOF_UINT32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeUInt32(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 63: // ONEOF_ENUM:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeEnum(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 64: // ONEOF_SFIXED32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSFixed32(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 65: // ONEOF_SFIXED64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSFixed64(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 66: // ONEOF_SINT32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSInt32(number, oneofIntAt(message, offset));
+          }
+          break;
+        case 67: // ONEOF_SINT64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSInt64(number, oneofLongAt(message, offset));
+          }
+          break;
+        case 68: // ONEOF_GROUP:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeGroup(
+                number, unsafe.getObject(message, offset), getMessageFieldSchema(pos));
+          }
+          break;
+        default:
+          // Assume it's an empty entry - just go to the next entry.
+          break;
+      }
+    }
+    while (nextExtension != null) {
+      extensionSchema.serializeExtension(writer, nextExtension);
+      nextExtension = extensionIterator.hasNext() ? extensionIterator.next() : null;
+    }
+    writeUnknownInMessageTo(unknownFieldSchema, message, writer);
+  }
+
+  @SuppressWarnings("unchecked")
+  private void writeFieldsInAscendingOrderProto3(T message, Writer writer) throws IOException {
+    Iterator<? extends Map.Entry<?, ?>> extensionIterator = null;
+    Map.Entry nextExtension = null;
+    if (hasExtensions) {
+      FieldSet<?> extensions = extensionSchema.getExtensions(message);
+      if (!extensions.isEmpty()) {
+        extensionIterator = extensions.iterator();
+        nextExtension = extensionIterator.next();
+      }
+    }
+
+    final int bufferLength = buffer.length;
+    for (int pos = 0; pos < bufferLength; pos += INTS_PER_FIELD) {
+      final int typeAndOffset = typeAndOffsetAt(pos);
+      final int number = numberAt(pos);
+
+      // Write any extensions that need to be written before the current field.
+      while (nextExtension != null && extensionSchema.extensionNumber(nextExtension) <= number) {
+        extensionSchema.serializeExtension(writer, nextExtension);
+        nextExtension = extensionIterator.hasNext() ? extensionIterator.next() : null;
+      }
+
+      switch (type(typeAndOffset)) {
+        case 0: // DOUBLE:
+          if (isFieldPresent(message, pos)) {
+            writer.writeDouble(number, doubleAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 1: // FLOAT:
+          if (isFieldPresent(message, pos)) {
+            writer.writeFloat(number, floatAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 2: // INT64:
+          if (isFieldPresent(message, pos)) {
+            writer.writeInt64(number, longAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 3: // UINT64:
+          if (isFieldPresent(message, pos)) {
+            writer.writeUInt64(number, longAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 4: // INT32:
+          if (isFieldPresent(message, pos)) {
+            writer.writeInt32(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 5: // FIXED64:
+          if (isFieldPresent(message, pos)) {
+            writer.writeFixed64(number, longAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 6: // FIXED32:
+          if (isFieldPresent(message, pos)) {
+            writer.writeFixed32(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 7: // BOOL:
+          if (isFieldPresent(message, pos)) {
+            writer.writeBool(number, booleanAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 8: // STRING:
+          if (isFieldPresent(message, pos)) {
+            writeString(number, UnsafeUtil.getObject(message, offset(typeAndOffset)), writer);
+          }
+          break;
+        case 9: // MESSAGE:
+          if (isFieldPresent(message, pos)) {
+            Object value = UnsafeUtil.getObject(message, offset(typeAndOffset));
+            writer.writeMessage(number, value, getMessageFieldSchema(pos));
+          }
+          break;
+        case 10: // BYTES:
+          if (isFieldPresent(message, pos)) {
+            writer.writeBytes(
+                number, (ByteString) UnsafeUtil.getObject(message, offset(typeAndOffset)));
+          }
+          break;
+        case 11: // UINT32:
+          if (isFieldPresent(message, pos)) {
+            writer.writeUInt32(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 12: // ENUM:
+          if (isFieldPresent(message, pos)) {
+            writer.writeEnum(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 13: // SFIXED32:
+          if (isFieldPresent(message, pos)) {
+            writer.writeSFixed32(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 14: // SFIXED64:
+          if (isFieldPresent(message, pos)) {
+            writer.writeSFixed64(number, longAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 15: // SINT32:
+          if (isFieldPresent(message, pos)) {
+            writer.writeSInt32(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 16: // SINT64:
+          if (isFieldPresent(message, pos)) {
+            writer.writeSInt64(number, longAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 17: // GROUP:
+          if (isFieldPresent(message, pos)) {
+            writer.writeGroup(
+                number,
+                UnsafeUtil.getObject(message, offset(typeAndOffset)),
+                getMessageFieldSchema(pos));
+          }
+          break;
+        case 18: // DOUBLE_LIST:
+          SchemaUtil.writeDoubleList(
+              numberAt(pos),
+              (List<Double>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 19: // FLOAT_LIST:
+          SchemaUtil.writeFloatList(
+              numberAt(pos),
+              (List<Float>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 20: // INT64_LIST:
+          SchemaUtil.writeInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 21: // UINT64_LIST:
+          SchemaUtil.writeUInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 22: // INT32_LIST:
+          SchemaUtil.writeInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 23: // FIXED64_LIST:
+          SchemaUtil.writeFixed64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 24: // FIXED32_LIST:
+          SchemaUtil.writeFixed32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 25: // BOOL_LIST:
+          SchemaUtil.writeBoolList(
+              numberAt(pos),
+              (List<Boolean>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 26: // STRING_LIST:
+          SchemaUtil.writeStringList(
+              numberAt(pos),
+              (List<String>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer);
+          break;
+        case 27: // MESSAGE_LIST:
+          SchemaUtil.writeMessageList(
+              numberAt(pos),
+              (List<?>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              getMessageFieldSchema(pos));
+          break;
+        case 28: // BYTES_LIST:
+          SchemaUtil.writeBytesList(
+              numberAt(pos),
+              (List<ByteString>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer);
+          break;
+        case 29: // UINT32_LIST:
+          SchemaUtil.writeUInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 30: // ENUM_LIST:
+          SchemaUtil.writeEnumList(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 31: // SFIXED32_LIST:
+          SchemaUtil.writeSFixed32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 32: // SFIXED64_LIST:
+          SchemaUtil.writeSFixed64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 33: // SINT32_LIST:
+          SchemaUtil.writeSInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 34: // SINT64_LIST:
+          SchemaUtil.writeSInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 35: // DOUBLE_LIST_PACKED:
+          // TODO(xiaofeng): Make use of cached field size to speed up serialization.
+          SchemaUtil.writeDoubleList(
+              numberAt(pos),
+              (List<Double>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 36: // FLOAT_LIST_PACKED:
+          SchemaUtil.writeFloatList(
+              numberAt(pos),
+              (List<Float>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 37: // INT64_LIST_PACKED:
+          SchemaUtil.writeInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 38: // UINT64_LIST_PACKED:
+          SchemaUtil.writeUInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 39: // INT32_LIST_PACKED:
+          SchemaUtil.writeInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 40: // FIXED64_LIST_PACKED:
+          SchemaUtil.writeFixed64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 41: // FIXED32_LIST_PACKED:
+          SchemaUtil.writeFixed32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+
+          break;
+        case 42: // BOOL_LIST_PACKED:
+          SchemaUtil.writeBoolList(
+              numberAt(pos),
+              (List<Boolean>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 43: // UINT32_LIST_PACKED:
+          SchemaUtil.writeUInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 44: // ENUM_LIST_PACKED:
+          SchemaUtil.writeEnumList(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 45: // SFIXED32_LIST_PACKED:
+          SchemaUtil.writeSFixed32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 46: // SFIXED64_LIST_PACKED:
+          SchemaUtil.writeSFixed64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 47: // SINT32_LIST_PACKED:
+          SchemaUtil.writeSInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 48: // SINT64_LIST_PACKED:
+          SchemaUtil.writeSInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 49: // GROUP_LIST:
+          SchemaUtil.writeGroupList(
+              numberAt(pos),
+              (List<?>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              getMessageFieldSchema(pos));
+          break;
+        case 50: // MAP:
+          // TODO(dweis): Use schema cache.
+          writeMapHelper(writer, number, UnsafeUtil.getObject(message, offset(typeAndOffset)), pos);
+          break;
+        case 51: // ONEOF_DOUBLE:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeDouble(number, oneofDoubleAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 52: // ONEOF_FLOAT:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeFloat(number, oneofFloatAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 53: // ONEOF_INT64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeInt64(number, oneofLongAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 54: // ONEOF_UINT64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeUInt64(number, oneofLongAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 55: // ONEOF_INT32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeInt32(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 56: // ONEOF_FIXED64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeFixed64(number, oneofLongAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 57: // ONEOF_FIXED32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeFixed32(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 58: // ONEOF_BOOL:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeBool(number, oneofBooleanAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 59: // ONEOF_STRING:
+          if (isOneofPresent(message, number, pos)) {
+            writeString(number, UnsafeUtil.getObject(message, offset(typeAndOffset)), writer);
+          }
+          break;
+        case 60: // ONEOF_MESSAGE:
+          if (isOneofPresent(message, number, pos)) {
+            Object value = UnsafeUtil.getObject(message, offset(typeAndOffset));
+            writer.writeMessage(number, value, getMessageFieldSchema(pos));
+          }
+          break;
+        case 61: // ONEOF_BYTES:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeBytes(
+                number, (ByteString) UnsafeUtil.getObject(message, offset(typeAndOffset)));
+          }
+          break;
+        case 62: // ONEOF_UINT32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeUInt32(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 63: // ONEOF_ENUM:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeEnum(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 64: // ONEOF_SFIXED32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSFixed32(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 65: // ONEOF_SFIXED64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSFixed64(number, oneofLongAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 66: // ONEOF_SINT32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSInt32(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 67: // ONEOF_SINT64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSInt64(number, oneofLongAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 68: // ONEOF_GROUP:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeGroup(
+                number,
+                UnsafeUtil.getObject(message, offset(typeAndOffset)),
+                getMessageFieldSchema(pos));
+          }
+          break;
+        default:
+          // Assume it's an empty entry - just go to the next entry.
+          break;
+      }
+    }
+    while (nextExtension != null) {
+      extensionSchema.serializeExtension(writer, nextExtension);
+      nextExtension = extensionIterator.hasNext() ? extensionIterator.next() : null;
+    }
+    writeUnknownInMessageTo(unknownFieldSchema, message, writer);
+  }
+
+  @SuppressWarnings("unchecked")
+  private void writeFieldsInDescendingOrder(T message, Writer writer) throws IOException {
+    writeUnknownInMessageTo(unknownFieldSchema, message, writer);
+
+    Iterator<? extends Map.Entry<?, ?>> extensionIterator = null;
+    Map.Entry nextExtension = null;
+    if (hasExtensions) {
+      FieldSet<?> extensions = extensionSchema.getExtensions(message);
+      if (!extensions.isEmpty()) {
+        extensionIterator = extensions.descendingIterator();
+        nextExtension = extensionIterator.next();
+      }
+    }
+
+    for (int pos = buffer.length - INTS_PER_FIELD; pos >= 0; pos -= INTS_PER_FIELD) {
+      final int typeAndOffset = typeAndOffsetAt(pos);
+      final int number = numberAt(pos);
+
+      // Write any extensions that need to be written before the current field.
+      while (nextExtension != null && extensionSchema.extensionNumber(nextExtension) > number) {
+        extensionSchema.serializeExtension(writer, nextExtension);
+        nextExtension = extensionIterator.hasNext() ? extensionIterator.next() : null;
+      }
+
+      switch (type(typeAndOffset)) {
+        case 0: // DOUBLE:
+          if (isFieldPresent(message, pos)) {
+            writer.writeDouble(number, doubleAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 1: // FLOAT:
+          if (isFieldPresent(message, pos)) {
+            writer.writeFloat(number, floatAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 2: // INT64:
+          if (isFieldPresent(message, pos)) {
+            writer.writeInt64(number, longAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 3: // UINT64:
+          if (isFieldPresent(message, pos)) {
+            writer.writeUInt64(number, longAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 4: // INT32:
+          if (isFieldPresent(message, pos)) {
+            writer.writeInt32(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 5: // FIXED64:
+          if (isFieldPresent(message, pos)) {
+            writer.writeFixed64(number, longAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 6: // FIXED32:
+          if (isFieldPresent(message, pos)) {
+            writer.writeFixed32(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 7: // BOOL:
+          if (isFieldPresent(message, pos)) {
+            writer.writeBool(number, booleanAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 8: // STRING:
+          if (isFieldPresent(message, pos)) {
+            writeString(number, UnsafeUtil.getObject(message, offset(typeAndOffset)), writer);
+          }
+          break;
+        case 9: // MESSAGE:
+          if (isFieldPresent(message, pos)) {
+            Object value = UnsafeUtil.getObject(message, offset(typeAndOffset));
+            writer.writeMessage(number, value, getMessageFieldSchema(pos));
+          }
+          break;
+        case 10: // BYTES:
+          if (isFieldPresent(message, pos)) {
+            writer.writeBytes(
+                number, (ByteString) UnsafeUtil.getObject(message, offset(typeAndOffset)));
+          }
+          break;
+        case 11: // UINT32:
+          if (isFieldPresent(message, pos)) {
+            writer.writeUInt32(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 12: // ENUM:
+          if (isFieldPresent(message, pos)) {
+            writer.writeEnum(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 13: // SFIXED32:
+          if (isFieldPresent(message, pos)) {
+            writer.writeSFixed32(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 14: // SFIXED64:
+          if (isFieldPresent(message, pos)) {
+            writer.writeSFixed64(number, longAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 15: // SINT32:
+          if (isFieldPresent(message, pos)) {
+            writer.writeSInt32(number, intAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 16: // SINT64:
+          if (isFieldPresent(message, pos)) {
+            writer.writeSInt64(number, longAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 17: // GROUP:
+          if (isFieldPresent(message, pos)) {
+            writer.writeGroup(
+                number,
+                UnsafeUtil.getObject(message, offset(typeAndOffset)),
+                getMessageFieldSchema(pos));
+          }
+          break;
+        case 18: // DOUBLE_LIST:
+          SchemaUtil.writeDoubleList(
+              numberAt(pos),
+              (List<Double>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 19: // FLOAT_LIST:
+          SchemaUtil.writeFloatList(
+              numberAt(pos),
+              (List<Float>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 20: // INT64_LIST:
+          SchemaUtil.writeInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 21: // UINT64_LIST:
+          SchemaUtil.writeUInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 22: // INT32_LIST:
+          SchemaUtil.writeInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 23: // FIXED64_LIST:
+          SchemaUtil.writeFixed64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 24: // FIXED32_LIST:
+          SchemaUtil.writeFixed32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 25: // BOOL_LIST:
+          SchemaUtil.writeBoolList(
+              numberAt(pos),
+              (List<Boolean>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 26: // STRING_LIST:
+          SchemaUtil.writeStringList(
+              numberAt(pos),
+              (List<String>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer);
+          break;
+        case 27: // MESSAGE_LIST:
+          SchemaUtil.writeMessageList(
+              numberAt(pos),
+              (List<?>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              getMessageFieldSchema(pos));
+          break;
+        case 28: // BYTES_LIST:
+          SchemaUtil.writeBytesList(
+              numberAt(pos),
+              (List<ByteString>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer);
+          break;
+        case 29: // UINT32_LIST:
+          SchemaUtil.writeUInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 30: // ENUM_LIST:
+          SchemaUtil.writeEnumList(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 31: // SFIXED32_LIST:
+          SchemaUtil.writeSFixed32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 32: // SFIXED64_LIST:
+          SchemaUtil.writeSFixed64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 33: // SINT32_LIST:
+          SchemaUtil.writeSInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 34: // SINT64_LIST:
+          SchemaUtil.writeSInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              false);
+          break;
+        case 35: // DOUBLE_LIST_PACKED:
+          SchemaUtil.writeDoubleList(
+              numberAt(pos),
+              (List<Double>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 36: // FLOAT_LIST_PACKED:
+          SchemaUtil.writeFloatList(
+              numberAt(pos),
+              (List<Float>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 37: // INT64_LIST_PACKED:
+          SchemaUtil.writeInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 38: // UINT64_LIST_PACKED:
+          SchemaUtil.writeUInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 39: // INT32_LIST_PACKED:
+          SchemaUtil.writeInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 40: // FIXED64_LIST_PACKED:
+          SchemaUtil.writeFixed64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 41: // FIXED32_LIST_PACKED:
+          SchemaUtil.writeFixed32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+
+          break;
+        case 42: // BOOL_LIST_PACKED:
+          SchemaUtil.writeBoolList(
+              numberAt(pos),
+              (List<Boolean>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 43: // UINT32_LIST_PACKED:
+          SchemaUtil.writeUInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 44: // ENUM_LIST_PACKED:
+          SchemaUtil.writeEnumList(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 45: // SFIXED32_LIST_PACKED:
+          SchemaUtil.writeSFixed32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 46: // SFIXED64_LIST_PACKED:
+          SchemaUtil.writeSFixed64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 47: // SINT32_LIST_PACKED:
+          SchemaUtil.writeSInt32List(
+              numberAt(pos),
+              (List<Integer>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 48: // SINT64_LIST_PACKED:
+          SchemaUtil.writeSInt64List(
+              numberAt(pos),
+              (List<Long>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              true);
+          break;
+        case 49: // GROUP_LIST:
+          SchemaUtil.writeGroupList(
+              numberAt(pos),
+              (List<?>) UnsafeUtil.getObject(message, offset(typeAndOffset)),
+              writer,
+              getMessageFieldSchema(pos));
+          break;
+        case 50: // MAP:
+          // TODO(dweis): Use schema cache.
+          writeMapHelper(writer, number, UnsafeUtil.getObject(message, offset(typeAndOffset)), pos);
+          break;
+        case 51: // ONEOF_DOUBLE:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeDouble(number, oneofDoubleAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 52: // ONEOF_FLOAT:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeFloat(number, oneofFloatAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 53: // ONEOF_INT64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeInt64(number, oneofLongAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 54: // ONEOF_UINT64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeUInt64(number, oneofLongAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 55: // ONEOF_INT32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeInt32(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 56: // ONEOF_FIXED64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeFixed64(number, oneofLongAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 57: // ONEOF_FIXED32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeFixed32(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 58: // ONEOF_BOOL:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeBool(number, oneofBooleanAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 59: // ONEOF_STRING:
+          if (isOneofPresent(message, number, pos)) {
+            writeString(number, UnsafeUtil.getObject(message, offset(typeAndOffset)), writer);
+          }
+          break;
+        case 60: // ONEOF_MESSAGE:
+          if (isOneofPresent(message, number, pos)) {
+            Object value = UnsafeUtil.getObject(message, offset(typeAndOffset));
+            writer.writeMessage(number, value, getMessageFieldSchema(pos));
+          }
+          break;
+        case 61: // ONEOF_BYTES:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeBytes(
+                number, (ByteString) UnsafeUtil.getObject(message, offset(typeAndOffset)));
+          }
+          break;
+        case 62: // ONEOF_UINT32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeUInt32(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 63: // ONEOF_ENUM:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeEnum(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 64: // ONEOF_SFIXED32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSFixed32(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 65: // ONEOF_SFIXED64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSFixed64(number, oneofLongAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 66: // ONEOF_SINT32:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSInt32(number, oneofIntAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 67: // ONEOF_SINT64:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeSInt64(number, oneofLongAt(message, offset(typeAndOffset)));
+          }
+          break;
+        case 68: // ONEOF_GROUP:
+          if (isOneofPresent(message, number, pos)) {
+            writer.writeGroup(
+                number,
+                UnsafeUtil.getObject(message, offset(typeAndOffset)),
+                getMessageFieldSchema(pos));
+          }
+          break;
+        default:
+          break;
+      }
+    }
+    while (nextExtension != null) {
+      extensionSchema.serializeExtension(writer, nextExtension);
+      nextExtension = extensionIterator.hasNext() ? extensionIterator.next() : null;
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private <K, V> void writeMapHelper(Writer writer, int number, Object mapField, int pos)
+      throws IOException {
+    if (mapField != null) {
+      writer.writeMap(
+          number,
+          (MapEntryLite.Metadata<K, V>) mapFieldSchema.forMapMetadata(getMapFieldDefaultEntry(pos)),
+          (Map<K, V>) mapFieldSchema.forMapData(mapField));
+    }
+  }
+
+  private <UT, UB> void writeUnknownInMessageTo(
+      UnknownFieldSchema<UT, UB> schema, T message, Writer writer) throws IOException {
+    schema.writeTo(schema.getFromMessage(message), writer);
+  }
+
+  @Override
+  public void mergeFrom(T message, Reader reader, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    if (extensionRegistry == null) {
+      throw new NullPointerException();
+    }
+    mergeFromHelper(unknownFieldSchema, extensionSchema, message, reader, extensionRegistry);
+  }
+
+  /**
+   * A helper method for wildcard capture of {@code unknownFieldSchema}. See:
+   * https://docs.oracle.com/javase/tutorial/java/generics/capture.html
+   */
+  private <UT, UB, ET extends FieldDescriptorLite<ET>> void mergeFromHelper(
+      UnknownFieldSchema<UT, UB> unknownFieldSchema,
+      ExtensionSchema<ET> extensionSchema,
+      T message,
+      Reader reader,
+      ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    UB unknownFields = null;
+    FieldSet<ET> extensions = null;
+    try {
+      while (true) {
+        final int number = reader.getFieldNumber();
+        final int pos = positionForFieldNumber(number);
+        if (pos < 0) {
+          if (number == Reader.READ_DONE) {
+            return;
+          }
+          // Check if it's an extension.
+          Object extension =
+              !hasExtensions
+                  ? null
+                  : extensionSchema.findExtensionByNumber(
+                      extensionRegistry, defaultInstance, number);
+          if (extension != null) {
+            if (extensions == null) {
+              extensions = extensionSchema.getMutableExtensions(message);
+            }
+            unknownFields =
+                extensionSchema.parseExtension(
+                    reader,
+                    extension,
+                    extensionRegistry,
+                    extensions,
+                    unknownFields,
+                    unknownFieldSchema);
+            continue;
+          }
+          if (unknownFieldSchema.shouldDiscardUnknownFields(reader)) {
+            if (reader.skipField()) {
+              continue;
+            }
+          } else {
+            if (unknownFields == null) {
+              unknownFields = unknownFieldSchema.getBuilderFromMessage(message);
+            }
+            // Unknown field.
+            if (unknownFieldSchema.mergeOneFieldFrom(unknownFields, reader)) {
+              continue;
+            }
+          }
+          // Done reading.
+          return;
+        }
+        final int typeAndOffset = typeAndOffsetAt(pos);
+
+        try {
+          switch (type(typeAndOffset)) {
+            case 0: // DOUBLE:
+              UnsafeUtil.putDouble(message, offset(typeAndOffset), reader.readDouble());
+              setFieldPresent(message, pos);
+              break;
+            case 1: // FLOAT:
+              UnsafeUtil.putFloat(message, offset(typeAndOffset), reader.readFloat());
+              setFieldPresent(message, pos);
+              break;
+            case 2: // INT64:
+              UnsafeUtil.putLong(message, offset(typeAndOffset), reader.readInt64());
+              setFieldPresent(message, pos);
+              break;
+            case 3: // UINT64:
+              UnsafeUtil.putLong(message, offset(typeAndOffset), reader.readUInt64());
+              setFieldPresent(message, pos);
+              break;
+            case 4: // INT32:
+              UnsafeUtil.putInt(message, offset(typeAndOffset), reader.readInt32());
+              setFieldPresent(message, pos);
+              break;
+            case 5: // FIXED64:
+              UnsafeUtil.putLong(message, offset(typeAndOffset), reader.readFixed64());
+              setFieldPresent(message, pos);
+              break;
+            case 6: // FIXED32:
+              UnsafeUtil.putInt(message, offset(typeAndOffset), reader.readFixed32());
+              setFieldPresent(message, pos);
+              break;
+            case 7: // BOOL:
+              UnsafeUtil.putBoolean(message, offset(typeAndOffset), reader.readBool());
+              setFieldPresent(message, pos);
+              break;
+            case 8: // STRING:
+              readString(message, typeAndOffset, reader);
+              setFieldPresent(message, pos);
+              break;
+            case 9:
+              { // MESSAGE:
+                if (isFieldPresent(message, pos)) {
+                  Object mergedResult =
+                      Internal.mergeMessage(
+                          UnsafeUtil.getObject(message, offset(typeAndOffset)),
+                          reader.readMessageBySchemaWithCheck(
+                              (Schema<T>) getMessageFieldSchema(pos), extensionRegistry));
+                  UnsafeUtil.putObject(message, offset(typeAndOffset), mergedResult);
+                } else {
+                  UnsafeUtil.putObject(
+                      message,
+                      offset(typeAndOffset),
+                      reader.readMessageBySchemaWithCheck(
+                          (Schema<T>) getMessageFieldSchema(pos), extensionRegistry));
+                  setFieldPresent(message, pos);
+                }
+                break;
+              }
+            case 10: // BYTES:
+              UnsafeUtil.putObject(message, offset(typeAndOffset), reader.readBytes());
+              setFieldPresent(message, pos);
+              break;
+            case 11: // UINT32:
+              UnsafeUtil.putInt(message, offset(typeAndOffset), reader.readUInt32());
+              setFieldPresent(message, pos);
+              break;
+            case 12: // ENUM:
+              {
+                int enumValue = reader.readEnum();
+                EnumVerifier enumVerifier = getEnumFieldVerifier(pos);
+                if (enumVerifier == null || enumVerifier.isInRange(enumValue)) {
+                  UnsafeUtil.putInt(message, offset(typeAndOffset), enumValue);
+                  setFieldPresent(message, pos);
+                } else {
+                  unknownFields =
+                      SchemaUtil.storeUnknownEnum(
+                          number, enumValue, unknownFields, unknownFieldSchema);
+                }
+                break;
+              }
+            case 13: // SFIXED32:
+              UnsafeUtil.putInt(message, offset(typeAndOffset), reader.readSFixed32());
+              setFieldPresent(message, pos);
+              break;
+            case 14: // SFIXED64:
+              UnsafeUtil.putLong(message, offset(typeAndOffset), reader.readSFixed64());
+              setFieldPresent(message, pos);
+              break;
+            case 15: // SINT32:
+              UnsafeUtil.putInt(message, offset(typeAndOffset), reader.readSInt32());
+              setFieldPresent(message, pos);
+              break;
+            case 16: // SINT64:
+              UnsafeUtil.putLong(message, offset(typeAndOffset), reader.readSInt64());
+              setFieldPresent(message, pos);
+              break;
+            case 17:
+              { // GROUP:
+                if (isFieldPresent(message, pos)) {
+                  Object mergedResult =
+                      Internal.mergeMessage(
+                          UnsafeUtil.getObject(message, offset(typeAndOffset)),
+                          reader.readGroupBySchemaWithCheck(
+                              (Schema<T>) getMessageFieldSchema(pos), extensionRegistry));
+                  UnsafeUtil.putObject(message, offset(typeAndOffset), mergedResult);
+                } else {
+                  UnsafeUtil.putObject(
+                      message,
+                      offset(typeAndOffset),
+                      reader.readGroupBySchemaWithCheck(
+                          (Schema<T>) getMessageFieldSchema(pos), extensionRegistry));
+                  setFieldPresent(message, pos);
+                }
+                break;
+              }
+            case 18: // DOUBLE_LIST:
+              reader.readDoubleList(
+                  listFieldSchema.<Double>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 19: // FLOAT_LIST:
+              reader.readFloatList(
+                  listFieldSchema.<Float>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 20: // INT64_LIST:
+              reader.readInt64List(
+                  listFieldSchema.<Long>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 21: // UINT64_LIST:
+              reader.readUInt64List(
+                  listFieldSchema.<Long>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 22: // INT32_LIST:
+              reader.readInt32List(
+                  listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 23: // FIXED64_LIST:
+              reader.readFixed64List(
+                  listFieldSchema.<Long>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 24: // FIXED32_LIST:
+              reader.readFixed32List(
+                  listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 25: // BOOL_LIST:
+              reader.readBoolList(
+                  listFieldSchema.<Boolean>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 26: // STRING_LIST:
+              readStringList(message, typeAndOffset, reader);
+              break;
+            case 27:
+              { // MESSAGE_LIST:
+                readMessageList(
+                    message,
+                    typeAndOffset,
+                    reader,
+                    (Schema<T>) getMessageFieldSchema(pos),
+                    extensionRegistry);
+                break;
+              }
+            case 28: // BYTES_LIST:
+              reader.readBytesList(
+                  listFieldSchema.<ByteString>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 29: // UINT32_LIST:
+              reader.readUInt32List(
+                  listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 30: // ENUM_LIST:
+              {
+                List<Integer> enumList =
+                    listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset));
+                reader.readEnumList(enumList);
+                unknownFields =
+                    SchemaUtil.filterUnknownEnumList(
+                        number,
+                        enumList,
+                        getEnumFieldVerifier(pos),
+                        unknownFields,
+                        unknownFieldSchema);
+                break;
+              }
+            case 31: // SFIXED32_LIST:
+              reader.readSFixed32List(
+                  listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 32: // SFIXED64_LIST:
+              reader.readSFixed64List(
+                  listFieldSchema.<Long>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 33: // SINT32_LIST:
+              reader.readSInt32List(
+                  listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 34: // SINT64_LIST:
+              reader.readSInt64List(
+                  listFieldSchema.<Long>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 35: // DOUBLE_LIST_PACKED:
+              reader.readDoubleList(
+                  listFieldSchema.<Double>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 36: // FLOAT_LIST_PACKED:
+              reader.readFloatList(
+                  listFieldSchema.<Float>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 37: // INT64_LIST_PACKED:
+              reader.readInt64List(
+                  listFieldSchema.<Long>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 38: // UINT64_LIST_PACKED:
+              reader.readUInt64List(
+                  listFieldSchema.<Long>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 39: // INT32_LIST_PACKED:
+              reader.readInt32List(
+                  listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 40: // FIXED64_LIST_PACKED:
+              reader.readFixed64List(
+                  listFieldSchema.<Long>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 41: // FIXED32_LIST_PACKED:
+              reader.readFixed32List(
+                  listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 42: // BOOL_LIST_PACKED:
+              reader.readBoolList(
+                  listFieldSchema.<Boolean>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 43: // UINT32_LIST_PACKED:
+              reader.readUInt32List(
+                  listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 44: // ENUM_LIST_PACKED:
+              {
+                List<Integer> enumList =
+                    listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset));
+                reader.readEnumList(enumList);
+                unknownFields =
+                    SchemaUtil.filterUnknownEnumList(
+                        number,
+                        enumList,
+                        getEnumFieldVerifier(pos),
+                        unknownFields,
+                        unknownFieldSchema);
+                break;
+              }
+            case 45: // SFIXED32_LIST_PACKED:
+              reader.readSFixed32List(
+                  listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 46: // SFIXED64_LIST_PACKED:
+              reader.readSFixed64List(
+                  listFieldSchema.<Long>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 47: // SINT32_LIST_PACKED:
+              reader.readSInt32List(
+                  listFieldSchema.<Integer>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 48: // SINT64_LIST_PACKED:
+              reader.readSInt64List(
+                  listFieldSchema.<Long>mutableListAt(message, offset(typeAndOffset)));
+              break;
+            case 49:
+              { // GROUP_LIST:
+                readGroupList(
+                    message,
+                    offset(typeAndOffset),
+                    reader,
+                    (Schema<T>) getMessageFieldSchema(pos),
+                    extensionRegistry);
+                break;
+              }
+            case 50: // MAP:
+              mergeMap(message, pos, getMapFieldDefaultEntry(pos), extensionRegistry, reader);
+              break;
+            case 51: // ONEOF_DOUBLE:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Double.valueOf(reader.readDouble()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 52: // ONEOF_FLOAT:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Float.valueOf(reader.readFloat()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 53: // ONEOF_INT64:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Long.valueOf(reader.readInt64()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 54: // ONEOF_UINT64:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Long.valueOf(reader.readUInt64()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 55: // ONEOF_INT32:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Integer.valueOf(reader.readInt32()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 56: // ONEOF_FIXED64:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Long.valueOf(reader.readFixed64()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 57: // ONEOF_FIXED32:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Integer.valueOf(reader.readFixed32()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 58: // ONEOF_BOOL:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Boolean.valueOf(reader.readBool()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 59: // ONEOF_STRING:
+              readString(message, typeAndOffset, reader);
+              setOneofPresent(message, number, pos);
+              break;
+            case 60: // ONEOF_MESSAGE:
+              if (isOneofPresent(message, number, pos)) {
+                Object mergedResult =
+                    Internal.mergeMessage(
+                        UnsafeUtil.getObject(message, offset(typeAndOffset)),
+                        reader.readMessageBySchemaWithCheck(
+                            getMessageFieldSchema(pos), extensionRegistry));
+                UnsafeUtil.putObject(message, offset(typeAndOffset), mergedResult);
+              } else {
+                UnsafeUtil.putObject(
+                    message,
+                    offset(typeAndOffset),
+                    reader.readMessageBySchemaWithCheck(
+                        getMessageFieldSchema(pos), extensionRegistry));
+                setFieldPresent(message, pos);
+              }
+              setOneofPresent(message, number, pos);
+              break;
+            case 61: // ONEOF_BYTES:
+              UnsafeUtil.putObject(message, offset(typeAndOffset), reader.readBytes());
+              setOneofPresent(message, number, pos);
+              break;
+            case 62: // ONEOF_UINT32:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Integer.valueOf(reader.readUInt32()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 63: // ONEOF_ENUM:
+              {
+                int enumValue = reader.readEnum();
+                EnumVerifier enumVerifier = getEnumFieldVerifier(pos);
+                if (enumVerifier == null || enumVerifier.isInRange(enumValue)) {
+                  UnsafeUtil.putObject(message, offset(typeAndOffset), enumValue);
+                  setOneofPresent(message, number, pos);
+                } else {
+                  unknownFields =
+                      SchemaUtil.storeUnknownEnum(
+                          number, enumValue, unknownFields, unknownFieldSchema);
+                }
+                break;
+              }
+            case 64: // ONEOF_SFIXED32:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Integer.valueOf(reader.readSFixed32()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 65: // ONEOF_SFIXED64:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Long.valueOf(reader.readSFixed64()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 66: // ONEOF_SINT32:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Integer.valueOf(reader.readSInt32()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 67: // ONEOF_SINT64:
+              UnsafeUtil.putObject(
+                  message, offset(typeAndOffset), Long.valueOf(reader.readSInt64()));
+              setOneofPresent(message, number, pos);
+              break;
+            case 68: // ONEOF_GROUP:
+              UnsafeUtil.putObject(
+                  message,
+                  offset(typeAndOffset),
+                  reader.readGroupBySchemaWithCheck(getMessageFieldSchema(pos), extensionRegistry));
+              setOneofPresent(message, number, pos);
+              break;
+            default:
+              // Assume we've landed on an empty entry. Treat it as an unknown field.
+              if (unknownFields == null) {
+                unknownFields = unknownFieldSchema.newBuilder();
+              }
+              if (!unknownFieldSchema.mergeOneFieldFrom(unknownFields, reader)) {
+                return;
+              }
+              break;
+          }
+        } catch (InvalidProtocolBufferException.InvalidWireTypeException e) {
+          // Treat fields with an invalid wire type as unknown fields
+          // (i.e. same as the default case).
+          if (unknownFieldSchema.shouldDiscardUnknownFields(reader)) {
+            if (!reader.skipField()) {
+              return;
+            }
+          } else {
+            if (unknownFields == null) {
+              unknownFields = unknownFieldSchema.getBuilderFromMessage(message);
+            }
+            if (!unknownFieldSchema.mergeOneFieldFrom(unknownFields, reader)) {
+              return;
+            }
+          }
+        }
+      }
+    } finally {
+      for (int i = checkInitializedCount; i < repeatedFieldOffsetStart; i++) {
+        unknownFields =
+            filterMapUnknownEnumValues(message, intArray[i], unknownFields, unknownFieldSchema);
+      }
+      if (unknownFields != null) {
+        unknownFieldSchema.setBuilderToMessage(message, unknownFields);
+      }
+    }
+  }
+
+  @SuppressWarnings("ReferenceEquality")
+  static UnknownFieldSetLite getMutableUnknownFields(Object message) {
+    UnknownFieldSetLite unknownFields = ((GeneratedMessageLite) message).unknownFields;
+    if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
+      unknownFields = UnknownFieldSetLite.newInstance();
+      ((GeneratedMessageLite) message).unknownFields = unknownFields;
+    }
+    return unknownFields;
+  }
+
+  /** Decodes a map entry key or value. Stores result in registers.object1. */
+  private int decodeMapEntryValue(
+      byte[] data,
+      int position,
+      int limit,
+      WireFormat.FieldType fieldType,
+      Class<?> messageType,
+      Registers registers)
+      throws IOException {
+    switch (fieldType) {
+      case BOOL:
+        position = decodeVarint64(data, position, registers);
+        registers.object1 = registers.long1 != 0;
+        break;
+      case BYTES:
+        position = decodeBytes(data, position, registers);
+        break;
+      case DOUBLE:
+        registers.object1 = decodeDouble(data, position);
+        position += 8;
+        break;
+      case FIXED32:
+      case SFIXED32:
+        registers.object1 = decodeFixed32(data, position);
+        position += 4;
+        break;
+      case FIXED64:
+      case SFIXED64:
+        registers.object1 = decodeFixed64(data, position);
+        position += 8;
+        break;
+      case FLOAT:
+        registers.object1 = decodeFloat(data, position);
+        position += 4;
+        break;
+      case ENUM:
+      case INT32:
+      case UINT32:
+        position = decodeVarint32(data, position, registers);
+        registers.object1 = registers.int1;
+        break;
+      case INT64:
+      case UINT64:
+        position = decodeVarint64(data, position, registers);
+        registers.object1 = registers.long1;
+        break;
+      case MESSAGE:
+        position =
+            decodeMessageField(
+                Protobuf.getInstance().schemaFor(messageType), data, position, limit, registers);
+        break;
+      case SINT32:
+        position = decodeVarint32(data, position, registers);
+        registers.object1 = CodedInputStream.decodeZigZag32(registers.int1);
+        break;
+      case SINT64:
+        position = decodeVarint64(data, position, registers);
+        registers.object1 = CodedInputStream.decodeZigZag64(registers.long1);
+        break;
+      case STRING:
+        position = decodeStringRequireUtf8(data, position, registers);
+        break;
+      default:
+        throw new RuntimeException("unsupported field type.");
+    }
+    return position;
+  }
+
+  /** Decodes a map entry. */
+  private <K, V> int decodeMapEntry(
+      byte[] data,
+      int position,
+      int limit,
+      MapEntryLite.Metadata<K, V> metadata,
+      Map<K, V> target,
+      Registers registers)
+      throws IOException {
+    position = decodeVarint32(data, position, registers);
+    final int length = registers.int1;
+    if (length < 0 || length > limit - position) {
+      throw InvalidProtocolBufferException.truncatedMessage();
+    }
+    final int end = position + length;
+    K key = metadata.defaultKey;
+    V value = metadata.defaultValue;
+    while (position < end) {
+      int tag = data[position++];
+      if (tag < 0) {
+        position = decodeVarint32(tag, data, position, registers);
+        tag = registers.int1;
+      }
+      final int fieldNumber = tag >>> 3;
+      final int wireType = tag & 0x7;
+      switch (fieldNumber) {
+        case 1:
+          if (wireType == metadata.keyType.getWireType()) {
+            position =
+                decodeMapEntryValue(data, position, limit, metadata.keyType, null, registers);
+            key = (K) registers.object1;
+            continue;
+          }
+          break;
+        case 2:
+          if (wireType == metadata.valueType.getWireType()) {
+            position =
+                decodeMapEntryValue(
+                    data,
+                    position,
+                    limit,
+                    metadata.valueType,
+                    metadata.defaultValue.getClass(),
+                    registers);
+            value = (V) registers.object1;
+            continue;
+          }
+          break;
+        default:
+          break;
+      }
+      position = skipField(tag, data, position, limit, registers);
+    }
+    if (position != end) {
+      throw InvalidProtocolBufferException.parseFailure();
+    }
+    target.put(key, value);
+    return end;
+  }
+
+  @SuppressWarnings("ReferenceEquality")
+  private int parseRepeatedField(
+      T message,
+      byte[] data,
+      int position,
+      int limit,
+      int tag,
+      int number,
+      int wireType,
+      int bufferPosition,
+      long typeAndOffset,
+      int fieldType,
+      long fieldOffset,
+      Registers registers)
+      throws IOException {
+    ProtobufList<?> list = (ProtobufList<?>) UNSAFE.getObject(message, fieldOffset);
+    if (!list.isModifiable()) {
+      final int size = list.size();
+      list =
+          list.mutableCopyWithCapacity(
+              size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2);
+      UNSAFE.putObject(message, fieldOffset, list);
+    }
+    switch (fieldType) {
+      case 18: // DOUBLE_LIST:
+      case 35: // DOUBLE_LIST_PACKED:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodePackedDoubleList(data, position, list, registers);
+        } else if (wireType == WireFormat.WIRETYPE_FIXED64) {
+          position = decodeDoubleList(tag, data, position, limit, list, registers);
+        }
+        break;
+      case 19: // FLOAT_LIST:
+      case 36: // FLOAT_LIST_PACKED:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodePackedFloatList(data, position, list, registers);
+        } else if (wireType == WireFormat.WIRETYPE_FIXED32) {
+          position = decodeFloatList(tag, data, position, limit, list, registers);
+        }
+        break;
+      case 20: // INT64_LIST:
+      case 21: // UINT64_LIST:
+      case 37: // INT64_LIST_PACKED:
+      case 38: // UINT64_LIST_PACKED:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodePackedVarint64List(data, position, list, registers);
+        } else if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeVarint64List(tag, data, position, limit, list, registers);
+        }
+        break;
+      case 22: // INT32_LIST:
+      case 29: // UINT32_LIST:
+      case 39: // INT32_LIST_PACKED:
+      case 43: // UINT32_LIST_PACKED:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodePackedVarint32List(data, position, list, registers);
+        } else if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeVarint32List(tag, data, position, limit, list, registers);
+        }
+        break;
+      case 23: // FIXED64_LIST:
+      case 32: // SFIXED64_LIST:
+      case 40: // FIXED64_LIST_PACKED:
+      case 46: // SFIXED64_LIST_PACKED:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodePackedFixed64List(data, position, list, registers);
+        } else if (wireType == WireFormat.WIRETYPE_FIXED64) {
+          position = decodeFixed64List(tag, data, position, limit, list, registers);
+        }
+        break;
+      case 24: // FIXED32_LIST:
+      case 31: // SFIXED32_LIST:
+      case 41: // FIXED32_LIST_PACKED:
+      case 45: // SFIXED32_LIST_PACKED:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodePackedFixed32List(data, position, list, registers);
+        } else if (wireType == WireFormat.WIRETYPE_FIXED32) {
+          position = decodeFixed32List(tag, data, position, limit, list, registers);
+        }
+        break;
+      case 25: // BOOL_LIST:
+      case 42: // BOOL_LIST_PACKED:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodePackedBoolList(data, position, list, registers);
+        } else if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeBoolList(tag, data, position, limit, list, registers);
+        }
+        break;
+      case 26: // STRING_LIST:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          if ((typeAndOffset & ENFORCE_UTF8_MASK) == 0) {
+            position = decodeStringList(tag, data, position, limit, list, registers);
+          } else {
+            position = decodeStringListRequireUtf8(tag, data, position, limit, list, registers);
+          }
+        }
+        break;
+      case 27: // MESSAGE_LIST:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position =
+              decodeMessageList(
+                  getMessageFieldSchema(bufferPosition),
+                  tag,
+                  data,
+                  position,
+                  limit,
+                  list,
+                  registers);
+        }
+        break;
+      case 28: // BYTES_LIST:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodeBytesList(tag, data, position, limit, list, registers);
+        }
+        break;
+      case 30: // ENUM_LIST:
+      case 44: // ENUM_LIST_PACKED:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodePackedVarint32List(data, position, list, registers);
+        } else if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeVarint32List(tag, data, position, limit, list, registers);
+        } else {
+          break;
+        }
+        UnknownFieldSetLite unknownFields = ((GeneratedMessageLite) message).unknownFields;
+        if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
+          // filterUnknownEnumList() expects the unknownFields parameter to be mutable or null.
+          // Since we don't know yet whether there exist unknown enum values, we'd better pass
+          // null to it instead of allocating a mutable instance. This is also needed to be
+          // consistent with the behavior of generated parser/builder.
+          unknownFields = null;
+        }
+        unknownFields =
+            SchemaUtil.filterUnknownEnumList(
+                number,
+                (ProtobufList<Integer>) list,
+                getEnumFieldVerifier(bufferPosition),
+                unknownFields,
+                (UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite>) unknownFieldSchema);
+        if (unknownFields != null) {
+          ((GeneratedMessageLite) message).unknownFields = unknownFields;
+        }
+        break;
+      case 33: // SINT32_LIST:
+      case 47: // SINT32_LIST_PACKED:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodePackedSInt32List(data, position, list, registers);
+        } else if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeSInt32List(tag, data, position, limit, list, registers);
+        }
+        break;
+      case 34: // SINT64_LIST:
+      case 48: // SINT64_LIST_PACKED:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodePackedSInt64List(data, position, list, registers);
+        } else if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeSInt64List(tag, data, position, limit, list, registers);
+        }
+        break;
+      case 49: // GROUP_LIST:
+        if (wireType == WireFormat.WIRETYPE_START_GROUP) {
+          position =
+              decodeGroupList(
+                  getMessageFieldSchema(bufferPosition),
+                  tag,
+                  data,
+                  position,
+                  limit,
+                  list,
+                  registers);
+        }
+        break;
+      default:
+        break;
+    }
+    return position;
+  }
+
+  private <K, V> int parseMapField(
+      T message,
+      byte[] data,
+      int position,
+      int limit,
+      int bufferPosition,
+      long fieldOffset,
+      Registers registers)
+      throws IOException {
+    final sun.misc.Unsafe unsafe = UNSAFE;
+    Object mapDefaultEntry = getMapFieldDefaultEntry(bufferPosition);
+    Object mapField = unsafe.getObject(message, fieldOffset);
+    if (mapFieldSchema.isImmutable(mapField)) {
+      Object oldMapField = mapField;
+      mapField = mapFieldSchema.newMapField(mapDefaultEntry);
+      mapFieldSchema.mergeFrom(mapField, oldMapField);
+      unsafe.putObject(message, fieldOffset, mapField);
+    }
+    return decodeMapEntry(
+        data,
+        position,
+        limit,
+        (Metadata<K, V>) mapFieldSchema.forMapMetadata(mapDefaultEntry),
+        (Map<K, V>) mapFieldSchema.forMutableMapData(mapField),
+        registers);
+  }
+
+  private int parseOneofField(
+      T message,
+      byte[] data,
+      int position,
+      int limit,
+      int tag,
+      int number,
+      int wireType,
+      int typeAndOffset,
+      int fieldType,
+      long fieldOffset,
+      int bufferPosition,
+      Registers registers)
+      throws IOException {
+    final sun.misc.Unsafe unsafe = UNSAFE;
+    final long oneofCaseOffset = buffer[bufferPosition + 2] & OFFSET_MASK;
+    switch (fieldType) {
+      case 51: // ONEOF_DOUBLE:
+        if (wireType == WireFormat.WIRETYPE_FIXED64) {
+          unsafe.putObject(message, fieldOffset, decodeDouble(data, position));
+          position += 8;
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 52: // ONEOF_FLOAT:
+        if (wireType == WireFormat.WIRETYPE_FIXED32) {
+          unsafe.putObject(message, fieldOffset, decodeFloat(data, position));
+          position += 4;
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 53: // ONEOF_INT64:
+      case 54: // ONEOF_UINT64:
+        if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeVarint64(data, position, registers);
+          unsafe.putObject(message, fieldOffset, registers.long1);
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 55: // ONEOF_INT32:
+      case 62: // ONEOF_UINT32:
+        if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeVarint32(data, position, registers);
+          unsafe.putObject(message, fieldOffset, registers.int1);
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 56: // ONEOF_FIXED64:
+      case 65: // ONEOF_SFIXED64:
+        if (wireType == WireFormat.WIRETYPE_FIXED64) {
+          unsafe.putObject(message, fieldOffset, decodeFixed64(data, position));
+          position += 8;
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 57: // ONEOF_FIXED32:
+      case 64: // ONEOF_SFIXED32:
+        if (wireType == WireFormat.WIRETYPE_FIXED32) {
+          unsafe.putObject(message, fieldOffset, decodeFixed32(data, position));
+          position += 4;
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 58: // ONEOF_BOOL:
+        if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeVarint64(data, position, registers);
+          unsafe.putObject(message, fieldOffset, registers.long1 != 0);
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 59: // ONEOF_STRING:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodeVarint32(data, position, registers);
+          final int length = registers.int1;
+          if (length == 0) {
+            unsafe.putObject(message, fieldOffset, "");
+          } else {
+            if ((typeAndOffset & ENFORCE_UTF8_MASK) != 0
+                && !Utf8.isValidUtf8(data, position, position + length)) {
+              throw InvalidProtocolBufferException.invalidUtf8();
+            }
+            final String value = new String(data, position, length, Internal.UTF_8);
+            unsafe.putObject(message, fieldOffset, value);
+            position += length;
+          }
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 60: // ONEOF_MESSAGE:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position =
+              decodeMessageField(
+                  getMessageFieldSchema(bufferPosition), data, position, limit, registers);
+          final Object oldValue =
+              unsafe.getInt(message, oneofCaseOffset) == number
+                  ? unsafe.getObject(message, fieldOffset)
+                  : null;
+          if (oldValue == null) {
+            unsafe.putObject(message, fieldOffset, registers.object1);
+          } else {
+            unsafe.putObject(
+                message, fieldOffset, Internal.mergeMessage(oldValue, registers.object1));
+          }
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 61: // ONEOF_BYTES:
+        if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          position = decodeBytes(data, position, registers);
+          unsafe.putObject(message, fieldOffset, registers.object1);
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 63: // ONEOF_ENUM:
+        if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeVarint32(data, position, registers);
+          final int enumValue = registers.int1;
+          EnumVerifier enumVerifier = getEnumFieldVerifier(bufferPosition);
+          if (enumVerifier == null || enumVerifier.isInRange(enumValue)) {
+            unsafe.putObject(message, fieldOffset, enumValue);
+            unsafe.putInt(message, oneofCaseOffset, number);
+          } else {
+            // UnknownFieldSetLite requires varint to be represented as Long.
+            getMutableUnknownFields(message).storeField(tag, (long) enumValue);
+          }
+        }
+        break;
+      case 66: // ONEOF_SINT32:
+        if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeVarint32(data, position, registers);
+          unsafe.putObject(message, fieldOffset, CodedInputStream.decodeZigZag32(registers.int1));
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 67: // ONEOF_SINT64:
+        if (wireType == WireFormat.WIRETYPE_VARINT) {
+          position = decodeVarint64(data, position, registers);
+          unsafe.putObject(message, fieldOffset, CodedInputStream.decodeZigZag64(registers.long1));
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      case 68: // ONEOF_GROUP:
+        if (wireType == WireFormat.WIRETYPE_START_GROUP) {
+          final int endTag = (tag & ~0x7) | WireFormat.WIRETYPE_END_GROUP;
+          position =
+              decodeGroupField(
+                  getMessageFieldSchema(bufferPosition), data, position, limit, endTag, registers);
+          final Object oldValue =
+              unsafe.getInt(message, oneofCaseOffset) == number
+                  ? unsafe.getObject(message, fieldOffset)
+                  : null;
+          if (oldValue == null) {
+            unsafe.putObject(message, fieldOffset, registers.object1);
+          } else {
+            unsafe.putObject(
+                message, fieldOffset, Internal.mergeMessage(oldValue, registers.object1));
+          }
+          unsafe.putInt(message, oneofCaseOffset, number);
+        }
+        break;
+      default:
+        break;
+    }
+    return position;
+  }
+
+  private Schema getMessageFieldSchema(int pos) {
+    final int index = pos / INTS_PER_FIELD * 2;
+    Schema schema = (Schema) objects[index];
+    if (schema != null) {
+      return schema;
+    }
+    schema = Protobuf.getInstance().schemaFor((Class) objects[index + 1]);
+    objects[index] = schema;
+    return schema;
+  }
+
+  private Object getMapFieldDefaultEntry(int pos) {
+    return objects[pos / INTS_PER_FIELD * 2];
+  }
+
+  private EnumVerifier getEnumFieldVerifier(int pos) {
+    return (EnumVerifier) objects[pos / INTS_PER_FIELD * 2 + 1];
+  }
+
+  /**
+   * Parses a proto2 message or group and returns the position after the message/group. If it's
+   * parsing a message (endGroup == 0), returns limit if parsing is successful; It it's parsing a
+   * group (endGroup != 0), parsing ends when a tag == endGroup is encountered and the position
+   * after that tag is returned.
+   */
+  int parseProto2Message(
+      T message, byte[] data, int position, int limit, int endGroup, Registers registers)
+      throws IOException {
+    final sun.misc.Unsafe unsafe = UNSAFE;
+    int currentPresenceFieldOffset = -1;
+    int currentPresenceField = 0;
+    int tag = 0;
+    int oldNumber = -1;
+    int pos = 0;
+    while (position < limit) {
+      tag = data[position++];
+      if (tag < 0) {
+        position = decodeVarint32(tag, data, position, registers);
+        tag = registers.int1;
+      }
+      final int number = tag >>> 3;
+      final int wireType = tag & 0x7;
+      if (number > oldNumber) {
+        pos = positionForFieldNumber(number, pos / INTS_PER_FIELD);
+      } else {
+        pos = positionForFieldNumber(number);
+      }
+      oldNumber = number;
+      if (pos == -1) {
+        // need to reset
+        pos = 0;
+      } else {
+        final int typeAndOffset = buffer[pos + 1];
+        final int fieldType = type(typeAndOffset);
+        final long fieldOffset = offset(typeAndOffset);
+        if (fieldType <= 17) {
+          // Proto2 optional fields have has-bits.
+          final int presenceMaskAndOffset = buffer[pos + 2];
+          final int presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
+          final int presenceFieldOffset = presenceMaskAndOffset & OFFSET_MASK;
+          // We cache the 32-bit has-bits integer value and only write it back when parsing a field
+          // using a different has-bits integer.
+          if (presenceFieldOffset != currentPresenceFieldOffset) {
+            if (currentPresenceFieldOffset != -1) {
+              unsafe.putInt(message, (long) currentPresenceFieldOffset, currentPresenceField);
+            }
+            currentPresenceFieldOffset = presenceFieldOffset;
+            currentPresenceField = unsafe.getInt(message, (long) presenceFieldOffset);
+          }
+          switch (fieldType) {
+            case 0: // DOUBLE
+              if (wireType == WireFormat.WIRETYPE_FIXED64) {
+                UnsafeUtil.putDouble(message, fieldOffset, decodeDouble(data, position));
+                position += 8;
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 1: // FLOAT
+              if (wireType == WireFormat.WIRETYPE_FIXED32) {
+                UnsafeUtil.putFloat(message, fieldOffset, decodeFloat(data, position));
+                position += 4;
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 2: // INT64
+            case 3: // UINT64
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint64(data, position, registers);
+                unsafe.putLong(message, fieldOffset, registers.long1);
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 4: // INT32
+            case 11: // UINT32
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint32(data, position, registers);
+                unsafe.putInt(message, fieldOffset, registers.int1);
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 5: // FIXED64
+            case 14: // SFIXED64
+              if (wireType == WireFormat.WIRETYPE_FIXED64) {
+                unsafe.putLong(message, fieldOffset, decodeFixed64(data, position));
+                position += 8;
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 6: // FIXED32
+            case 13: // SFIXED32
+              if (wireType == WireFormat.WIRETYPE_FIXED32) {
+                unsafe.putInt(message, fieldOffset, decodeFixed32(data, position));
+                position += 4;
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 7: // BOOL
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint64(data, position, registers);
+                UnsafeUtil.putBoolean(message, fieldOffset, registers.long1 != 0);
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 8: // STRING
+              if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+                if ((typeAndOffset & ENFORCE_UTF8_MASK) == 0) {
+                  position = decodeString(data, position, registers);
+                } else {
+                  position = decodeStringRequireUtf8(data, position, registers);
+                }
+                unsafe.putObject(message, fieldOffset, registers.object1);
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 9: // MESSAGE
+              if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+                position =
+                    decodeMessageField(
+                        getMessageFieldSchema(pos), data, position, limit, registers);
+                if ((currentPresenceField & presenceMask) == 0) {
+                  unsafe.putObject(message, fieldOffset, registers.object1);
+                } else {
+                  unsafe.putObject(
+                      message,
+                      fieldOffset,
+                      Internal.mergeMessage(
+                          unsafe.getObject(message, fieldOffset), registers.object1));
+                }
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 10: // BYTES
+              if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+                position = decodeBytes(data, position, registers);
+                unsafe.putObject(message, fieldOffset, registers.object1);
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 12: // ENUM
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint32(data, position, registers);
+                final int enumValue = registers.int1;
+                EnumVerifier enumVerifier = getEnumFieldVerifier(pos);
+                if (enumVerifier == null || enumVerifier.isInRange(enumValue)) {
+                  unsafe.putInt(message, fieldOffset, enumValue);
+                  currentPresenceField |= presenceMask;
+                } else {
+                  // UnknownFieldSetLite requires varint to be represented as Long.
+                  getMutableUnknownFields(message).storeField(tag, (long) enumValue);
+                }
+                continue;
+              }
+              break;
+            case 15: // SINT32
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint32(data, position, registers);
+                unsafe.putInt(
+                    message, fieldOffset, CodedInputStream.decodeZigZag32(registers.int1));
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 16: // SINT64
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint64(data, position, registers);
+                unsafe.putLong(
+                    message, fieldOffset, CodedInputStream.decodeZigZag64(registers.long1));
+
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            case 17: // GROUP
+              if (wireType == WireFormat.WIRETYPE_START_GROUP) {
+                final int endTag = (number << 3) | WireFormat.WIRETYPE_END_GROUP;
+                position =
+                    decodeGroupField(
+                        getMessageFieldSchema(pos), data, position, limit, endTag, registers);
+                if ((currentPresenceField & presenceMask) == 0) {
+                  unsafe.putObject(message, fieldOffset, registers.object1);
+                } else {
+                  unsafe.putObject(
+                      message,
+                      fieldOffset,
+                      Internal.mergeMessage(
+                          unsafe.getObject(message, fieldOffset), registers.object1));
+                }
+
+                currentPresenceField |= presenceMask;
+                continue;
+              }
+              break;
+            default:
+              break;
+          }
+        } else if (fieldType == 27) {
+          // Handle repeated message fields.
+          if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+            ProtobufList<?> list = (ProtobufList<?>) unsafe.getObject(message, fieldOffset);
+            if (!list.isModifiable()) {
+              final int size = list.size();
+              list =
+                  list.mutableCopyWithCapacity(
+                      size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2);
+              unsafe.putObject(message, fieldOffset, list);
+            }
+            position =
+                decodeMessageList(
+                    getMessageFieldSchema(pos), tag, data, position, limit, list, registers);
+            continue;
+          }
+        } else if (fieldType <= 49) {
+          // Handle all other repeated fields.
+          final int oldPosition = position;
+          position =
+              parseRepeatedField(
+                  message,
+                  data,
+                  position,
+                  limit,
+                  tag,
+                  number,
+                  wireType,
+                  pos,
+                  typeAndOffset,
+                  fieldType,
+                  fieldOffset,
+                  registers);
+          if (position != oldPosition) {
+            continue;
+          }
+        } else if (fieldType == 50) {
+          if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+            final int oldPosition = position;
+            position = parseMapField(message, data, position, limit, pos, fieldOffset, registers);
+            if (position != oldPosition) {
+              continue;
+            }
+          }
+        } else {
+          final int oldPosition = position;
+          position =
+              parseOneofField(
+                  message,
+                  data,
+                  position,
+                  limit,
+                  tag,
+                  number,
+                  wireType,
+                  typeAndOffset,
+                  fieldType,
+                  fieldOffset,
+                  pos,
+                  registers);
+          if (position != oldPosition) {
+            continue;
+          }
+        }
+      }
+      if (tag == endGroup && endGroup != 0) {
+        break;
+      }
+
+      if (hasExtensions
+          && registers.extensionRegistry != ExtensionRegistryLite.getEmptyRegistry()) {
+        position = decodeExtensionOrUnknownField(
+            tag, data, position, limit, message, defaultInstance,
+            (UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite>) unknownFieldSchema,
+            registers);
+      } else {
+        position = decodeUnknownField(
+            tag, data, position, limit, getMutableUnknownFields(message), registers);
+      }
+    }
+    if (currentPresenceFieldOffset != -1) {
+      unsafe.putInt(message, (long) currentPresenceFieldOffset, currentPresenceField);
+    }
+    UnknownFieldSetLite unknownFields = null;
+    for (int i = checkInitializedCount; i < repeatedFieldOffsetStart; i++) {
+      unknownFields =
+          filterMapUnknownEnumValues(
+              message,
+              intArray[i],
+              unknownFields,
+              (UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite>) unknownFieldSchema);
+    }
+    if (unknownFields != null) {
+      ((UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite>) unknownFieldSchema)
+          .setBuilderToMessage(message, unknownFields);
+    }
+    if (endGroup == 0) {
+      if (position != limit) {
+        throw InvalidProtocolBufferException.parseFailure();
+      }
+    } else {
+      if (position > limit || tag != endGroup) {
+        throw InvalidProtocolBufferException.parseFailure();
+      }
+    }
+    return position;
+  }
+
+  /** Parses a proto3 message and returns the limit if parsing is successful. */
+  private int parseProto3Message(
+      T message, byte[] data, int position, int limit, Registers registers) throws IOException {
+    final sun.misc.Unsafe unsafe = UNSAFE;
+    int tag = 0;
+    int oldNumber = -1;
+    int pos = 0;
+    while (position < limit) {
+      tag = data[position++];
+      if (tag < 0) {
+        position = decodeVarint32(tag, data, position, registers);
+        tag = registers.int1;
+      }
+      final int number = tag >>> 3;
+      final int wireType = tag & 0x7;
+      if (number > oldNumber) {
+        pos = positionForFieldNumber(number, pos / INTS_PER_FIELD);
+      } else {
+        pos = positionForFieldNumber(number);
+      }
+      oldNumber = number;
+      if (pos == -1) {
+        // need to reset
+        pos = 0;
+      } else {
+        final int typeAndOffset = buffer[pos + 1];
+        final int fieldType = type(typeAndOffset);
+        final long fieldOffset = offset(typeAndOffset);
+        if (fieldType <= 17) {
+          switch (fieldType) {
+            case 0: // DOUBLE:
+              if (wireType == WireFormat.WIRETYPE_FIXED64) {
+                UnsafeUtil.putDouble(message, fieldOffset, decodeDouble(data, position));
+                position += 8;
+                continue;
+              }
+              break;
+            case 1: // FLOAT:
+              if (wireType == WireFormat.WIRETYPE_FIXED32) {
+                UnsafeUtil.putFloat(message, fieldOffset, decodeFloat(data, position));
+                position += 4;
+                continue;
+              }
+              break;
+            case 2: // INT64:
+            case 3: // UINT64:
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint64(data, position, registers);
+                unsafe.putLong(message, fieldOffset, registers.long1);
+                continue;
+              }
+              break;
+            case 4: // INT32:
+            case 11: // UINT32:
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint32(data, position, registers);
+                unsafe.putInt(message, fieldOffset, registers.int1);
+                continue;
+              }
+              break;
+            case 5: // FIXED64:
+            case 14: // SFIXED64:
+              if (wireType == WireFormat.WIRETYPE_FIXED64) {
+                unsafe.putLong(message, fieldOffset, decodeFixed64(data, position));
+                position += 8;
+                continue;
+              }
+              break;
+            case 6: // FIXED32:
+            case 13: // SFIXED32:
+              if (wireType == WireFormat.WIRETYPE_FIXED32) {
+                unsafe.putInt(message, fieldOffset, decodeFixed32(data, position));
+                position += 4;
+                continue;
+              }
+              break;
+            case 7: // BOOL:
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint64(data, position, registers);
+                UnsafeUtil.putBoolean(message, fieldOffset, registers.long1 != 0);
+                continue;
+              }
+              break;
+            case 8: // STRING:
+              if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+                if ((typeAndOffset & ENFORCE_UTF8_MASK) == 0) {
+                  position = decodeString(data, position, registers);
+                } else {
+                  position = decodeStringRequireUtf8(data, position, registers);
+                }
+                unsafe.putObject(message, fieldOffset, registers.object1);
+                continue;
+              }
+              break;
+            case 9: // MESSAGE:
+              if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+                position =
+                    decodeMessageField(
+                        getMessageFieldSchema(pos), data, position, limit, registers);
+                final Object oldValue = unsafe.getObject(message, fieldOffset);
+                if (oldValue == null) {
+                  unsafe.putObject(message, fieldOffset, registers.object1);
+                } else {
+                  unsafe.putObject(
+                      message, fieldOffset, Internal.mergeMessage(oldValue, registers.object1));
+                }
+                continue;
+              }
+              break;
+            case 10: // BYTES:
+              if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+                position = decodeBytes(data, position, registers);
+                unsafe.putObject(message, fieldOffset, registers.object1);
+                continue;
+              }
+              break;
+            case 12: // ENUM:
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint32(data, position, registers);
+                unsafe.putInt(message, fieldOffset, registers.int1);
+                continue;
+              }
+              break;
+            case 15: // SINT32:
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint32(data, position, registers);
+                unsafe.putInt(
+                    message, fieldOffset, CodedInputStream.decodeZigZag32(registers.int1));
+                continue;
+              }
+              break;
+            case 16: // SINT64:
+              if (wireType == WireFormat.WIRETYPE_VARINT) {
+                position = decodeVarint64(data, position, registers);
+                unsafe.putLong(
+                    message, fieldOffset, CodedInputStream.decodeZigZag64(registers.long1));
+                continue;
+              }
+              break;
+            default:
+              break;
+          }
+        } else if (fieldType == 27) {
+          // Handle repeated message field.
+          if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+            ProtobufList<?> list = (ProtobufList<?>) unsafe.getObject(message, fieldOffset);
+            if (!list.isModifiable()) {
+              final int size = list.size();
+              list =
+                  list.mutableCopyWithCapacity(
+                      size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2);
+              unsafe.putObject(message, fieldOffset, list);
+            }
+            position =
+                decodeMessageList(
+                    getMessageFieldSchema(pos), tag, data, position, limit, list, registers);
+            continue;
+          }
+        } else if (fieldType <= 49) {
+          // Handle all other repeated fields.
+          final int oldPosition = position;
+          position =
+              parseRepeatedField(
+                  message,
+                  data,
+                  position,
+                  limit,
+                  tag,
+                  number,
+                  wireType,
+                  pos,
+                  typeAndOffset,
+                  fieldType,
+                  fieldOffset,
+                  registers);
+          if (position != oldPosition) {
+            continue;
+          }
+        } else if (fieldType == 50) {
+          if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+            final int oldPosition = position;
+            position = parseMapField(message, data, position, limit, pos, fieldOffset, registers);
+            if (position != oldPosition) {
+              continue;
+            }
+          }
+        } else {
+          final int oldPosition = position;
+          position =
+              parseOneofField(
+                  message,
+                  data,
+                  position,
+                  limit,
+                  tag,
+                  number,
+                  wireType,
+                  typeAndOffset,
+                  fieldType,
+                  fieldOffset,
+                  pos,
+                  registers);
+          if (position != oldPosition) {
+            continue;
+          }
+        }
+      }
+      position = decodeUnknownField(
+          tag, data, position, limit, getMutableUnknownFields(message), registers);
+    }
+    if (position != limit) {
+      throw InvalidProtocolBufferException.parseFailure();
+    }
+    return position;
+  }
+
+  @Override
+  public void mergeFrom(T message, byte[] data, int position, int limit, Registers registers)
+      throws IOException {
+    if (proto3) {
+      parseProto3Message(message, data, position, limit, registers);
+    } else {
+      parseProto2Message(message, data, position, limit, 0, registers);
+    }
+  }
+
+  @Override
+  public void makeImmutable(T message) {
+    // Make all repeated/map fields immutable.
+    for (int i = checkInitializedCount; i < repeatedFieldOffsetStart; i++) {
+      long offset = offset(typeAndOffsetAt(intArray[i]));
+      Object mapField = UnsafeUtil.getObject(message, offset);
+      if (mapField == null) {
+        continue;
+      }
+      UnsafeUtil.putObject(message, offset, mapFieldSchema.toImmutable(mapField));
+    }
+    final int length = intArray.length;
+    for (int i = repeatedFieldOffsetStart; i < length; i++) {
+      listFieldSchema.makeImmutableListAt(message, intArray[i]);
+    }
+    unknownFieldSchema.makeImmutable(message);
+    if (hasExtensions) {
+      extensionSchema.makeImmutable(message);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  private final <K, V> void mergeMap(
+      Object message,
+      int pos,
+      Object mapDefaultEntry,
+      ExtensionRegistryLite extensionRegistry,
+      Reader reader)
+      throws IOException {
+    long offset = offset(typeAndOffsetAt(pos));
+    Object mapField = UnsafeUtil.getObject(message, offset);
+    // TODO(xiaofeng): Consider creating separate implementations for full and lite. In lite
+    // runtime map field will never be null but here we still need to check null because the
+    // code is shared by both full and lite. It might be better if full/lite uses different
+    // schema implementations.
+    if (mapField == null) {
+      mapField = mapFieldSchema.newMapField(mapDefaultEntry);
+      UnsafeUtil.putObject(message, offset, mapField);
+    } else if (mapFieldSchema.isImmutable(mapField)) {
+      Object oldMapField = mapField;
+      mapField = mapFieldSchema.newMapField(mapDefaultEntry);
+      mapFieldSchema.mergeFrom(mapField, oldMapField);
+      UnsafeUtil.putObject(message, offset, mapField);
+    }
+    reader.readMap(
+        (Map<K, V>) mapFieldSchema.forMutableMapData(mapField),
+        (Metadata<K, V>) mapFieldSchema.forMapMetadata(mapDefaultEntry),
+        extensionRegistry);
+  }
+
+  private final <UT, UB> UB filterMapUnknownEnumValues(
+      Object message, int pos, UB unknownFields, UnknownFieldSchema<UT, UB> unknownFieldSchema) {
+    int fieldNumber = numberAt(pos);
+    long offset = offset(typeAndOffsetAt(pos));
+    Object mapField = UnsafeUtil.getObject(message, offset);
+    if (mapField == null) {
+      return unknownFields;
+    }
+    EnumVerifier enumVerifier = getEnumFieldVerifier(pos);
+    if (enumVerifier == null) {
+      return unknownFields;
+    }
+    Map<?, ?> mapData = mapFieldSchema.forMutableMapData(mapField);
+    // Filter unknown enum values.
+    unknownFields =
+        filterUnknownEnumMap(
+            pos, fieldNumber, mapData, enumVerifier, unknownFields, unknownFieldSchema);
+    return unknownFields;
+  }
+
+  @SuppressWarnings("unchecked")
+  private final <K, V, UT, UB> UB filterUnknownEnumMap(
+      int pos,
+      int number,
+      Map<K, V> mapData,
+      EnumVerifier enumVerifier,
+      UB unknownFields,
+      UnknownFieldSchema<UT, UB> unknownFieldSchema) {
+    Metadata<K, V> metadata =
+        (Metadata<K, V>) mapFieldSchema.forMapMetadata(getMapFieldDefaultEntry(pos));
+    for (Iterator<Map.Entry<K, V>> it = mapData.entrySet().iterator(); it.hasNext(); ) {
+      Map.Entry<K, V> entry = it.next();
+      if (!enumVerifier.isInRange((Integer) entry.getValue())) {
+        if (unknownFields == null) {
+          unknownFields = unknownFieldSchema.newBuilder();
+        }
+        int entrySize =
+            MapEntryLite.computeSerializedSize(metadata, entry.getKey(), entry.getValue());
+        CodedBuilder codedBuilder = ByteString.newCodedBuilder(entrySize);
+        CodedOutputStream codedOutput = codedBuilder.getCodedOutput();
+        try {
+          MapEntryLite.writeTo(codedOutput, metadata, entry.getKey(), entry.getValue());
+        } catch (IOException e) {
+          // Writing to ByteString CodedOutputStream should not throw IOException.
+          throw new RuntimeException(e);
+        }
+        unknownFieldSchema.addLengthDelimited(unknownFields, number, codedBuilder.build());
+        it.remove();
+      }
+    }
+    return unknownFields;
+  }
+
+  @Override
+  public final boolean isInitialized(T message) {
+    int currentPresenceFieldOffset = -1;
+    int currentPresenceField = 0;
+    for (int i = 0; i < checkInitializedCount; i++) {
+      final int pos = intArray[i];
+      final int number = numberAt(pos);
+
+      final int typeAndOffset = typeAndOffsetAt(pos);
+
+      int presenceMaskAndOffset = 0;
+      int presenceMask = 0;
+      if (!proto3) {
+        presenceMaskAndOffset = buffer[pos + 2];
+        final int presenceFieldOffset = presenceMaskAndOffset & OFFSET_MASK;
+        presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
+        if (presenceFieldOffset != currentPresenceFieldOffset) {
+          currentPresenceFieldOffset = presenceFieldOffset;
+          currentPresenceField = UNSAFE.getInt(message, (long) presenceFieldOffset);
+        }
+      }
+
+      if (isRequired(typeAndOffset)) {
+        if (!isFieldPresent(message, pos, currentPresenceField, presenceMask)) {
+          return false;
+        }
+        // If a required message field is set but has no required fields of it's own, we still
+        // proceed and check the message is initialized. It should be fairly cheap to check these
+        // messages but is worth documenting.
+      }
+      // Check nested message and groups.
+      switch (type(typeAndOffset)) {
+        case 9: // MESSAGE
+        case 17: // GROUP
+          if (isFieldPresent(message, pos, currentPresenceField, presenceMask)
+              && !isInitialized(message, typeAndOffset, getMessageFieldSchema(pos))) {
+            return false;
+          }
+          break;
+        case 27: // MESSAGE_LIST
+        case 49: // GROUP_LIST
+          if (!isListInitialized(message, typeAndOffset, pos)) {
+            return false;
+          }
+          break;
+        case 60: // ONEOF_MESSAGE
+        case 68: // ONEOF_GROUP
+          if (isOneofPresent(message, number, pos)
+              && !isInitialized(message, typeAndOffset, getMessageFieldSchema(pos))) {
+            return false;
+          }
+          break;
+        case 50: // MAP
+          if (!isMapInitialized(message, typeAndOffset, pos)) {
+            return false;
+          }
+          break;
+        default:
+          break;
+      }
+    }
+
+    if (hasExtensions) {
+      if (!extensionSchema.getExtensions(message).isInitialized()) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  private static boolean isInitialized(Object message, int typeAndOffset, Schema schema) {
+    Object nested = UnsafeUtil.getObject(message, offset(typeAndOffset));
+    return schema.isInitialized(nested);
+  }
+
+  private <N> boolean isListInitialized(Object message, int typeAndOffset, int pos) {
+    @SuppressWarnings("unchecked")
+    List<N> list = (List<N>) UnsafeUtil.getObject(message, offset(typeAndOffset));
+    if (list.isEmpty()) {
+      return true;
+    }
+
+    Schema schema = getMessageFieldSchema(pos);
+    for (int i = 0; i < list.size(); i++) {
+      N nested = list.get(i);
+      if (!schema.isInitialized(nested)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private boolean isMapInitialized(T message, int typeAndOffset, int pos) {
+    Map<?, ?> map = mapFieldSchema.forMapData(UnsafeUtil.getObject(message, offset(typeAndOffset)));
+    if (map.isEmpty()) {
+      return true;
+    }
+    Object mapDefaultEntry = getMapFieldDefaultEntry(pos);
+    MapEntryLite.Metadata<?, ?> metadata = mapFieldSchema.forMapMetadata(mapDefaultEntry);
+    if (metadata.valueType.getJavaType() != WireFormat.JavaType.MESSAGE) {
+      return true;
+    }
+    // TODO(dweis): Use schema cache.
+    Schema schema = null;
+    for (Object nested : map.values()) {
+      if (schema == null) {
+        schema = Protobuf.getInstance().schemaFor(nested.getClass());
+      }
+      if (!schema.isInitialized(nested)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  private void writeString(int fieldNumber, Object value, Writer writer) throws IOException {
+    if (value instanceof String) {
+      writer.writeString(fieldNumber, (String) value);
+    } else {
+      writer.writeBytes(fieldNumber, (ByteString) value);
+    }
+  }
+
+  private void readString(Object message, int typeAndOffset, Reader reader) throws IOException {
+    if (isEnforceUtf8(typeAndOffset)) {
+      // Enforce valid UTF-8 on the read.
+      UnsafeUtil.putObject(message, offset(typeAndOffset), reader.readStringRequireUtf8());
+    } else if (lite) {
+      // Lite messages use String fields to store strings. Read a string but do not
+      // enforce UTF-8
+      UnsafeUtil.putObject(message, offset(typeAndOffset), reader.readString());
+    } else {
+      // Full runtime messages use Objects to store either a String or ByteString. Read
+      // the string as a ByteString and do not enforce UTF-8.
+      UnsafeUtil.putObject(message, offset(typeAndOffset), reader.readBytes());
+    }
+  }
+
+  private void readStringList(Object message, int typeAndOffset, Reader reader) throws IOException {
+    if (isEnforceUtf8(typeAndOffset)) {
+      reader.readStringListRequireUtf8(
+          listFieldSchema.<String>mutableListAt(message, offset(typeAndOffset)));
+    } else {
+      reader.readStringList(listFieldSchema.<String>mutableListAt(message, offset(typeAndOffset)));
+    }
+  }
+
+  private <E> void readMessageList(
+      Object message,
+      int typeAndOffset,
+      Reader reader,
+      Schema<E> schema,
+      ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    long offset = offset(typeAndOffset);
+    reader.readMessageList(
+        listFieldSchema.<E>mutableListAt(message, offset), schema, extensionRegistry);
+  }
+
+  private <E> void readGroupList(
+      Object message,
+      long offset,
+      Reader reader,
+      Schema<E> schema,
+      ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    reader.readGroupList(
+        listFieldSchema.<E>mutableListAt(message, offset), schema, extensionRegistry);
+  }
+
+  private int numberAt(int pos) {
+    return buffer[pos];
+  }
+
+  private int typeAndOffsetAt(int pos) {
+    return buffer[pos + 1];
+  }
+
+  private int presenceMaskAndOffsetAt(int pos) {
+    return buffer[pos + 2];
+  }
+
+  private static int type(int value) {
+    return (value & FIELD_TYPE_MASK) >>> OFFSET_BITS;
+  }
+
+  private static boolean isRequired(int value) {
+    return (value & REQUIRED_MASK) != 0;
+  }
+
+  private static boolean isEnforceUtf8(int value) {
+    return (value & ENFORCE_UTF8_MASK) != 0;
+  }
+
+  private static long offset(int value) {
+    return value & OFFSET_MASK;
+  }
+
+  private static <T> double doubleAt(T message, long offset) {
+    return UnsafeUtil.getDouble(message, offset);
+  }
+
+  private static <T> float floatAt(T message, long offset) {
+    return UnsafeUtil.getFloat(message, offset);
+  }
+
+  private static <T> int intAt(T message, long offset) {
+    return UnsafeUtil.getInt(message, offset);
+  }
+
+  private static <T> long longAt(T message, long offset) {
+    return UnsafeUtil.getLong(message, offset);
+  }
+
+  private static <T> boolean booleanAt(T message, long offset) {
+    return UnsafeUtil.getBoolean(message, offset);
+  }
+
+  private static <T> double oneofDoubleAt(T message, long offset) {
+    return ((Double) UnsafeUtil.getObject(message, offset)).doubleValue();
+  }
+
+  private static <T> float oneofFloatAt(T message, long offset) {
+    return ((Float) UnsafeUtil.getObject(message, offset)).floatValue();
+  }
+
+  private static <T> int oneofIntAt(T message, long offset) {
+    return ((Integer) UnsafeUtil.getObject(message, offset)).intValue();
+  }
+
+  private static <T> long oneofLongAt(T message, long offset) {
+    return ((Long) UnsafeUtil.getObject(message, offset)).longValue();
+  }
+
+  private static <T> boolean oneofBooleanAt(T message, long offset) {
+    return ((Boolean) UnsafeUtil.getObject(message, offset)).booleanValue();
+  }
+
+  /** Returns true the field is present in both messages, or neither. */
+  private boolean arePresentForEquals(T message, T other, int pos) {
+    return isFieldPresent(message, pos) == isFieldPresent(other, pos);
+  }
+
+  private boolean isFieldPresent(T message, int pos, int presenceField, int presenceMask) {
+    if (proto3) {
+      return isFieldPresent(message, pos);
+    } else {
+      return (presenceField & presenceMask) != 0;
+    }
+  }
+
+  private boolean isFieldPresent(T message, int pos) {
+    if (proto3) {
+      final int typeAndOffset = typeAndOffsetAt(pos);
+      final long offset = offset(typeAndOffset);
+      switch (type(typeAndOffset)) {
+        case 0: // DOUBLE:
+          return UnsafeUtil.getDouble(message, offset) != 0D;
+        case 1: // FLOAT:
+          return UnsafeUtil.getFloat(message, offset) != 0F;
+        case 2: // INT64:
+          return UnsafeUtil.getLong(message, offset) != 0L;
+        case 3: // UINT64:
+          return UnsafeUtil.getLong(message, offset) != 0L;
+        case 4: // INT32:
+          return UnsafeUtil.getInt(message, offset) != 0;
+        case 5: // FIXED64:
+          return UnsafeUtil.getLong(message, offset) != 0L;
+        case 6: // FIXED32:
+          return UnsafeUtil.getInt(message, offset) != 0;
+        case 7: // BOOL:
+          return UnsafeUtil.getBoolean(message, offset);
+        case 8: // STRING:
+          Object value = UnsafeUtil.getObject(message, offset);
+          if (value instanceof String) {
+            return !((String) value).isEmpty();
+          } else if (value instanceof ByteString) {
+            return !ByteString.EMPTY.equals(value);
+          } else {
+            throw new IllegalArgumentException();
+          }
+        case 9: // MESSAGE:
+          return UnsafeUtil.getObject(message, offset) != null;
+        case 10: // BYTES:
+          return !ByteString.EMPTY.equals(UnsafeUtil.getObject(message, offset));
+        case 11: // UINT32:
+          return UnsafeUtil.getInt(message, offset) != 0;
+        case 12: // ENUM:
+          return UnsafeUtil.getInt(message, offset) != 0;
+        case 13: // SFIXED32:
+          return UnsafeUtil.getInt(message, offset) != 0;
+        case 14: // SFIXED64:
+          return UnsafeUtil.getLong(message, offset) != 0L;
+        case 15: // SINT32:
+          return UnsafeUtil.getInt(message, offset) != 0;
+        case 16: // SINT64:
+          return UnsafeUtil.getLong(message, offset) != 0L;
+        case 17: // GROUP:
+          return UnsafeUtil.getObject(message, offset) != null;
+        default:
+          throw new IllegalArgumentException();
+      }
+    } else {
+      int presenceMaskAndOffset = presenceMaskAndOffsetAt(pos);
+      final int presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
+      return (UnsafeUtil.getInt(message, presenceMaskAndOffset & OFFSET_MASK) & presenceMask) != 0;
+    }
+  }
+
+  private void setFieldPresent(T message, int pos) {
+    if (proto3) {
+      // Proto3 doesn't have presence fields
+      return;
+    }
+    int presenceMaskAndOffset = presenceMaskAndOffsetAt(pos);
+    final int presenceMask = 1 << (presenceMaskAndOffset >>> OFFSET_BITS);
+    final long presenceFieldOffset = presenceMaskAndOffset & OFFSET_MASK;
+    UnsafeUtil.putInt(
+        message,
+        presenceFieldOffset,
+        UnsafeUtil.getInt(message, presenceFieldOffset) | presenceMask);
+  }
+
+  private boolean isOneofPresent(T message, int fieldNumber, int pos) {
+    int presenceMaskAndOffset = presenceMaskAndOffsetAt(pos);
+    return UnsafeUtil.getInt(message, presenceMaskAndOffset & OFFSET_MASK) == fieldNumber;
+  }
+
+  private boolean isOneofCaseEqual(T message, T other, int pos) {
+    int presenceMaskAndOffset = presenceMaskAndOffsetAt(pos);
+    return UnsafeUtil.getInt(message, presenceMaskAndOffset & OFFSET_MASK)
+        == UnsafeUtil.getInt(other, presenceMaskAndOffset & OFFSET_MASK);
+  }
+
+  private void setOneofPresent(T message, int fieldNumber, int pos) {
+    int presenceMaskAndOffset = presenceMaskAndOffsetAt(pos);
+    UnsafeUtil.putInt(message, presenceMaskAndOffset & OFFSET_MASK, fieldNumber);
+  }
+
+  private int positionForFieldNumber(final int number) {
+    if (number >= minFieldNumber && number <= maxFieldNumber) {
+      return slowPositionForFieldNumber(number, 0);
+    }
+    return -1;
+  }
+
+  private int positionForFieldNumber(final int number, final int min) {
+    if (number >= minFieldNumber && number <= maxFieldNumber) {
+      return slowPositionForFieldNumber(number, min);
+    }
+    return -1;
+  }
+
+  private int slowPositionForFieldNumber(final int number, int min) {
+    int max = buffer.length / INTS_PER_FIELD - 1;
+    while (min <= max) {
+      // Find the midpoint address.
+      final int mid = (max + min) >>> 1;
+      final int pos = mid * INTS_PER_FIELD;
+      final int midFieldNumber = numberAt(pos);
+      if (number == midFieldNumber) {
+        // Found the field.
+        return pos;
+      }
+      if (number < midFieldNumber) {
+        // Search the lower half.
+        max = mid - 1;
+      } else {
+        // Search the upper half.
+        min = mid + 1;
+      }
+    }
+    return -1;
+  }
+
+  int getSchemaSize() {
+    return buffer.length * 3;
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/MessageSetSchema.java b/java/core/src/main/java/com/google/protobuf/MessageSetSchema.java
new file mode 100755
index 0000000..187dc8b
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/MessageSetSchema.java
@@ -0,0 +1,392 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map.Entry;
+
+/** Schema used for proto2 messages using message_set_wireformat. */
+final class MessageSetSchema<T> implements Schema<T> {
+  private final MessageLite defaultInstance;
+  private final UnknownFieldSchema<?, ?> unknownFieldSchema;
+  private final boolean hasExtensions;
+  private final ExtensionSchema<?> extensionSchema;
+
+  private MessageSetSchema(
+      UnknownFieldSchema<?, ?> unknownFieldSchema,
+      ExtensionSchema<?> extensionSchema,
+      MessageLite defaultInstance) {
+    this.unknownFieldSchema = unknownFieldSchema;
+    this.hasExtensions = extensionSchema.hasExtensions(defaultInstance);
+    this.extensionSchema = extensionSchema;
+    this.defaultInstance = defaultInstance;
+  }
+
+  static <T> MessageSetSchema<T> newSchema(
+      UnknownFieldSchema<?, ?> unknownFieldSchema,
+      ExtensionSchema<?> extensionSchema,
+      MessageLite defaultInstance) {
+    return new MessageSetSchema<T>(unknownFieldSchema, extensionSchema, defaultInstance);
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public T newInstance() {
+    return (T) defaultInstance.newBuilderForType().buildPartial();
+  }
+
+  @Override
+  public boolean equals(T message, T other) {
+    Object messageUnknown = unknownFieldSchema.getFromMessage(message);
+    Object otherUnknown = unknownFieldSchema.getFromMessage(other);
+    if (!messageUnknown.equals(otherUnknown)) {
+      return false;
+    }
+    if (hasExtensions) {
+      FieldSet<?> messageExtensions = extensionSchema.getExtensions(message);
+      FieldSet<?> otherExtensions = extensionSchema.getExtensions(other);
+      return messageExtensions.equals(otherExtensions);
+    }
+    return true;
+  }
+
+  @Override
+  public int hashCode(T message) {
+    int hashCode = unknownFieldSchema.getFromMessage(message).hashCode();
+    if (hasExtensions) {
+      FieldSet<?> extensions = extensionSchema.getExtensions(message);
+      hashCode = (hashCode * 53) + extensions.hashCode();
+    }
+    return hashCode;
+  }
+
+  @Override
+  public void mergeFrom(T message, T other) {
+    SchemaUtil.mergeUnknownFields(unknownFieldSchema, message, other);
+    if (hasExtensions) {
+      SchemaUtil.mergeExtensions(extensionSchema, message, other);
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public void writeTo(T message, Writer writer) throws IOException {
+    FieldSet<?> extensions = extensionSchema.getExtensions(message);
+    Iterator<?> iterator = extensions.iterator();
+    while (iterator.hasNext()) {
+      Entry<?, ?> extension = (Entry<?, ?>) iterator.next();
+      FieldSet.FieldDescriptorLite<?> fd = (FieldSet.FieldDescriptorLite<?>) extension.getKey();
+      if (fd.getLiteJavaType() != WireFormat.JavaType.MESSAGE || fd.isRepeated() || fd.isPacked()) {
+        throw new IllegalStateException("Found invalid MessageSet item.");
+      }
+      if (extension instanceof LazyField.LazyEntry) {
+        writer.writeMessageSetItem(
+            fd.getNumber(), ((LazyField.LazyEntry) extension).getField().toByteString());
+      } else {
+        writer.writeMessageSetItem(fd.getNumber(), extension.getValue());
+      }
+    }
+    writeUnknownFieldsHelper(unknownFieldSchema, message, writer);
+  }
+
+  /**
+   * A helper method for wildcard capture of {@code unknownFieldSchema}. See:
+   * https://docs.oracle.com/javase/tutorial/java/generics/capture.html
+   */
+  private <UT, UB> void writeUnknownFieldsHelper(
+      UnknownFieldSchema<UT, UB> unknownFieldSchema, T message, Writer writer) throws IOException {
+    unknownFieldSchema.writeAsMessageSetTo(unknownFieldSchema.getFromMessage(message), writer);
+  }
+
+  @SuppressWarnings("ReferenceEquality")
+  @Override
+  public void mergeFrom(
+      T message, byte[] data, int position, int limit, ArrayDecoders.Registers registers)
+      throws IOException {
+    UnknownFieldSetLite unknownFields = ((GeneratedMessageLite) message).unknownFields;
+    if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
+      unknownFields = UnknownFieldSetLite.newInstance();
+      ((GeneratedMessageLite) message).unknownFields = unknownFields;
+    }
+    final FieldSet<GeneratedMessageLite.ExtensionDescriptor> extensions =
+        ((GeneratedMessageLite.ExtendableMessage<?, ?>) message).ensureExtensionsAreMutable();
+    GeneratedMessageLite.GeneratedExtension<?, ?> extension = null;
+    while (position < limit) {
+      position = ArrayDecoders.decodeVarint32(data, position, registers);
+      final int startTag = registers.int1;
+      if (startTag != WireFormat.MESSAGE_SET_ITEM_TAG) {
+        if (WireFormat.getTagWireType(startTag) == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+          extension =
+              (GeneratedMessageLite.GeneratedExtension<?, ?>) extensionSchema.findExtensionByNumber(
+                  registers.extensionRegistry, defaultInstance,
+                  WireFormat.getTagFieldNumber(startTag));
+          if (extension != null) {
+            position =
+                ArrayDecoders.decodeMessageField(
+                    Protobuf.getInstance().schemaFor(
+                        extension.getMessageDefaultInstance().getClass()),
+                    data, position, limit, registers);
+            extensions.setField(extension.descriptor, registers.object1);
+          } else {
+            position =
+                ArrayDecoders.decodeUnknownField(
+                    startTag, data, position, limit, unknownFields, registers);
+          }
+        } else {
+          position = ArrayDecoders.skipField(startTag, data, position, limit, registers);
+        }
+        continue;
+      }
+
+      int typeId = 0;
+      ByteString rawBytes = null;
+
+      while (position < limit) {
+        position = ArrayDecoders.decodeVarint32(data, position, registers);
+        final int tag = registers.int1;
+        final int number = WireFormat.getTagFieldNumber(tag);
+        final int wireType = WireFormat.getTagWireType(tag);
+        switch (number) {
+          case WireFormat.MESSAGE_SET_TYPE_ID:
+            if (wireType == WireFormat.WIRETYPE_VARINT) {
+              position = ArrayDecoders.decodeVarint32(data, position, registers);
+              typeId = registers.int1;
+              extension =
+                  (GeneratedMessageLite.GeneratedExtension<?, ?>) extensionSchema
+                      .findExtensionByNumber(registers.extensionRegistry, defaultInstance, typeId);
+              continue;
+            }
+            break;
+          case WireFormat.MESSAGE_SET_MESSAGE:
+            if (extension != null) {
+              position = ArrayDecoders.decodeMessageField(
+                  Protobuf.getInstance().schemaFor(
+                      extension.getMessageDefaultInstance().getClass()),
+                  data, position, limit, registers);
+              extensions.setField(extension.descriptor, registers.object1);
+              continue;
+            } else {
+              if (wireType == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+                position = ArrayDecoders.decodeBytes(data, position, registers);
+                rawBytes = (ByteString) registers.object1;
+                continue;
+              }
+              break;
+            }
+          default:
+            break;
+        }
+        if (tag == WireFormat.MESSAGE_SET_ITEM_END_TAG) {
+          break;
+        }
+        position = ArrayDecoders.skipField(tag, data, position, limit, registers);
+      }
+
+      if (rawBytes != null) {
+        unknownFields.storeField(
+            WireFormat.makeTag(typeId, WireFormat.WIRETYPE_LENGTH_DELIMITED), rawBytes);
+      }
+    }
+    if (position != limit) {
+      throw InvalidProtocolBufferException.parseFailure();
+    }
+  }
+
+  @Override
+  public void mergeFrom(T message, Reader reader, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    mergeFromHelper(unknownFieldSchema, extensionSchema, message, reader, extensionRegistry);
+  }
+
+  /**
+   * A helper method for wildcard capture of {@code unknownFieldSchema}. See:
+   * https://docs.oracle.com/javase/tutorial/java/generics/capture.html
+   */
+  @SuppressWarnings("unchecked")
+  private <UT, UB, ET extends FieldSet.FieldDescriptorLite<ET>> void mergeFromHelper(
+      UnknownFieldSchema<UT, UB> unknownFieldSchema,
+      ExtensionSchema<ET> extensionSchema,
+      T message,
+      Reader reader,
+      ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    UB unknownFields = unknownFieldSchema.getBuilderFromMessage(message);
+    FieldSet<ET> extensions = extensionSchema.getMutableExtensions(message);
+    try {
+      while (true) {
+        final int number = reader.getFieldNumber();
+        if (number == Reader.READ_DONE) {
+          return;
+        }
+        if (parseMessageSetItemOrUnknownField(
+            reader,
+            extensionRegistry,
+            extensionSchema,
+            extensions,
+            unknownFieldSchema,
+            unknownFields)) {
+          continue;
+        }
+        // Done reading.
+        return;
+      }
+    } finally {
+      unknownFieldSchema.setBuilderToMessage(message, unknownFields);
+    }
+  }
+
+  @Override
+  public void makeImmutable(T message) {
+    unknownFieldSchema.makeImmutable(message);
+    extensionSchema.makeImmutable(message);
+  }
+
+  private <UT, UB, ET extends FieldSet.FieldDescriptorLite<ET>>
+      boolean parseMessageSetItemOrUnknownField(
+          Reader reader,
+          ExtensionRegistryLite extensionRegistry,
+          ExtensionSchema<ET> extensionSchema,
+          FieldSet<ET> extensions,
+          UnknownFieldSchema<UT, UB> unknownFieldSchema,
+          UB unknownFields)
+          throws IOException {
+    int startTag = reader.getTag();
+    if (startTag != WireFormat.MESSAGE_SET_ITEM_TAG) {
+      if (WireFormat.getTagWireType(startTag) == WireFormat.WIRETYPE_LENGTH_DELIMITED) {
+        Object extension =
+            extensionSchema.findExtensionByNumber(
+                extensionRegistry, defaultInstance, WireFormat.getTagFieldNumber(startTag));
+        if (extension != null) {
+          extensionSchema.parseLengthPrefixedMessageSetItem(
+              reader, extension, extensionRegistry, extensions);
+          return true;
+        } else {
+          return unknownFieldSchema.mergeOneFieldFrom(unknownFields, reader);
+        }
+      } else {
+        return reader.skipField();
+      }
+    }
+
+    // The wire format for MessageSet is:
+    //   message MessageSet {
+    //     repeated group Item = 1 {
+    //       required int32 typeId = 2;
+    //       required bytes message = 3;
+    //     }
+    //   }
+    // "typeId" is the extension's field number.  The extension can only be
+    // a message type, where "message" contains the encoded bytes of that
+    // message.
+    //
+    // In practice, we will probably never see a MessageSet item in which
+    // the message appears before the type ID, or where either field does not
+    // appear exactly once.  However, in theory such cases are valid, so we
+    // should be prepared to accept them.
+
+    int typeId = 0;
+    ByteString rawBytes = null; // If we encounter "message" before "typeId"
+    Object extension = null;
+
+    // Read bytes from input, if we get it's type first then parse it eagerly,
+    // otherwise we store the raw bytes in a local variable.
+    loop:
+    while (true) {
+      final int number = reader.getFieldNumber();
+      if (number == Reader.READ_DONE) {
+        break;
+      }
+
+      final int tag = reader.getTag();
+      if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) {
+        typeId = reader.readUInt32();
+        extension =
+            extensionSchema.findExtensionByNumber(extensionRegistry, defaultInstance, typeId);
+        continue;
+      } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) {
+        if (extension != null) {
+          extensionSchema.parseLengthPrefixedMessageSetItem(
+              reader, extension, extensionRegistry, extensions);
+          continue;
+        }
+        // We haven't seen a type ID yet or we want parse message lazily.
+        rawBytes = reader.readBytes();
+        continue;
+      } else {
+        if (!reader.skipField()) {
+          break loop; // End of group
+        }
+      }
+    }
+
+    if (reader.getTag() != WireFormat.MESSAGE_SET_ITEM_END_TAG) {
+      throw InvalidProtocolBufferException.invalidEndTag();
+    }
+
+    // If there are any rawBytes left, it means the message content appears before the type ID.
+    if (rawBytes != null) {
+      if (extension != null) { // We known the type
+        // TODO(xiaofeng): Instead of reading into a temporary ByteString, maybe there is a way
+        // to read directly from Reader to the submessage?
+        extensionSchema.parseMessageSetItem(rawBytes, extension, extensionRegistry, extensions);
+      } else {
+        unknownFieldSchema.addLengthDelimited(unknownFields, typeId, rawBytes);
+      }
+    }
+    return true;
+  }
+
+  @Override
+  public final boolean isInitialized(T message) {
+    FieldSet<?> extensions = extensionSchema.getExtensions(message);
+    return extensions.isInitialized();
+  }
+
+  @Override
+  public int getSerializedSize(T message) {
+    int size = 0;
+
+    size += getUnknownFieldsSerializedSize(unknownFieldSchema, message);
+
+    if (hasExtensions) {
+      size += extensionSchema.getExtensions(message).getMessageSetSerializedSize();
+    }
+
+    return size;
+  }
+
+  private <UT, UB> int getUnknownFieldsSerializedSize(
+      UnknownFieldSchema<UT, UB> schema, T message) {
+    UT unknowns = schema.getFromMessage(message);
+    return schema.getSerializedSizeAsMessageSet(unknowns);
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/NewInstanceSchema.java b/java/core/src/main/java/com/google/protobuf/NewInstanceSchema.java
new file mode 100755
index 0000000..f2dbb8e
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/NewInstanceSchema.java
@@ -0,0 +1,36 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+interface NewInstanceSchema {
+  /** Create a new message instance given the default instance of the message type. */
+  Object newInstance(Object defaultInstance);
+}
diff --git a/java/core/src/main/java/com/google/protobuf/NewInstanceSchemaFull.java b/java/core/src/main/java/com/google/protobuf/NewInstanceSchemaFull.java
new file mode 100755
index 0000000..3433b65
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/NewInstanceSchemaFull.java
@@ -0,0 +1,39 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+final class NewInstanceSchemaFull implements NewInstanceSchema {
+  @Override
+  public Object newInstance(Object defaultInstance) {
+    return ((GeneratedMessageV3) defaultInstance)
+        .newInstance(GeneratedMessageV3.UnusedPrivateParameter.INSTANCE);
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/NewInstanceSchemaLite.java b/java/core/src/main/java/com/google/protobuf/NewInstanceSchemaLite.java
new file mode 100755
index 0000000..9b92266
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/NewInstanceSchemaLite.java
@@ -0,0 +1,39 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+final class NewInstanceSchemaLite implements NewInstanceSchema {
+  @Override
+  public Object newInstance(Object defaultInstance) {
+    return ((GeneratedMessageLite) defaultInstance)
+        .dynamicMethod(GeneratedMessageLite.MethodToInvoke.NEW_MUTABLE_INSTANCE);
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/NewInstanceSchemas.java b/java/core/src/main/java/com/google/protobuf/NewInstanceSchemas.java
new file mode 100755
index 0000000..eff45f6
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/NewInstanceSchemas.java
@@ -0,0 +1,53 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+final class NewInstanceSchemas {
+  private static final NewInstanceSchema FULL_SCHEMA = loadSchemaForFullRuntime();
+  private static final NewInstanceSchema LITE_SCHEMA = new NewInstanceSchemaLite();
+
+  static NewInstanceSchema full() {
+    return FULL_SCHEMA;
+  }
+
+  static NewInstanceSchema lite() {
+    return LITE_SCHEMA;
+  }
+
+  private static NewInstanceSchema loadSchemaForFullRuntime() {
+    try {
+      Class<?> clazz = Class.forName("com.google.protobuf.NewInstanceSchemaFull");
+      return (NewInstanceSchema) clazz.getDeclaredConstructor().newInstance();
+    } catch (Exception e) {
+      return null;
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/OneofInfo.java b/java/core/src/main/java/com/google/protobuf/OneofInfo.java
new file mode 100755
index 0000000..bc518fc
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/OneofInfo.java
@@ -0,0 +1,66 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.lang.reflect.Field;
+
+/** Information for a oneof within a protobuf message. */
+// TODO(nathanmittler): make this private once all of experimental code is migrated to protobuf.
+@ExperimentalApi
+final class OneofInfo {
+  private final int id;
+  private final Field caseField;
+  private final Field valueField;
+
+  public OneofInfo(int id, Field caseField, Field valueField) {
+    this.id = id;
+    this.caseField = caseField;
+    this.valueField = valueField;
+  }
+
+  /**
+   * Returns the unique identifier of the oneof within the message. This is really just an index
+   * starting at zero.
+   */
+  public int getId() {
+    return id;
+  }
+
+  /** The {@code int} field containing the field number of the currently active member. */
+  public Field getCaseField() {
+    return caseField;
+  }
+
+  /** The {@link Object} field containing the value of the currently active member. */
+  public Field getValueField() {
+    return valueField;
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/ProtoSyntax.java b/java/core/src/main/java/com/google/protobuf/ProtoSyntax.java
new file mode 100755
index 0000000..851b839
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/ProtoSyntax.java
@@ -0,0 +1,38 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/** Represents the syntax version of the message. */
+@ExperimentalApi
+public enum ProtoSyntax {
+  PROTO2,
+  PROTO3;
+}
diff --git a/java/core/src/main/java/com/google/protobuf/Protobuf.java b/java/core/src/main/java/com/google/protobuf/Protobuf.java
new file mode 100755
index 0000000..adaa7fa
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/Protobuf.java
@@ -0,0 +1,152 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.Internal.checkNotNull;
+
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * Main runtime interface for protobuf. Applications should interact with this interface (rather
+ * than directly accessing internal APIs) in order to perform operations on protobuf messages.
+ */
+@ExperimentalApi
+final class Protobuf {
+  private static final Protobuf INSTANCE = new Protobuf();
+
+  private final SchemaFactory schemaFactory;
+
+  // TODO(nathanmittler): Consider using ClassValue instead.
+  private final ConcurrentMap<Class<?>, Schema<?>> schemaCache =
+      new ConcurrentHashMap<Class<?>, Schema<?>>();
+
+  /** Gets the singleton instance of the Protobuf runtime. */
+  public static Protobuf getInstance() {
+    return INSTANCE;
+  }
+
+  /** Writes the given message to the target {@link Writer}. */
+  public <T> void writeTo(T message, Writer writer) throws IOException {
+    schemaFor(message).writeTo(message, writer);
+  }
+
+  /** Reads fields from the given {@link Reader} and merges them into the message. */
+  public <T> void mergeFrom(T message, Reader reader) throws IOException {
+    mergeFrom(message, reader, ExtensionRegistryLite.getEmptyRegistry());
+  }
+
+  /** Reads fields from the given {@link Reader} and merges them into the message. */
+  public <T> void mergeFrom(T message, Reader reader, ExtensionRegistryLite extensionRegistry)
+      throws IOException {
+    schemaFor(message).mergeFrom(message, reader, extensionRegistry);
+  }
+
+  /** Marks repeated/map/extension/unknown fields as immutable. */
+  public <T> void makeImmutable(T message) {
+    schemaFor(message).makeImmutable(message);
+  }
+
+  /**
+   * Checks if all required fields are set. TODO(xiaofeng): Make this package private when the tests
+   * are moved to protobuf package.
+   */
+  public <T> boolean isInitialized(T message) {
+    return schemaFor(message).isInitialized(message);
+  }
+
+  /** Gets the schema for the given message type. */
+  public <T> Schema<T> schemaFor(Class<T> messageType) {
+    checkNotNull(messageType, "messageType");
+    @SuppressWarnings("unchecked")
+    Schema<T> schema = (Schema<T>) schemaCache.get(messageType);
+    if (schema == null) {
+      schema = schemaFactory.createSchema(messageType);
+      @SuppressWarnings("unchecked")
+      Schema<T> previous = (Schema<T>) registerSchema(messageType, schema);
+      if (previous != null) {
+        // A new schema was registered by another thread.
+        schema = previous;
+      }
+    }
+    return schema;
+  }
+
+  /** Gets the schema for the given message. */
+  @SuppressWarnings("unchecked")
+  public <T> Schema<T> schemaFor(T message) {
+    return schemaFor((Class<T>) message.getClass());
+  }
+
+  /**
+   * Registers the given schema for the message type only if a schema was not already registered.
+   *
+   * @param messageType the type of message on which the schema operates.
+   * @param schema the schema for the message type.
+   * @return the previously registered schema, or {@code null} if the given schema was successfully
+   *     registered.
+   */
+  public Schema<?> registerSchema(Class<?> messageType, Schema<?> schema) {
+    checkNotNull(messageType, "messageType");
+    checkNotNull(schema, "schema");
+    return schemaCache.putIfAbsent(messageType, schema);
+  }
+
+  /**
+   * Visible for testing only. Registers the given schema for the message type. If a schema was
+   * previously registered, it will be replaced by the provided schema.
+   *
+   * @param messageType the type of message on which the schema operates.
+   * @param schema the schema for the message type.
+   * @return the previously registered schema, or {@code null} if no schema was registered
+   *     previously.
+   */
+  public Schema<?> registerSchemaOverride(Class<?> messageType, Schema<?> schema) {
+    checkNotNull(messageType, "messageType");
+    checkNotNull(schema, "schema");
+    return schemaCache.put(messageType, schema);
+  }
+
+  private Protobuf() {
+    schemaFactory = new ManifestSchemaFactory();
+  }
+
+  int getTotalSchemaSize() {
+    int result = 0;
+    for (Schema<?> schema : schemaCache.values()) {
+      if (schema instanceof MessageSchema) {
+        result += ((MessageSchema) schema).getSchemaSize();
+      }
+    }
+    return result;
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/ProtobufLists.java b/java/core/src/main/java/com/google/protobuf/ProtobufLists.java
new file mode 100755
index 0000000..271c849
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/ProtobufLists.java
@@ -0,0 +1,94 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.Internal.BooleanList;
+import com.google.protobuf.Internal.DoubleList;
+import com.google.protobuf.Internal.FloatList;
+import com.google.protobuf.Internal.IntList;
+import com.google.protobuf.Internal.LongList;
+import com.google.protobuf.Internal.ProtobufList;
+
+/** Utility class for construction of lists that extend {@link ProtobufList}. */
+@ExperimentalApi
+final class ProtobufLists {
+  private ProtobufLists() {}
+
+  public static <E> ProtobufList<E> emptyProtobufList() {
+    return ProtobufArrayList.emptyList();
+  }
+
+  public static <E> ProtobufList<E> mutableCopy(ProtobufList<E> list) {
+    int size = list.size();
+    return list.mutableCopyWithCapacity(
+        size == 0 ? AbstractProtobufList.DEFAULT_CAPACITY : size * 2);
+  }
+
+  public static BooleanList emptyBooleanList() {
+    return BooleanArrayList.emptyList();
+  }
+
+  public static BooleanList newBooleanList() {
+    return new BooleanArrayList();
+  }
+
+  public static IntList emptyIntList() {
+    return IntArrayList.emptyList();
+  }
+
+  public static IntList newIntList() {
+    return new IntArrayList();
+  }
+
+  public static LongList emptyLongList() {
+    return LongArrayList.emptyList();
+  }
+
+  public static LongList newLongList() {
+    return new LongArrayList();
+  }
+
+  public static FloatList emptyFloatList() {
+    return FloatArrayList.emptyList();
+  }
+
+  public static FloatList newFloatList() {
+    return new FloatArrayList();
+  }
+
+  public static DoubleList emptyDoubleList() {
+    return DoubleArrayList.emptyList();
+  }
+
+  public static DoubleList newDoubleList() {
+    return new DoubleArrayList();
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/RawMessageInfo.java b/java/core/src/main/java/com/google/protobuf/RawMessageInfo.java
new file mode 100755
index 0000000..b9a3d2b
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/RawMessageInfo.java
@@ -0,0 +1,220 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/**
+ * RawMessageInfo stores the same amount of information as {@link MessageInfo} but in a more compact
+ * format.
+ */
+final class RawMessageInfo implements MessageInfo {
+
+  private final MessageLite defaultInstance;
+
+  /**
+   * The compact format packs everything in a String object and a Object[] array. The String object
+   * is encoded with field number, field type, hasbits offset, oneof index, etc., whereas the
+   * Object[] array contains field references, class references, instance references, etc.
+   *
+   * <p>The String object encodes a sequence of integers into UTF-16 characters. For each int, it
+   * will be encoding into 1 to 3 UTF-16 characters depending on its unsigned value:
+   *
+   * <ul>
+   *   <li>1 char: [c1: 0x0000 - 0xD7FF] = int of the same value.
+   *   <li>2 chars: [c1: 0xE000 - 0xFFFF], [c2: 0x0000 - 0xD7FF] = (c2 << 13) | (c1 & 0x1FFF)
+   *   <li>3 chars: [c1: 0xE000 - 0xFFFF], [c2: 0xE000 - 0xFFFF], [c3: 0x0000 - 0xD7FF] = (c3 << 26)
+   *       | ((c2 & 0x1FFF) << 13) | (c1 & 0x1FFF)
+   * </ul>
+   *
+   * <p>Note that we don't use UTF-16 surrogate pairs [0xD800 - 0xDFFF] because they have to come in
+   * pairs to form a valid UTF-16char sequence and don't help us encode values more efficiently.
+   *
+   * <p>The integer sequence encoded in the String object has the following layout:
+   *
+   * <ul>
+   *   <li>[0]: flags, flags & 0x1 = is proto2?, flags & 0x2 = is message?.
+   *   <li>[1]: field count, if 0, this is the end of the integer sequence and the corresponding
+   *       Object[] array should be null.
+   *   <li>[2]: oneof count
+   *   <li>[3]: hasbits count, how many hasbits integers are generated.
+   *   <li>[4]: min field number
+   *   <li>[5]: max field number
+   *   <li>[6]: total number of entries need to allocate
+   *   <li>[7]: map field count
+   *   <li>[8]: repeated field count, this doesn't include map fields.
+   *   <li>[9]: size of checkInitialized array
+   *   <li>[...]: field entries
+   * </ul>
+   *
+   * <p>Each field entry starts with a field number and the field type:
+   *
+   * <ul>
+   *   <li>[0]: field number
+   *   <li>[1]: field type with extra bits:
+   *       <ul>
+   *         <li>v & 0xFF = field type as defined in the FieldType class
+   *         <li>v & 0x100 = is required?
+   *         <li>v & 0x200 = is checkUtf8?
+   *         <li>v & 0x400 = needs isInitialized check?
+   *         <li>v & 0x800 = is map field with proto2 enum value?
+   *       </ul>
+   * </ul>
+   *
+   * If the file is proto2 and this is a singular field:
+   *
+   * <ul>
+   *   <li>[2]: hasbits offset
+   * </ul>
+   *
+   * If the field is in an oneof:
+   *
+   * <ul>
+   *   <li>[2]: oenof index
+   * </ul>
+   *
+   * For other types, the field entry only has field number and field type.
+   *
+   * <p>The Object[] array has 3 sections:
+   *
+   * <ul>
+   *   <li>---- oneof section ----
+   *       <ul>
+   *         <li>[0]: value field for oneof 1.
+   *         <li>[1]: case field for oneof 1.
+   *         <li>...
+   *         <li>[.]: value field for oneof n.
+   *         <li>[.]: case field for oneof n.
+   *       </ul>
+   *   <li>---- hasbits section ----
+   *       <ul>
+   *         <li>[.]: hasbits field 1
+   *         <li>[.]: hasbits field 2
+   *         <li>...
+   *         <li>[.]: hasbits field n
+   *       </ul>
+   *   <li>---- field section ----
+   *       <ul>
+   *         <li>[...]: field entries
+   *       </ul>
+   * </ul>
+   *
+   * <p>In the Object[] array, field entries are ordered in the same way as field entries in the
+   * String object. The size of each entry is determined by the field type.
+   *
+   * <ul>
+   *   <li>Oneof field:
+   *       <ul>
+   *         <li>Oneof message field:
+   *             <ul>
+   *               <li>[0]: message class reference.
+   *             </ul>
+   *         <li>Oneof enum fieldin proto2:
+   *             <ul>
+   *               <li>[0]: EnumLiteMap
+   *             </ul>
+   *         <li>For all other oneof fields, field entry in the Object[] array is empty.
+   *       </ul>
+   *   <li>Repeated message field:
+   *       <ul>
+   *         <li>[0]: field reference
+   *         <li>[1]: message class reference
+   *       </ul>
+   *   <li>Proto2 singular/repeated enum field:
+   *       <ul>
+   *         <li>[0]: field reference
+   *         <li>[1]: EnumLiteMap
+   *       </ul>
+   *   <li>Map field with a proto2 enum value:
+   *       <ul>
+   *         <li>[0]: field reference
+   *         <li>[1]: map default entry instance
+   *         <li>[2]: EnumLiteMap
+   *       </ul>
+   *   <li>Map field with other value types:
+   *       <ul>
+   *         <li>[0]: field reference
+   *         <li>[1]: map default entry instance
+   *       </ul>
+   *   <li>All other field type:
+   *       <ul>
+   *         <li>[0]: field reference
+   *       </ul>
+   * </ul>
+   *
+   * <p>In order to read the field info from this compact format, a reader needs to progress through
+   * the String object and the Object[] array simultaneously.
+   */
+  private final String info;
+
+  private final Object[] objects;
+  private final int flags;
+
+  RawMessageInfo(MessageLite defaultInstance, String info, Object[] objects) {
+    this.defaultInstance = defaultInstance;
+    this.info = info;
+    this.objects = objects;
+    int position = 0;
+    int value = (int) info.charAt(position++);
+    if (value < 0xD800) {
+      flags = value;
+    } else {
+      int result = value & 0x1FFF;
+      int shift = 13;
+      while ((value = info.charAt(position++)) >= 0xD800) {
+        result |= (value & 0x1FFF) << shift;
+        shift += 13;
+      }
+      flags = result | (value << shift);
+    }
+  }
+
+  String getStringInfo() {
+    return info;
+  }
+
+  Object[] getObjects() {
+    return objects;
+  }
+
+  @Override
+  public MessageLite getDefaultInstance() {
+    return defaultInstance;
+  }
+
+  @Override
+  public ProtoSyntax getSyntax() {
+    return (flags & 0x1) == 0x1 ? ProtoSyntax.PROTO2 : ProtoSyntax.PROTO3;
+  }
+
+  @Override
+  public boolean isMessageSetWireFormat() {
+    return (flags & 0x2) == 0x2;
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/Reader.java b/java/core/src/main/java/com/google/protobuf/Reader.java
new file mode 100755
index 0000000..705096f
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/Reader.java
@@ -0,0 +1,379 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/** A reader of fields from a serialized protobuf message. */
+// TODO(nathanmittler): Refactor to allow the reader to allocate properly sized lists.
+@ExperimentalApi
+interface Reader {
+  /** Value used to indicate that the end of input has been reached. */
+  int READ_DONE = Integer.MAX_VALUE;
+
+  /** Value used to indicate that the reader does not know the tag about the field. */
+  int TAG_UNKNOWN = 0;
+
+  boolean shouldDiscardUnknownFields();
+
+  /**
+   * Gets the field number for the current field being read.
+   *
+   * <p>TODO(liujisi): Rename it to make it more explicit about the side effect on the underlying
+   * buffer.
+   *
+   * @return the current field number or {@link #READ_DONE} if the end of input has been reached.
+   */
+  int getFieldNumber() throws IOException;
+
+  /**
+   * Gets the wire tag of the current field.
+   *
+   * @return the current wire tag or {@link #TAG_UNKNOWN} if the reader does not know the tag of the
+   *     current field.
+   */
+  int getTag();
+
+  /**
+   * Skips the current field and advances the reader to the next field.
+   *
+   * @return {@code true} if there are more fields or {@code false} if the end of input has been
+   *     reached.
+   */
+  boolean skipField() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code DOUBLE} and advances the reader to the next
+   * field.
+   */
+  double readDouble() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code FLOAT} and advances the reader to the next
+   * field.
+   */
+  float readFloat() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code UINT64} and advances the reader to the next
+   * field.
+   */
+  long readUInt64() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code INT64} and advances the reader to the next
+   * field.
+   */
+  long readInt64() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code INT32} and advances the reader to the next
+   * field.
+   */
+  int readInt32() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code FIXED64} and advances the reader to the next
+   * field.
+   */
+  long readFixed64() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code FIXED32} and advances the reader to the next
+   * field.
+   */
+  int readFixed32() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code BOOL} and advances the reader to the next
+   * field.
+   */
+  boolean readBool() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code STRING} and advances the reader to the next
+   * field. If the stream contains malformed UTF-8, replace the offending bytes with the standard
+   * UTF-8 replacement character.
+   */
+  String readString() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code STRING} and advances the reader to the next
+   * field. If the stream contains malformed UTF-8, throw exception {@link
+   * InvalidProtocolBufferException}.
+   */
+  String readStringRequireUtf8() throws IOException;
+
+  // TODO(yilunchong): the lack of other opinions for whether to expose this on the interface
+  <T> T readMessageBySchemaWithCheck(Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+      throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code MESSAGE} and advances the reader to the next
+   * field.
+   */
+  <T> T readMessage(Class<T> clazz, ExtensionRegistryLite extensionRegistry) throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code GROUP} and advances the reader to the next
+   * field.
+   *
+   * @deprecated groups fields are deprecated.
+   */
+  @Deprecated
+  <T> T readGroup(Class<T> clazz, ExtensionRegistryLite extensionRegistry) throws IOException;
+
+  // TODO(yilunchong): the lack of other opinions for whether to expose this on the interface
+  @Deprecated
+  <T> T readGroupBySchemaWithCheck(Schema<T> schema, ExtensionRegistryLite extensionRegistry)
+      throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code BYTES} and advances the reader to the next
+   * field.
+   */
+  ByteString readBytes() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code UINT32} and advances the reader to the next
+   * field.
+   */
+  int readUInt32() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code ENUM} and advances the reader to the next
+   * field.
+   */
+  int readEnum() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code SFIXED32} and advances the reader to the next
+   * field.
+   */
+  int readSFixed32() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code SFIXED64} and advances the reader to the next
+   * field.
+   */
+  long readSFixed64() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code SINT32} and advances the reader to the next
+   * field.
+   */
+  int readSInt32() throws IOException;
+
+  /**
+   * Reads and returns the next field of type {@code SINT64} and advances the reader to the next
+   * field.
+   */
+  long readSInt64() throws IOException;
+
+  /**
+   * Reads the next field of type {@code DOUBLE_LIST} or {@code DOUBLE_LIST_PACKED} and advances the
+   * reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readDoubleList(List<Double> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code FLOAT_LIST} or {@code FLOAT_LIST_PACKED} and advances the
+   * reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readFloatList(List<Float> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code UINT64_LIST} or {@code UINT64_LIST_PACKED} and advances the
+   * reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readUInt64List(List<Long> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code INT64_LIST} or {@code INT64_LIST_PACKED} and advances the
+   * reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readInt64List(List<Long> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code INT32_LIST} or {@code INT32_LIST_PACKED} and advances the
+   * reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readInt32List(List<Integer> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code FIXED64_LIST} or {@code FIXED64_LIST_PACKED} and advances
+   * the reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readFixed64List(List<Long> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code FIXED32_LIST} or {@code FIXED32_LIST_PACKED} and advances
+   * the reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readFixed32List(List<Integer> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code BOOL_LIST} or {@code BOOL_LIST_PACKED} and advances the
+   * reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readBoolList(List<Boolean> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code STRING_LIST} and advances the reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readStringList(List<String> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code STRING_LIST} and advances the reader to the next field. If
+   * the stream contains malformed UTF-8, throw exception {@link InvalidProtocolBufferException}.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readStringListRequireUtf8(List<String> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code MESSAGE_LIST} and advances the reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   * @param targetType the type of the elements stored in the {@code target} list.
+   */
+  <T> void readMessageList(
+      List<T> target, Schema<T> schema, ExtensionRegistryLite extensionRegistry) throws IOException;
+
+  <T> void readMessageList(
+      List<T> target, Class<T> targetType, ExtensionRegistryLite extensionRegistry)
+      throws IOException;
+
+  /**
+   * Reads the next field of type {@code GROUP_LIST} and advances the reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   * @param targetType the type of the elements stored in the {@code target} list.
+   * @deprecated groups fields are deprecated.
+   */
+  @Deprecated
+  <T> void readGroupList(
+      List<T> target, Class<T> targetType, ExtensionRegistryLite extensionRegistry)
+      throws IOException;
+
+  @Deprecated
+  <T> void readGroupList(
+      List<T> target, Schema<T> targetType, ExtensionRegistryLite extensionRegistry)
+      throws IOException;
+
+  /**
+   * Reads the next field of type {@code BYTES_LIST} and advances the reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readBytesList(List<ByteString> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code UINT32_LIST} or {@code UINT32_LIST_PACKED} and advances the
+   * reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readUInt32List(List<Integer> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code ENUM_LIST} or {@code ENUM_LIST_PACKED} and advances the
+   * reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readEnumList(List<Integer> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code SFIXED32_LIST} or {@code SFIXED32_LIST_PACKED} and advances
+   * the reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readSFixed32List(List<Integer> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code SFIXED64_LIST} or {@code SFIXED64_LIST_PACKED} and advances
+   * the reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readSFixed64List(List<Long> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code SINT32_LIST} or {@code SINT32_LIST_PACKED} and advances the
+   * reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readSInt32List(List<Integer> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code SINT64_LIST} or {@code SINT64_LIST_PACKED} and advances the
+   * reader to the next field.
+   *
+   * @param target the list that will receive the read values.
+   */
+  void readSInt64List(List<Long> target) throws IOException;
+
+  /**
+   * Reads the next field of type {@code MAP} and advances the reader to the next field.
+   *
+   * @param target the mutable map that will receive the read values.
+   * @param mapDefaultEntry the default entry of the map field.
+   * @param extensionRegistry the extension registry for parsing message value fields.
+   */
+  <K, V> void readMap(
+      Map<K, V> target,
+      MapEntryLite.Metadata<K, V> mapDefaultEntry,
+      ExtensionRegistryLite extensionRegistry)
+      throws IOException;
+}
diff --git a/java/core/src/main/java/com/google/protobuf/RopeByteString.java b/java/core/src/main/java/com/google/protobuf/RopeByteString.java
index c3bec7b..f294df3 100644
--- a/java/core/src/main/java/com/google/protobuf/RopeByteString.java
+++ b/java/core/src/main/java/com/google/protobuf/RopeByteString.java
@@ -445,6 +445,11 @@
     right.writeTo(output);
   }
 
+  @Override
+  void writeToReverse(ByteOutput output) throws IOException {
+    right.writeToReverse(output);
+    left.writeToReverse(output);
+  }
 
   @Override
   protected String toStringInternal(Charset charset) {
diff --git a/java/core/src/main/java/com/google/protobuf/Schema.java b/java/core/src/main/java/com/google/protobuf/Schema.java
new file mode 100755
index 0000000..d0e1e26
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/Schema.java
@@ -0,0 +1,85 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.ArrayDecoders.Registers;
+import java.io.IOException;
+
+/**
+ * A runtime schema for a single protobuf message. A schema provides operations on message instances
+ * such as serialization/deserialization.
+ */
+@ExperimentalApi
+interface Schema<T> {
+  /** Writes the given message to the target {@link Writer}. */
+  void writeTo(T message, Writer writer) throws IOException;
+
+  /**
+   * Reads fields from the given {@link Reader} and merges them into the message. It doesn't make
+   * the message immutable after parsing is done. To make the message immutable, use {@link
+   * #makeImmutable}.
+   */
+  void mergeFrom(T message, Reader reader, ExtensionRegistryLite extensionRegistry)
+      throws IOException;
+
+  /**
+   * Like the above but parses from a byte[] without extensions. Entry point of fast path. Note that
+   * this method may throw IndexOutOfBoundsException if the input data is not valid protobuf wire
+   * format. Protobuf public API methods should catch and convert that exception to
+   * InvalidProtocolBufferException.
+   */
+  void mergeFrom(T message, byte[] data, int position, int limit, Registers registers)
+      throws IOException;
+
+  /** Marks repeated/map/extension/unknown fields as immutable. */
+  void makeImmutable(T message);
+
+  /** Checks whether all required fields are set. */
+  boolean isInitialized(T message);
+
+  /** Creates a new instance of the message class. */
+  T newInstance();
+
+  /** Determine of the two messages are equal. */
+  boolean equals(T message, T other);
+
+  /** Compute a hashCode for the message. */
+  int hashCode(T message);
+
+  /**
+   * Merge values from {@code other} into {@code message}. This method doesn't make the message
+   * immutable. To make the message immutable after merging, use {@link #makeImmutable}.
+   */
+  void mergeFrom(T message, T other);
+
+  /** Compute the serialized size of the message. */
+  int getSerializedSize(T message);
+}
diff --git a/java/core/src/main/java/com/google/protobuf/SchemaFactory.java b/java/core/src/main/java/com/google/protobuf/SchemaFactory.java
new file mode 100755
index 0000000..cf38dd6
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/SchemaFactory.java
@@ -0,0 +1,38 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/** A factory that manufactures {@link Schema} instances for protobuf messages. */
+@ExperimentalApi
+interface SchemaFactory {
+  /** Creates a schema instance for the given protobuf message type. */
+  <T> Schema<T> createSchema(Class<T> messageType);
+}
diff --git a/java/core/src/main/java/com/google/protobuf/SchemaUtil.java b/java/core/src/main/java/com/google/protobuf/SchemaUtil.java
new file mode 100755
index 0000000..50957fc
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/SchemaUtil.java
@@ -0,0 +1,991 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.FieldSet.FieldDescriptorLite;
+import com.google.protobuf.Internal.EnumLiteMap;
+import com.google.protobuf.Internal.EnumVerifier;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Iterator;
+import java.util.List;
+import java.util.RandomAccess;
+
+/** Helper methods used by schemas. */
+@ExperimentalApi
+final class SchemaUtil {
+  private static final Class<?> GENERATED_MESSAGE_CLASS = getGeneratedMessageClass();
+  private static final UnknownFieldSchema<?, ?> PROTO2_UNKNOWN_FIELD_SET_SCHEMA =
+      getUnknownFieldSetSchema(false);
+  private static final UnknownFieldSchema<?, ?> PROTO3_UNKNOWN_FIELD_SET_SCHEMA =
+      getUnknownFieldSetSchema(true);
+  private static final UnknownFieldSchema<?, ?> UNKNOWN_FIELD_SET_LITE_SCHEMA =
+      new UnknownFieldSetLiteSchema();
+
+  private static final int DEFAULT_LOOK_UP_START_NUMBER = 40;
+
+  private SchemaUtil() {}
+
+  /**
+   * Requires that the given message extend {@link com.google.protobuf.GeneratedMessageV3} or {@link
+   * GeneratedMessageLite}.
+   */
+  public static void requireGeneratedMessage(Class<?> messageType) {
+    if (!GeneratedMessageLite.class.isAssignableFrom(messageType)
+        && GENERATED_MESSAGE_CLASS != null
+        && !GENERATED_MESSAGE_CLASS.isAssignableFrom(messageType)) {
+      throw new IllegalArgumentException(
+          "Message classes must extend GeneratedMessage or GeneratedMessageLite");
+    }
+  }
+
+  public static void writeDouble(int fieldNumber, double value, Writer writer) throws IOException {
+    if (Double.compare(value, 0.0) != 0) {
+      writer.writeDouble(fieldNumber, value);
+    }
+  }
+
+  public static void writeFloat(int fieldNumber, float value, Writer writer) throws IOException {
+    if (Float.compare(value, 0.0f) != 0) {
+      writer.writeFloat(fieldNumber, value);
+    }
+  }
+
+  public static void writeInt64(int fieldNumber, long value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeInt64(fieldNumber, value);
+    }
+  }
+
+  public static void writeUInt64(int fieldNumber, long value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeUInt64(fieldNumber, value);
+    }
+  }
+
+  public static void writeSInt64(int fieldNumber, long value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeSInt64(fieldNumber, value);
+    }
+  }
+
+  public static void writeFixed64(int fieldNumber, long value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeFixed64(fieldNumber, value);
+    }
+  }
+
+  public static void writeSFixed64(int fieldNumber, long value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeSFixed64(fieldNumber, value);
+    }
+  }
+
+  public static void writeInt32(int fieldNumber, int value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeInt32(fieldNumber, value);
+    }
+  }
+
+  public static void writeUInt32(int fieldNumber, int value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeUInt32(fieldNumber, value);
+    }
+  }
+
+  public static void writeSInt32(int fieldNumber, int value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeSInt32(fieldNumber, value);
+    }
+  }
+
+  public static void writeFixed32(int fieldNumber, int value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeFixed32(fieldNumber, value);
+    }
+  }
+
+  public static void writeSFixed32(int fieldNumber, int value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeSFixed32(fieldNumber, value);
+    }
+  }
+
+  public static void writeEnum(int fieldNumber, int value, Writer writer) throws IOException {
+    if (value != 0) {
+      writer.writeEnum(fieldNumber, value);
+    }
+  }
+
+  public static void writeBool(int fieldNumber, boolean value, Writer writer) throws IOException {
+    if (value) {
+      writer.writeBool(fieldNumber, true);
+    }
+  }
+
+  public static void writeString(int fieldNumber, Object value, Writer writer) throws IOException {
+    if (value instanceof String) {
+      writeStringInternal(fieldNumber, (String) value, writer);
+    } else {
+      writeBytes(fieldNumber, (ByteString) value, writer);
+    }
+  }
+
+  private static void writeStringInternal(int fieldNumber, String value, Writer writer)
+      throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeString(fieldNumber, value);
+    }
+  }
+
+  public static void writeBytes(int fieldNumber, ByteString value, Writer writer)
+      throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeBytes(fieldNumber, value);
+    }
+  }
+
+  public static void writeMessage(int fieldNumber, Object value, Writer writer) throws IOException {
+    if (value != null) {
+      writer.writeMessage(fieldNumber, value);
+    }
+  }
+
+  public static void writeDoubleList(
+      int fieldNumber, List<Double> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeDoubleList(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeFloatList(
+      int fieldNumber, List<Float> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeFloatList(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeInt64List(
+      int fieldNumber, List<Long> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeInt64List(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeUInt64List(
+      int fieldNumber, List<Long> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeUInt64List(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeSInt64List(
+      int fieldNumber, List<Long> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeSInt64List(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeFixed64List(
+      int fieldNumber, List<Long> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeFixed64List(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeSFixed64List(
+      int fieldNumber, List<Long> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeSFixed64List(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeInt32List(
+      int fieldNumber, List<Integer> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeInt32List(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeUInt32List(
+      int fieldNumber, List<Integer> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeUInt32List(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeSInt32List(
+      int fieldNumber, List<Integer> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeSInt32List(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeFixed32List(
+      int fieldNumber, List<Integer> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeFixed32List(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeSFixed32List(
+      int fieldNumber, List<Integer> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeSFixed32List(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeEnumList(
+      int fieldNumber, List<Integer> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeEnumList(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeBoolList(
+      int fieldNumber, List<Boolean> value, Writer writer, boolean packed) throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeBoolList(fieldNumber, value, packed);
+    }
+  }
+
+  public static void writeStringList(int fieldNumber, List<String> value, Writer writer)
+      throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeStringList(fieldNumber, value);
+    }
+  }
+
+  public static void writeBytesList(int fieldNumber, List<ByteString> value, Writer writer)
+      throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeBytesList(fieldNumber, value);
+    }
+  }
+
+  public static void writeMessageList(int fieldNumber, List<?> value, Writer writer)
+      throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeMessageList(fieldNumber, value);
+    }
+  }
+
+  public static void writeMessageList(int fieldNumber, List<?> value, Writer writer, Schema schema)
+      throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeMessageList(fieldNumber, value, schema);
+    }
+  }
+
+  public static void writeLazyFieldList(int fieldNumber, List<?> value, Writer writer)
+      throws IOException {
+    if (value != null && !value.isEmpty()) {
+      for (Object item : value) {
+        ((LazyFieldLite) item).writeTo(writer, fieldNumber);
+      }
+    }
+  }
+
+  public static void writeGroupList(int fieldNumber, List<?> value, Writer writer)
+      throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeGroupList(fieldNumber, value);
+    }
+  }
+
+  public static void writeGroupList(int fieldNumber, List<?> value, Writer writer, Schema schema)
+      throws IOException {
+    if (value != null && !value.isEmpty()) {
+      writer.writeGroupList(fieldNumber, value, schema);
+    }
+  }
+
+  static int computeSizeInt64ListNoTag(List<Long> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+
+    int size = 0;
+
+    if (list instanceof LongArrayList) {
+      final LongArrayList primitiveList = (LongArrayList) list;
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeInt64SizeNoTag(primitiveList.getLong(i));
+      }
+    } else {
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeInt64SizeNoTag(list.get(i));
+      }
+    }
+    return size;
+  }
+
+  static int computeSizeInt64List(int fieldNumber, List<Long> list, boolean packed) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = computeSizeInt64ListNoTag(list);
+
+    if (packed) {
+      return CodedOutputStream.computeTagSize(fieldNumber)
+          + CodedOutputStream.computeLengthDelimitedFieldSize(size);
+    } else {
+      return size + (list.size() * CodedOutputStream.computeTagSize(fieldNumber));
+    }
+  }
+
+  static int computeSizeUInt64ListNoTag(List<Long> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+
+    int size = 0;
+
+    if (list instanceof LongArrayList) {
+      final LongArrayList primitiveList = (LongArrayList) list;
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeUInt64SizeNoTag(primitiveList.getLong(i));
+      }
+    } else {
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeUInt64SizeNoTag(list.get(i));
+      }
+    }
+    return size;
+  }
+
+  static int computeSizeUInt64List(int fieldNumber, List<Long> list, boolean packed) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = computeSizeUInt64ListNoTag(list);
+
+    if (packed) {
+      return CodedOutputStream.computeTagSize(fieldNumber)
+          + CodedOutputStream.computeLengthDelimitedFieldSize(size);
+    } else {
+      return size + (length * CodedOutputStream.computeTagSize(fieldNumber));
+    }
+  }
+
+  static int computeSizeSInt64ListNoTag(List<Long> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+
+    int size = 0;
+
+    if (list instanceof LongArrayList) {
+      final LongArrayList primitiveList = (LongArrayList) list;
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeSInt64SizeNoTag(primitiveList.getLong(i));
+      }
+    } else {
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeSInt64SizeNoTag(list.get(i));
+      }
+    }
+    return size;
+  }
+
+  static int computeSizeSInt64List(int fieldNumber, List<Long> list, boolean packed) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = computeSizeSInt64ListNoTag(list);
+
+    if (packed) {
+      return CodedOutputStream.computeTagSize(fieldNumber)
+          + CodedOutputStream.computeLengthDelimitedFieldSize(size);
+    } else {
+      return size + (length * CodedOutputStream.computeTagSize(fieldNumber));
+    }
+  }
+
+  static int computeSizeEnumListNoTag(List<Integer> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+
+    int size = 0;
+
+    if (list instanceof IntArrayList) {
+      final IntArrayList primitiveList = (IntArrayList) list;
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeEnumSizeNoTag(primitiveList.getInt(i));
+      }
+    } else {
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeEnumSizeNoTag(list.get(i));
+      }
+    }
+    return size;
+  }
+
+  static int computeSizeEnumList(int fieldNumber, List<Integer> list, boolean packed) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = computeSizeEnumListNoTag(list);
+
+    if (packed) {
+      return CodedOutputStream.computeTagSize(fieldNumber)
+          + CodedOutputStream.computeLengthDelimitedFieldSize(size);
+    } else {
+      return size + (length * CodedOutputStream.computeTagSize(fieldNumber));
+    }
+  }
+
+  static int computeSizeInt32ListNoTag(List<Integer> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+
+    int size = 0;
+
+    if (list instanceof IntArrayList) {
+      final IntArrayList primitiveList = (IntArrayList) list;
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeInt32SizeNoTag(primitiveList.getInt(i));
+      }
+    } else {
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeInt32SizeNoTag(list.get(i));
+      }
+    }
+    return size;
+  }
+
+  static int computeSizeInt32List(int fieldNumber, List<Integer> list, boolean packed) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = computeSizeInt32ListNoTag(list);
+
+    if (packed) {
+      return CodedOutputStream.computeTagSize(fieldNumber)
+          + CodedOutputStream.computeLengthDelimitedFieldSize(size);
+    } else {
+      return size + (length * CodedOutputStream.computeTagSize(fieldNumber));
+    }
+  }
+
+  static int computeSizeUInt32ListNoTag(List<Integer> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+
+    int size = 0;
+
+    if (list instanceof IntArrayList) {
+      final IntArrayList primitiveList = (IntArrayList) list;
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeUInt32SizeNoTag(primitiveList.getInt(i));
+      }
+    } else {
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeUInt32SizeNoTag(list.get(i));
+      }
+    }
+    return size;
+  }
+
+  static int computeSizeUInt32List(int fieldNumber, List<Integer> list, boolean packed) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = computeSizeUInt32ListNoTag(list);
+
+    if (packed) {
+      return CodedOutputStream.computeTagSize(fieldNumber)
+          + CodedOutputStream.computeLengthDelimitedFieldSize(size);
+    } else {
+      return size + (length * CodedOutputStream.computeTagSize(fieldNumber));
+    }
+  }
+
+  static int computeSizeSInt32ListNoTag(List<Integer> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+
+    int size = 0;
+
+    if (list instanceof IntArrayList) {
+      final IntArrayList primitiveList = (IntArrayList) list;
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeSInt32SizeNoTag(primitiveList.getInt(i));
+      }
+    } else {
+      for (int i = 0; i < length; i++) {
+        size += CodedOutputStream.computeSInt32SizeNoTag(list.get(i));
+      }
+    }
+    return size;
+  }
+
+  static int computeSizeSInt32List(int fieldNumber, List<Integer> list, boolean packed) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+
+    int size = computeSizeSInt32ListNoTag(list);
+
+    if (packed) {
+      return CodedOutputStream.computeTagSize(fieldNumber)
+          + CodedOutputStream.computeLengthDelimitedFieldSize(size);
+    } else {
+      return size + (length * CodedOutputStream.computeTagSize(fieldNumber));
+    }
+  }
+
+  static int computeSizeFixed32ListNoTag(List<?> list) {
+    return list.size() * WireFormat.FIXED32_SIZE;
+  }
+
+  static int computeSizeFixed32List(int fieldNumber, List<?> list, boolean packed) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    if (packed) {
+      int dataSize = length * WireFormat.FIXED32_SIZE;
+      return CodedOutputStream.computeTagSize(fieldNumber)
+          + CodedOutputStream.computeLengthDelimitedFieldSize(dataSize);
+    } else {
+      return length * CodedOutputStream.computeFixed32Size(fieldNumber, 0);
+    }
+  }
+
+  static int computeSizeFixed64ListNoTag(List<?> list) {
+    return list.size() * WireFormat.FIXED64_SIZE;
+  }
+
+  static int computeSizeFixed64List(int fieldNumber, List<?> list, boolean packed) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    if (packed) {
+      final int dataSize = length * WireFormat.FIXED64_SIZE;
+      return CodedOutputStream.computeTagSize(fieldNumber)
+          + CodedOutputStream.computeLengthDelimitedFieldSize(dataSize);
+    } else {
+      return length * CodedOutputStream.computeFixed64Size(fieldNumber, 0);
+    }
+  }
+
+  static int computeSizeBoolListNoTag(List<?> list) {
+    // bools are 1 byte varints
+    return list.size();
+  }
+
+  static int computeSizeBoolList(int fieldNumber, List<?> list, boolean packed) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    if (packed) {
+      // bools are 1 byte varints
+      return CodedOutputStream.computeTagSize(fieldNumber)
+          + CodedOutputStream.computeLengthDelimitedFieldSize(length);
+    } else {
+      return length * CodedOutputStream.computeBoolSize(fieldNumber, true);
+    }
+  }
+
+  static int computeSizeStringList(int fieldNumber, List<?> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = length * CodedOutputStream.computeTagSize(fieldNumber);
+    if (list instanceof LazyStringList) {
+      LazyStringList lazyList = ((LazyStringList) list);
+      for (int i = 0; i < length; i++) {
+        Object value = lazyList.getRaw(i);
+        if (value instanceof ByteString) {
+          size += CodedOutputStream.computeBytesSizeNoTag((ByteString) value);
+        } else {
+          size += CodedOutputStream.computeStringSizeNoTag((String) value);
+        }
+      }
+    } else {
+      for (int i = 0; i < length; i++) {
+        Object value = list.get(i);
+        if (value instanceof ByteString) {
+          size += CodedOutputStream.computeBytesSizeNoTag((ByteString) value);
+        } else {
+          size += CodedOutputStream.computeStringSizeNoTag((String) value);
+        }
+      }
+    }
+    return size;
+  }
+
+  static int computeSizeMessage(int fieldNumber, Object value, Schema schema) {
+    if (value instanceof LazyFieldLite) {
+      return CodedOutputStream.computeLazyFieldSize(fieldNumber, (LazyFieldLite) value);
+    } else {
+      return CodedOutputStream.computeMessageSize(fieldNumber, (MessageLite) value, schema);
+    }
+  }
+
+  static int computeSizeMessageList(int fieldNumber, List<?> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = length * CodedOutputStream.computeTagSize(fieldNumber);
+    for (int i = 0; i < length; i++) {
+      Object value = list.get(i);
+      if (value instanceof LazyFieldLite) {
+        size += CodedOutputStream.computeLazyFieldSizeNoTag((LazyFieldLite) value);
+      } else {
+        size += CodedOutputStream.computeMessageSizeNoTag((MessageLite) value);
+      }
+    }
+    return size;
+  }
+
+  static int computeSizeMessageList(int fieldNumber, List<?> list, Schema schema) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = length * CodedOutputStream.computeTagSize(fieldNumber);
+    for (int i = 0; i < length; i++) {
+      Object value = list.get(i);
+      if (value instanceof LazyFieldLite) {
+        size += CodedOutputStream.computeLazyFieldSizeNoTag((LazyFieldLite) value);
+      } else {
+        size += CodedOutputStream.computeMessageSizeNoTag((MessageLite) value, schema);
+      }
+    }
+    return size;
+  }
+
+  static int computeSizeByteStringList(int fieldNumber, List<ByteString> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = length * CodedOutputStream.computeTagSize(fieldNumber);
+    for (int i = 0; i < list.size(); i++) {
+      size += CodedOutputStream.computeBytesSizeNoTag(list.get(i));
+    }
+    return size;
+  }
+
+  static int computeSizeGroupList(int fieldNumber, List<MessageLite> list) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = 0;
+    for (int i = 0; i < length; i++) {
+      size += CodedOutputStream.computeGroupSize(fieldNumber, list.get(i));
+    }
+    return size;
+  }
+
+  static int computeSizeGroupList(int fieldNumber, List<MessageLite> list, Schema schema) {
+    final int length = list.size();
+    if (length == 0) {
+      return 0;
+    }
+    int size = 0;
+    for (int i = 0; i < length; i++) {
+      size += CodedOutputStream.computeGroupSize(fieldNumber, list.get(i), schema);
+    }
+    return size;
+  }
+
+  /**
+   * Determines whether to issue tableswitch or lookupswitch for the mergeFrom method.
+   *
+   * @see #shouldUseTableSwitch(int, int, int)
+   */
+  public static boolean shouldUseTableSwitch(FieldInfo[] fields) {
+    // Determine whether to issue a tableswitch or a lookupswitch
+    // instruction.
+    if (fields.length == 0) {
+      return false;
+    }
+
+    int lo = fields[0].getFieldNumber();
+    int hi = fields[fields.length - 1].getFieldNumber();
+    return shouldUseTableSwitch(lo, hi, fields.length);
+  }
+
+  /**
+   * Determines whether to issue tableswitch or lookupswitch for the mergeFrom method. This is based
+   * on the <a href=
+   * "http://hg.openjdk.java.net/jdk8/jdk8/langtools/file/30db5e0aaf83/src/share/classes/com/sun/tools/javac/jvm/Gen.java#l1159">
+   * logic in the JDK</a>.
+   *
+   * @param lo the lowest fieldNumber contained within the message.
+   * @param hi the higest fieldNumber contained within the message.
+   * @param numFields the total number of fields in the message.
+   * @return {@code true} if tableswitch should be used, rather than lookupswitch.
+   */
+  public static boolean shouldUseTableSwitch(int lo, int hi, int numFields) {
+    if (hi < DEFAULT_LOOK_UP_START_NUMBER) {
+      return true;
+    }
+    long tableSpaceCost = ((long) hi - lo + 1); // words
+    long tableTimeCost = 3; // comparisons
+    long lookupSpaceCost = 3 + 2 * (long) numFields;
+    long lookupTimeCost = 3 + (long) numFields;
+    return tableSpaceCost + 3 * tableTimeCost <= lookupSpaceCost + 3 * lookupTimeCost;
+  }
+
+  public static UnknownFieldSchema<?, ?> proto2UnknownFieldSetSchema() {
+    return PROTO2_UNKNOWN_FIELD_SET_SCHEMA;
+  }
+
+  public static UnknownFieldSchema<?, ?> proto3UnknownFieldSetSchema() {
+    return PROTO3_UNKNOWN_FIELD_SET_SCHEMA;
+  }
+
+  public static UnknownFieldSchema<?, ?> unknownFieldSetLiteSchema() {
+    return UNKNOWN_FIELD_SET_LITE_SCHEMA;
+  }
+
+  private static UnknownFieldSchema<?, ?> getUnknownFieldSetSchema(boolean proto3) {
+    try {
+      Class<?> clz = getUnknownFieldSetSchemaClass();
+      if (clz == null) {
+        return null;
+      }
+      return (UnknownFieldSchema) clz.getConstructor(boolean.class).newInstance(proto3);
+    } catch (Throwable t) {
+      return null;
+    }
+  }
+
+  private static Class<?> getGeneratedMessageClass() {
+    try {
+      return Class.forName("com.google.protobuf.GeneratedMessageV3");
+    } catch (Throwable e) {
+      return null;
+    }
+  }
+
+  private static Class<?> getUnknownFieldSetSchemaClass() {
+    try {
+      return Class.forName("com.google.protobuf.UnknownFieldSetSchema");
+    } catch (Throwable e) {
+      return null;
+    }
+  }
+
+  static Object getMapDefaultEntry(Class<?> clazz, String name) {
+    try {
+      Class<?> holder =
+          Class.forName(clazz.getName() + "$" + toCamelCase(name, true) + "DefaultEntryHolder");
+      Field[] fields = holder.getDeclaredFields();
+      if (fields.length != 1) {
+        throw new IllegalStateException(
+            "Unable to look up map field default entry holder class for "
+                + name
+                + " in "
+                + clazz.getName());
+      }
+      return UnsafeUtil.getStaticObject(fields[0]);
+    } catch (Throwable t) {
+      throw new RuntimeException(t);
+    }
+  }
+
+  static String toCamelCase(String name, boolean capNext) {
+    StringBuilder sb = new StringBuilder();
+    for (int i = 0; i < name.length(); ++i) {
+      char c = name.charAt(i);
+      // Matches protoc field name function:
+      if ('a' <= c && c <= 'z') {
+        if (capNext) {
+          sb.append((char) (c + ('A' - 'a')));
+        } else {
+          sb.append(c);
+        }
+        capNext = false;
+      } else if ('A' <= c && c <= 'Z') {
+        if (i == 0 && !capNext) {
+          // Force first letter to lower-case unless explicitly told to capitalize it.
+          sb.append((char) (c - ('A' - 'a')));
+        } else {
+          sb.append(c);
+        }
+        capNext = false;
+      } else if ('0' <= c && c <= '9') {
+        sb.append(c);
+        capNext = true;
+      } else {
+        capNext = true;
+      }
+    }
+    return sb.toString();
+  }
+
+  /** Returns true if both are null or both are {@link Object#equals}. */
+  static boolean safeEquals(Object a, Object b) {
+    return a == b || (a != null && a.equals(b));
+  }
+
+  static <T> void mergeMap(MapFieldSchema mapFieldSchema, T message, T o, long offset) {
+    Object merged =
+        mapFieldSchema.mergeFrom(
+            UnsafeUtil.getObject(message, offset), UnsafeUtil.getObject(o, offset));
+    UnsafeUtil.putObject(message, offset, merged);
+  }
+
+  static <T, FT extends FieldDescriptorLite<FT>> void mergeExtensions(
+      ExtensionSchema<FT> schema, T message, T other) {
+    FieldSet<FT> otherExtensions = schema.getExtensions(other);
+    if (!otherExtensions.isEmpty()) {
+      FieldSet<FT> messageExtensions = schema.getMutableExtensions(message);
+      messageExtensions.mergeFrom(otherExtensions);
+    }
+  }
+
+  static <T, UT, UB> void mergeUnknownFields(
+      UnknownFieldSchema<UT, UB> schema, T message, T other) {
+    UT messageUnknowns = schema.getFromMessage(message);
+    UT otherUnknowns = schema.getFromMessage(other);
+    UT merged = schema.merge(messageUnknowns, otherUnknowns);
+    schema.setToMessage(message, merged);
+  }
+
+  /** Filters unrecognized enum values in a list. */
+  static <UT, UB> UB filterUnknownEnumList(
+      int number,
+      List<Integer> enumList,
+      EnumLiteMap<?> enumMap,
+      UB unknownFields,
+      UnknownFieldSchema<UT, UB> unknownFieldSchema) {
+    if (enumMap == null) {
+      return unknownFields;
+    }
+    // TODO(dweis): Specialize for IntArrayList to avoid boxing.
+    if (enumList instanceof RandomAccess) {
+      int writePos = 0;
+      int size = enumList.size();
+      for (int readPos = 0; readPos < size; ++readPos) {
+        int enumValue = enumList.get(readPos);
+        if (enumMap.findValueByNumber(enumValue) != null) {
+          if (readPos != writePos) {
+            enumList.set(writePos, enumValue);
+          }
+          ++writePos;
+        } else {
+          unknownFields = storeUnknownEnum(number, enumValue, unknownFields, unknownFieldSchema);
+        }
+      }
+      if (writePos != size) {
+        enumList.subList(writePos, size).clear();
+      }
+    } else {
+      for (Iterator<Integer> it = enumList.iterator(); it.hasNext(); ) {
+        int enumValue = it.next();
+        if (enumMap.findValueByNumber(enumValue) == null) {
+          unknownFields = storeUnknownEnum(number, enumValue, unknownFields, unknownFieldSchema);
+          it.remove();
+        }
+      }
+    }
+    return unknownFields;
+  }
+
+  /** Filters unrecognized enum values in a list. */
+  static <UT, UB> UB filterUnknownEnumList(
+      int number,
+      List<Integer> enumList,
+      EnumVerifier enumVerifier,
+      UB unknownFields,
+      UnknownFieldSchema<UT, UB> unknownFieldSchema) {
+    if (enumVerifier == null) {
+      return unknownFields;
+    }
+    // TODO(dweis): Specialize for IntArrayList to avoid boxing.
+    if (enumList instanceof RandomAccess) {
+      int writePos = 0;
+      int size = enumList.size();
+      for (int readPos = 0; readPos < size; ++readPos) {
+        int enumValue = enumList.get(readPos);
+        if (enumVerifier.isInRange(enumValue)) {
+          if (readPos != writePos) {
+            enumList.set(writePos, enumValue);
+          }
+          ++writePos;
+        } else {
+          unknownFields = storeUnknownEnum(number, enumValue, unknownFields, unknownFieldSchema);
+        }
+      }
+      if (writePos != size) {
+        enumList.subList(writePos, size).clear();
+      }
+    } else {
+      for (Iterator<Integer> it = enumList.iterator(); it.hasNext(); ) {
+        int enumValue = it.next();
+        if (!enumVerifier.isInRange(enumValue)) {
+          unknownFields = storeUnknownEnum(number, enumValue, unknownFields, unknownFieldSchema);
+          it.remove();
+        }
+      }
+    }
+    return unknownFields;
+  }
+
+  /** Stores an unrecognized enum value as an unknown value. */
+  static <UT, UB> UB storeUnknownEnum(
+      int number, int enumValue, UB unknownFields, UnknownFieldSchema<UT, UB> unknownFieldSchema) {
+    if (unknownFields == null) {
+      unknownFields = unknownFieldSchema.newBuilder();
+    }
+    unknownFieldSchema.addVarint(unknownFields, number, enumValue);
+    return unknownFields;
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/SmallSortedMap.java b/java/core/src/main/java/com/google/protobuf/SmallSortedMap.java
index 6bd65d6..546e56e 100644
--- a/java/core/src/main/java/com/google/protobuf/SmallSortedMap.java
+++ b/java/core/src/main/java/com/google/protobuf/SmallSortedMap.java
@@ -136,6 +136,8 @@
   // The EntrySet is a stateless view of the Map. It's initialized the first
   // time it is requested and reused henceforth.
   private volatile EntrySet lazyEntrySet;
+  private Map<K, V> overflowEntriesDescending;
+  private volatile DescendingEntrySet lazyDescendingEntrySet;
 
   /**
    * @code arraySize Size of the array in which the lexicographically smallest mappings are stored.
@@ -145,6 +147,7 @@
     this.maxArraySize = arraySize;
     this.entryList = Collections.emptyList();
     this.overflowEntries = Collections.emptyMap();
+    this.overflowEntriesDescending = Collections.emptyMap();
   }
 
   /** Make this map immutable from this point forward. */
@@ -158,6 +161,10 @@
           overflowEntries.isEmpty()
               ? Collections.<K, V>emptyMap()
               : Collections.unmodifiableMap(overflowEntries);
+      overflowEntriesDescending =
+          overflowEntriesDescending.isEmpty()
+              ? Collections.<K, V>emptyMap()
+              : Collections.unmodifiableMap(overflowEntriesDescending);
       isImmutable = true;
     }
   }
@@ -189,6 +196,11 @@
         : overflowEntries.entrySet();
   }
 
+  Iterable<Map.Entry<K, V>> getOverflowEntriesDescending() {
+    return overflowEntriesDescending.isEmpty()
+        ? EmptySet.<Map.Entry<K, V>>iterable()
+        : overflowEntriesDescending.entrySet();
+  }
 
   @Override
   public int size() {
@@ -344,6 +356,12 @@
     return lazyEntrySet;
   }
 
+  Set<Map.Entry<K, V>> descendingEntrySet() {
+    if (lazyDescendingEntrySet == null) {
+      lazyDescendingEntrySet = new DescendingEntrySet();
+    }
+    return lazyDescendingEntrySet;
+  }
 
   /** @throws UnsupportedOperationException if {@link #makeImmutable()} has has been called. */
   private void checkMutable() {
@@ -361,6 +379,7 @@
     checkMutable();
     if (overflowEntries.isEmpty() && !(overflowEntries instanceof TreeMap)) {
       overflowEntries = new TreeMap<K, V>();
+      overflowEntriesDescending = ((TreeMap<K, V>) overflowEntries).descendingMap();
     }
     return (SortedMap<K, V>) overflowEntries;
   }
@@ -501,6 +520,12 @@
     }
   }
 
+  private class DescendingEntrySet extends EntrySet {
+    @Override
+    public Iterator<java.util.Map.Entry<K, V>> iterator() {
+      return new DescendingEntryIterator();
+    }
+  }
 
   /**
    * Iterator implementation that switches from the entry array to the overflow entries
@@ -558,6 +583,46 @@
   }
 
   /**
+   * Reverse Iterator implementation that switches from the entry array to the overflow entries
+   * appropriately.
+   */
+  private class DescendingEntryIterator implements Iterator<Map.Entry<K, V>> {
+
+    private int pos = entryList.size();
+    private Iterator<Map.Entry<K, V>> lazyOverflowIterator;
+
+    @Override
+    public boolean hasNext() {
+      return (pos > 0 && pos <= entryList.size()) || getOverflowIterator().hasNext();
+    }
+
+    @Override
+    public Map.Entry<K, V> next() {
+      if (getOverflowIterator().hasNext()) {
+        return getOverflowIterator().next();
+      }
+      return entryList.get(--pos);
+    }
+
+    @Override
+    public void remove() {
+      throw new UnsupportedOperationException();
+    }
+
+    /**
+     * It is important to create the overflow iterator only after the array entries have been
+     * iterated over because the overflow entry set changes when the client calls remove() on the
+     * array entries, which invalidates any existing iterators.
+     */
+    private Iterator<Map.Entry<K, V>> getOverflowIterator() {
+      if (lazyOverflowIterator == null) {
+        lazyOverflowIterator = overflowEntriesDescending.entrySet().iterator();
+      }
+      return lazyOverflowIterator;
+    }
+  }
+
+  /**
    * Helper class that holds immutable instances of an Iterable/Iterator that we return when the
    * overflow entries is empty. This eliminates the creation of an Iterator object when there is
    * nothing to iterate over.
diff --git a/java/core/src/main/java/com/google/protobuf/StructuralMessageInfo.java b/java/core/src/main/java/com/google/protobuf/StructuralMessageInfo.java
new file mode 100755
index 0000000..a32b143
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/StructuralMessageInfo.java
@@ -0,0 +1,167 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.Internal.checkNotNull;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Information for the layout of a protobuf message class. This describes all of the fields
+ * contained within a message.
+ */
+@ExperimentalApi
+final class StructuralMessageInfo implements MessageInfo {
+  private final ProtoSyntax syntax;
+  private final boolean messageSetWireFormat;
+  private final int[] checkInitialized;
+  private final FieldInfo[] fields;
+  private final MessageLite defaultInstance;
+
+  /**
+   * Constructor.
+   *
+   * @param checkInitialized fields to check in isInitialized().
+   * @param fields the set of fields for the message, in field number order.
+   */
+  StructuralMessageInfo(
+      ProtoSyntax syntax,
+      boolean messageSetWireFormat,
+      int[] checkInitialized,
+      FieldInfo[] fields,
+      Object defaultInstance) {
+    this.syntax = syntax;
+    this.messageSetWireFormat = messageSetWireFormat;
+    this.checkInitialized = checkInitialized;
+    this.fields = fields;
+    this.defaultInstance = (MessageLite) checkNotNull(defaultInstance, "defaultInstance");
+  }
+
+  /** Gets the syntax for the message (e.g. PROTO2, PROTO3). */
+  @Override
+  public ProtoSyntax getSyntax() {
+    return syntax;
+  }
+
+  /** Indicates whether or not the message should be represented with message set wire format. */
+  @Override
+  public boolean isMessageSetWireFormat() {
+    return messageSetWireFormat;
+  }
+
+  /** An array of field numbers that need to be checked for isInitialized(). */
+  public int[] getCheckInitialized() {
+    return checkInitialized;
+  }
+
+  /**
+   * Gets the information for all fields within this message, sorted in ascending order by their
+   * field number.
+   */
+  public FieldInfo[] getFields() {
+    return fields;
+  }
+
+  @Override
+  public MessageLite getDefaultInstance() {
+    return defaultInstance;
+  }
+
+  /** Helper method for creating a new builder for {@link MessageInfo}. */
+  public static Builder newBuilder() {
+    return new Builder();
+  }
+
+  /** Helper method for creating a new builder for {@link MessageInfo}. */
+  public static Builder newBuilder(int numFields) {
+    return new Builder(numFields);
+  }
+
+  /** A builder of {@link MessageInfo} instances. */
+  public static final class Builder {
+    private final List<FieldInfo> fields;
+    private ProtoSyntax syntax;
+    private boolean wasBuilt;
+    private boolean messageSetWireFormat;
+    private int[] checkInitialized = null;
+    private Object defaultInstance;
+
+    public Builder() {
+      fields = new ArrayList<FieldInfo>();
+    }
+
+    public Builder(int numFields) {
+      fields = new ArrayList<FieldInfo>(numFields);
+    }
+
+    public void withDefaultInstance(Object defaultInstance) {
+      this.defaultInstance = defaultInstance;
+    }
+
+    public void withSyntax(ProtoSyntax syntax) {
+      this.syntax = checkNotNull(syntax, "syntax");
+    }
+
+    public void withMessageSetWireFormat(boolean messageSetWireFormat) {
+      this.messageSetWireFormat = messageSetWireFormat;
+    }
+
+    public void withCheckInitialized(int[] checkInitialized) {
+      this.checkInitialized = checkInitialized;
+    }
+
+    public void withField(FieldInfo field) {
+      if (wasBuilt) {
+        throw new IllegalStateException("Builder can only build once");
+      }
+      fields.add(field);
+    }
+
+    public StructuralMessageInfo build() {
+      if (wasBuilt) {
+        throw new IllegalStateException("Builder can only build once");
+      }
+      if (syntax == null) {
+        throw new IllegalStateException("Must specify a proto syntax");
+      }
+      wasBuilt = true;
+      Collections.sort(fields);
+      return new StructuralMessageInfo(
+          syntax,
+          messageSetWireFormat,
+          checkInitialized,
+          fields.toArray(new FieldInfo[0]),
+          defaultInstance);
+    }
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/TextFormat.java b/java/core/src/main/java/com/google/protobuf/TextFormat.java
index f00c812..2326a05 100644
--- a/java/core/src/main/java/com/google/protobuf/TextFormat.java
+++ b/java/core/src/main/java/com/google/protobuf/TextFormat.java
@@ -1247,6 +1247,18 @@
           SingularOverwritePolicy.ALLOW_SINGULAR_OVERWRITES;
       private TextFormatParseInfoTree.Builder parseInfoTreeBuilder = null;
 
+      /**
+       * Set whether this parser will allow unknown fields. By default, an exception is thrown if an
+       * unknown field is encountered. If this is set, the parser will only log a warning. Allow
+       * unknown fields will also allow unknown extensions.
+       *
+       * <p>Use of this parameter is discouraged which may hide some errors (e.g.
+       * spelling error on field name).
+       */
+      public Builder setAllowUnknownFields(boolean allowUnknownFields) {
+        this.allowUnknownFields = allowUnknownFields;
+        return this;
+      }
 
       /**
        * Set whether this parser will allow unknown extensions. By default, an
@@ -1448,14 +1460,15 @@
         extension = target.findExtensionByName(extensionRegistry, name.toString());
 
         if (extension == null) {
-          String message = (tokenizer.getPreviousLine() + 1)
-                           + ":"
-                           + (tokenizer.getPreviousColumn() + 1)
-                           + ":\t"
-                           + type.getFullName()
-                           + ".["
-                           + name
-                           + "]";
+          String message =
+              (tokenizer.getPreviousLine() + 1)
+                  + ":"
+                  + (tokenizer.getPreviousColumn() + 1)
+                  + ":\t"
+                  + type.getFullName()
+                  + ".["
+                  + name
+                  + "]";
           unknownFields.add(new UnknownField(message, UnknownField.Type.EXTENSION));
         } else {
           if (extension.descriptor.getContainingType() != type) {
@@ -1653,24 +1666,18 @@
           endToken = "}";
         }
 
-        Message defaultInstance = (extension == null) ? null : extension.defaultInstance;
-        MessageReflection.MergeTarget subField =
-            target.newMergeTargetForField(field, defaultInstance);
+          Message defaultInstance = (extension == null) ? null : extension.defaultInstance;
+          MessageReflection.MergeTarget subField =
+              target.newMergeTargetForField(field, defaultInstance);
 
-        while (!tokenizer.tryConsume(endToken)) {
-          if (tokenizer.atEnd()) {
-            throw tokenizer.parseException("Expected \"" + endToken + "\".");
+          while (!tokenizer.tryConsume(endToken)) {
+            if (tokenizer.atEnd()) {
+              throw tokenizer.parseException("Expected \"" + endToken + "\".");
+            }
+            mergeField(tokenizer, extensionRegistry, subField, parseTreeBuilder, unknownFields);
           }
-          mergeField(
-              tokenizer,
-              extensionRegistry,
-              subField,
-              parseTreeBuilder,
-              unknownFields);
-        }
 
-        value = subField.finish();
-
+          value = subField.finish();
       } else {
         switch (field.getType()) {
           case INT32:
@@ -1776,6 +1783,7 @@
       }
     }
 
+
     /** Skips the next field including the field's name and value. */
     private void skipField(Tokenizer tokenizer) throws ParseException {
       if (tokenizer.tryConsume("[")) {
diff --git a/java/core/src/main/java/com/google/protobuf/UnknownFieldSchema.java b/java/core/src/main/java/com/google/protobuf/UnknownFieldSchema.java
new file mode 100755
index 0000000..e736d5c
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/UnknownFieldSchema.java
@@ -0,0 +1,133 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+
+@ExperimentalApi
+abstract class UnknownFieldSchema<T, B> {
+
+  /** Whether unknown fields should be dropped. */
+  abstract boolean shouldDiscardUnknownFields(Reader reader);
+
+  /** Adds a varint value to the unknown fields. */
+  abstract void addVarint(B fields, int number, long value);
+
+  /** Adds a fixed32 value to the unknown fields. */
+  abstract void addFixed32(B fields, int number, int value);
+
+  /** Adds a fixed64 value to the unknown fields. */
+  abstract void addFixed64(B fields, int number, long value);
+
+  /** Adds a length delimited value to the unknown fields. */
+  abstract void addLengthDelimited(B fields, int number, ByteString value);
+
+  /** Adds a group value to the unknown fields. */
+  abstract void addGroup(B fields, int number, T subFieldSet);
+
+  /** Create a new builder for unknown fields. */
+  abstract B newBuilder();
+
+  /** Returns an immutable instance of the field container. */
+  abstract T toImmutable(B fields);
+
+  /**
+   * Sets the unknown fields into the message. Caller must take care of the mutability of the
+   * fields.
+   */
+  abstract void setToMessage(Object message, T fields);
+
+  /** Get the unknown fields from the message. */
+  abstract T getFromMessage(Object message);
+
+  /** Returns a builder for unknown fields in the message. */
+  abstract B getBuilderFromMessage(Object message);
+
+  /** Sets an unknown field builder into the message. */
+  abstract void setBuilderToMessage(Object message, B builder);
+
+  /** Marks unknown fields as immutable. */
+  abstract void makeImmutable(Object message);
+
+  /** Merges one field into the unknown fields. */
+  final boolean mergeOneFieldFrom(B unknownFields, Reader reader) throws IOException {
+    int tag = reader.getTag();
+    int fieldNumber = WireFormat.getTagFieldNumber(tag);
+    switch (WireFormat.getTagWireType(tag)) {
+      case WireFormat.WIRETYPE_VARINT:
+        addVarint(unknownFields, fieldNumber, reader.readInt64());
+        return true;
+      case WireFormat.WIRETYPE_FIXED32:
+        addFixed32(unknownFields, fieldNumber, reader.readFixed32());
+        return true;
+      case WireFormat.WIRETYPE_FIXED64:
+        addFixed64(unknownFields, fieldNumber, reader.readFixed64());
+        return true;
+      case WireFormat.WIRETYPE_LENGTH_DELIMITED:
+        addLengthDelimited(unknownFields, fieldNumber, reader.readBytes());
+        return true;
+      case WireFormat.WIRETYPE_START_GROUP:
+        final B subFields = newBuilder();
+        int endGroupTag = WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP);
+        mergeFrom(subFields, reader);
+        if (endGroupTag != reader.getTag()) {
+          throw InvalidProtocolBufferException.invalidEndTag();
+        }
+        addGroup(unknownFields, fieldNumber, toImmutable(subFields));
+        return true;
+      case WireFormat.WIRETYPE_END_GROUP:
+        return false;
+      default:
+        throw InvalidProtocolBufferException.invalidWireType();
+    }
+  }
+
+  final void mergeFrom(B unknownFields, Reader reader) throws IOException {
+    while (true) {
+      if (reader.getFieldNumber() == Reader.READ_DONE
+          || !mergeOneFieldFrom(unknownFields, reader)) {
+        break;
+      }
+    }
+  }
+
+  abstract void writeTo(T unknownFields, Writer writer) throws IOException;
+
+  abstract void writeAsMessageSetTo(T unknownFields, Writer writer) throws IOException;
+
+  /** Merges {@code source} into {@code destination} and returns the merged instance. */
+  abstract T merge(T destination, T source);
+
+  /** Get the serialized size for message set serialization. */
+  abstract int getSerializedSizeAsMessageSet(T message);
+
+  abstract int getSerializedSize(T unknowns);
+}
diff --git a/java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java b/java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java
index 39deec0..bde1303 100644
--- a/java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java
+++ b/java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java
@@ -59,6 +59,7 @@
 
   private UnknownFieldSet() {
     fields = null;
+    fieldsDescending = null;
   }
 
   /** Create a new {@link Builder}. */
@@ -90,10 +91,14 @@
    */
   UnknownFieldSet(final Map<Integer, Field> fields, final Map<Integer, Field> fieldsDescending) {
     this.fields = fields;
+    this.fieldsDescending = fieldsDescending;
   }
 
   private final Map<Integer, Field> fields;
 
+  /** A copy of {@link #fields} who's iterator order is reversed. */
+  private final Map<Integer, Field> fieldsDescending;
+
 
   @Override
   public boolean equals(final Object other) {
@@ -212,6 +217,35 @@
     }
   }
 
+  /** Serializes the set and writes it to {@code writer}. */
+  void writeTo(Writer writer) throws IOException {
+    if (writer.fieldOrder() == Writer.FieldOrder.DESCENDING) {
+      // Write fields in descending order.
+      for (Map.Entry<Integer, Field> entry : fieldsDescending.entrySet()) {
+        entry.getValue().writeTo(entry.getKey(), writer);
+      }
+    } else {
+      // Write fields in ascending order.
+      for (Map.Entry<Integer, Field> entry : fields.entrySet()) {
+        entry.getValue().writeTo(entry.getKey(), writer);
+      }
+    }
+  }
+
+  /** Serializes the set and writes it to {@code writer} using {@code MessageSet} wire format. */
+  void writeAsMessageSetTo(final Writer writer) throws IOException {
+    if (writer.fieldOrder() == Writer.FieldOrder.DESCENDING) {
+      // Write fields in descending order.
+      for (final Map.Entry<Integer, Field> entry : fieldsDescending.entrySet()) {
+        entry.getValue().writeAsMessageSetExtensionTo(entry.getKey(), writer);
+      }
+    } else {
+      // Write fields in ascending order.
+      for (final Map.Entry<Integer, Field> entry : fields.entrySet()) {
+        entry.getValue().writeAsMessageSetExtensionTo(entry.getKey(), writer);
+      }
+    }
+  }
 
   /** Get the number of bytes required to encode this set using {@code MessageSet} wire format. */
   public int getSerializedSizeAsMessageSet() {
@@ -328,6 +362,8 @@
         result = getDefaultInstance();
       } else {
         Map<Integer, Field> descendingFields = null;
+        descendingFields =
+            Collections.unmodifiableMap(((TreeMap<Integer, Field>) fields).descendingMap());
         result = new UnknownFieldSet(Collections.unmodifiableMap(fields), descendingFields);
       }
       fields = null;
@@ -344,6 +380,8 @@
     public Builder clone() {
       getFieldBuilder(0); // Force lastField to be built.
       Map<Integer, Field> descendingFields = null;
+      descendingFields =
+          Collections.unmodifiableMap(((TreeMap<Integer, Field>) fields).descendingMap());
       return UnknownFieldSet.newBuilder().mergeFrom(new UnknownFieldSet(fields, descendingFields));
     }
 
@@ -808,6 +846,47 @@
       }
     }
 
+    /** Serializes the field, including field number, and writes it to {@code writer}. */
+    void writeTo(final int fieldNumber, final Writer writer) throws IOException {
+      writer.writeInt64List(fieldNumber, varint, false);
+      writer.writeFixed32List(fieldNumber, fixed32, false);
+      writer.writeFixed64List(fieldNumber, fixed64, false);
+      writer.writeBytesList(fieldNumber, lengthDelimited);
+
+      if (writer.fieldOrder() == Writer.FieldOrder.ASCENDING) {
+        for (int i = 0; i < group.size(); i++) {
+          writer.writeStartGroup(fieldNumber);
+          group.get(i).writeTo(writer);
+          writer.writeEndGroup(fieldNumber);
+        }
+      } else {
+        for (int i = group.size() - 1; i >= 0; i--) {
+          writer.writeEndGroup(fieldNumber);
+          group.get(i).writeTo(writer);
+          writer.writeStartGroup(fieldNumber);
+        }
+      }
+    }
+
+    /**
+     * Serializes the field, including field number, and writes it to {@code writer}, using {@code
+     * MessageSet} wire format.
+     */
+    private void writeAsMessageSetExtensionTo(final int fieldNumber, final Writer writer)
+        throws IOException {
+      if (writer.fieldOrder() == Writer.FieldOrder.DESCENDING) {
+        // Write in descending field order.
+        ListIterator<ByteString> iter = lengthDelimited.listIterator(lengthDelimited.size());
+        while (iter.hasPrevious()) {
+          writer.writeMessageSetItem(fieldNumber, iter.previous());
+        }
+      } else {
+        // Write in ascending field order.
+        for (final ByteString value : lengthDelimited) {
+          writer.writeMessageSetItem(fieldNumber, value);
+        }
+      }
+    }
 
     /**
      * Get the number of bytes required to encode this field, including field number, using {@code
diff --git a/java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java b/java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java
index 7c5ec6e..2f6315c 100644
--- a/java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java
+++ b/java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java
@@ -168,6 +168,72 @@
     }
   }
 
+  /** Serializes the set and writes it to {@code writer} using {@code MessageSet} wire format. */
+  void writeAsMessageSetTo(Writer writer) throws IOException {
+    if (writer.fieldOrder() == Writer.FieldOrder.DESCENDING) {
+      // Write fields in descending order.
+      for (int i = count - 1; i >= 0; i--) {
+        int fieldNumber = WireFormat.getTagFieldNumber(tags[i]);
+        writer.writeMessageSetItem(fieldNumber, objects[i]);
+      }
+    } else {
+      // Write fields in ascending order.
+      for (int i = 0; i < count; i++) {
+        int fieldNumber = WireFormat.getTagFieldNumber(tags[i]);
+        writer.writeMessageSetItem(fieldNumber, objects[i]);
+      }
+    }
+  }
+
+  /** Serializes the set and writes it to {@code writer}. */
+  public void writeTo(Writer writer) throws IOException {
+    if (count == 0) {
+      return;
+    }
+
+    // TODO: tags are not sorted, so there's no write order guarantees
+    if (writer.fieldOrder() == Writer.FieldOrder.ASCENDING) {
+      for (int i = 0; i < count; ++i) {
+        writeField(tags[i], objects[i], writer);
+      }
+    } else {
+      for (int i = count - 1; i >= 0; --i) {
+        writeField(tags[i], objects[i], writer);
+      }
+    }
+  }
+
+  private static void writeField(int tag, Object object, Writer writer) throws IOException {
+    int fieldNumber = WireFormat.getTagFieldNumber(tag);
+    switch (WireFormat.getTagWireType(tag)) {
+      case WireFormat.WIRETYPE_VARINT:
+        writer.writeInt64(fieldNumber, (Long) object);
+        break;
+      case WireFormat.WIRETYPE_FIXED32:
+        writer.writeFixed32(fieldNumber, (Integer) object);
+        break;
+      case WireFormat.WIRETYPE_FIXED64:
+        writer.writeFixed64(fieldNumber, (Long) object);
+        break;
+      case WireFormat.WIRETYPE_LENGTH_DELIMITED:
+        writer.writeBytes(fieldNumber, (ByteString) object);
+        break;
+      case WireFormat.WIRETYPE_START_GROUP:
+        if (writer.fieldOrder() == Writer.FieldOrder.ASCENDING) {
+          writer.writeStartGroup(fieldNumber);
+          ((UnknownFieldSetLite) object).writeTo(writer);
+          writer.writeEndGroup(fieldNumber);
+        } else {
+          writer.writeEndGroup(fieldNumber);
+          ((UnknownFieldSetLite) object).writeTo(writer);
+          writer.writeStartGroup(fieldNumber);
+        }
+        break;
+      default:
+        // TODO(liujisi): Change writeTo to throw IOException?
+        throw new RuntimeException(InvalidProtocolBufferException.invalidWireType());
+    }
+  }
 
   /**
    * Get the number of bytes required to encode this field, including field number, using {@code
diff --git a/java/core/src/main/java/com/google/protobuf/UnknownFieldSetLiteSchema.java b/java/core/src/main/java/com/google/protobuf/UnknownFieldSetLiteSchema.java
new file mode 100755
index 0000000..ffd7232
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/UnknownFieldSetLiteSchema.java
@@ -0,0 +1,140 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+
+class UnknownFieldSetLiteSchema
+    extends UnknownFieldSchema<UnknownFieldSetLite, UnknownFieldSetLite> {
+
+  UnknownFieldSetLiteSchema() {}
+
+  @Override
+  boolean shouldDiscardUnknownFields(Reader reader) {
+    // We never drop unknown fields in lite.
+    return false;
+  }
+
+  @Override
+  UnknownFieldSetLite newBuilder() {
+    return UnknownFieldSetLite.newInstance();
+  }
+
+  @Override
+  void addVarint(UnknownFieldSetLite fields, int number, long value) {
+    fields.storeField(WireFormat.makeTag(number, WireFormat.WIRETYPE_VARINT), value);
+  }
+
+  @Override
+  void addFixed32(UnknownFieldSetLite fields, int number, int value) {
+    fields.storeField(WireFormat.makeTag(number, WireFormat.WIRETYPE_FIXED32), value);
+  }
+
+  @Override
+  void addFixed64(UnknownFieldSetLite fields, int number, long value) {
+    fields.storeField(WireFormat.makeTag(number, WireFormat.WIRETYPE_FIXED64), value);
+  }
+
+  @Override
+  void addLengthDelimited(UnknownFieldSetLite fields, int number, ByteString value) {
+    fields.storeField(WireFormat.makeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED), value);
+  }
+
+  @Override
+  void addGroup(UnknownFieldSetLite fields, int number, UnknownFieldSetLite subFieldSet) {
+    fields.storeField(WireFormat.makeTag(number, WireFormat.WIRETYPE_START_GROUP), subFieldSet);
+  }
+
+  @Override
+  UnknownFieldSetLite toImmutable(UnknownFieldSetLite fields) {
+    fields.makeImmutable();
+    return fields;
+  }
+
+  @Override
+  void setToMessage(Object message, UnknownFieldSetLite fields) {
+    ((GeneratedMessageLite<?, ?>) message).unknownFields = fields;
+  }
+
+  @Override
+  UnknownFieldSetLite getFromMessage(Object message) {
+    return ((GeneratedMessageLite<?, ?>) message).unknownFields;
+  }
+
+  @Override
+  UnknownFieldSetLite getBuilderFromMessage(Object message) {
+    UnknownFieldSetLite unknownFields = getFromMessage(message);
+    // When parsing into a lite message object, its UnknownFieldSet is either the default instance
+    // or mutable. It can't be in a state where it's immutable but not default instance.
+    if (unknownFields == UnknownFieldSetLite.getDefaultInstance()) {
+      unknownFields = UnknownFieldSetLite.newInstance();
+      setToMessage(message, unknownFields);
+    }
+    return unknownFields;
+  }
+
+  @Override
+  void setBuilderToMessage(Object message, UnknownFieldSetLite fields) {
+    setToMessage(message, fields);
+  }
+
+  @Override
+  void makeImmutable(Object message) {
+    getFromMessage(message).makeImmutable();
+  }
+
+  @Override
+  void writeTo(UnknownFieldSetLite fields, Writer writer) throws IOException {
+    fields.writeTo(writer);
+  }
+
+  @Override
+  void writeAsMessageSetTo(UnknownFieldSetLite fields, Writer writer) throws IOException {
+    fields.writeAsMessageSetTo(writer);
+  }
+
+  @Override
+  UnknownFieldSetLite merge(UnknownFieldSetLite message, UnknownFieldSetLite other) {
+    return other.equals(UnknownFieldSetLite.getDefaultInstance())
+        ? message
+        : UnknownFieldSetLite.mutableCopyOf(message, other);
+  }
+
+  @Override
+  int getSerializedSize(UnknownFieldSetLite unknowns) {
+    return unknowns.getSerializedSize();
+  }
+
+  @Override
+  int getSerializedSizeAsMessageSet(UnknownFieldSetLite unknowns) {
+    return unknowns.getSerializedSizeAsMessageSet();
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/UnknownFieldSetSchema.java b/java/core/src/main/java/com/google/protobuf/UnknownFieldSetSchema.java
new file mode 100755
index 0000000..b838c4b
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/UnknownFieldSetSchema.java
@@ -0,0 +1,132 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+
+class UnknownFieldSetSchema extends UnknownFieldSchema<UnknownFieldSet, UnknownFieldSet.Builder> {
+
+  private final boolean proto3;
+
+  public UnknownFieldSetSchema(boolean proto3) {
+    this.proto3 = proto3;
+  }
+
+  @Override
+  boolean shouldDiscardUnknownFields(Reader reader) {
+    return reader.shouldDiscardUnknownFields();
+  }
+
+  @Override
+  UnknownFieldSet.Builder newBuilder() {
+    return UnknownFieldSet.newBuilder();
+  }
+
+  @Override
+  void addVarint(UnknownFieldSet.Builder fields, int number, long value) {
+    fields.mergeField(number, UnknownFieldSet.Field.newBuilder().addVarint(value).build());
+  }
+
+  @Override
+  void addFixed32(UnknownFieldSet.Builder fields, int number, int value) {
+    fields.mergeField(number, UnknownFieldSet.Field.newBuilder().addFixed32(value).build());
+  }
+
+  @Override
+  void addFixed64(UnknownFieldSet.Builder fields, int number, long value) {
+    fields.mergeField(number, UnknownFieldSet.Field.newBuilder().addFixed64(value).build());
+  }
+
+  @Override
+  void addLengthDelimited(UnknownFieldSet.Builder fields, int number, ByteString value) {
+    fields.mergeField(number, UnknownFieldSet.Field.newBuilder().addLengthDelimited(value).build());
+  }
+
+  @Override
+  void addGroup(UnknownFieldSet.Builder fields, int number, UnknownFieldSet subFieldSet) {
+    fields.mergeField(number, UnknownFieldSet.Field.newBuilder().addGroup(subFieldSet).build());
+  }
+
+  @Override
+  UnknownFieldSet toImmutable(UnknownFieldSet.Builder fields) {
+    return fields.build();
+  }
+
+  @Override
+  void writeTo(UnknownFieldSet message, Writer writer) throws IOException {
+    message.writeTo(writer);
+  }
+
+  @Override
+  void writeAsMessageSetTo(UnknownFieldSet message, Writer writer) throws IOException {
+    message.writeAsMessageSetTo(writer);
+  }
+
+  @Override
+  UnknownFieldSet getFromMessage(Object message) {
+    return ((GeneratedMessageV3) message).unknownFields;
+  }
+
+  @Override
+  void setToMessage(Object message, UnknownFieldSet fields) {
+    ((GeneratedMessageV3) message).unknownFields = fields;
+  }
+
+  @Override
+  UnknownFieldSet.Builder getBuilderFromMessage(Object message) {
+    return ((GeneratedMessageV3) message).unknownFields.toBuilder();
+  }
+
+  @Override
+  void setBuilderToMessage(Object message, UnknownFieldSet.Builder builder) {
+    ((GeneratedMessageV3) message).unknownFields = builder.build();
+  }
+
+  @Override
+  void makeImmutable(Object message) {
+    // Already immutable.
+  }
+
+  @Override
+  UnknownFieldSet merge(UnknownFieldSet message, UnknownFieldSet other) {
+    return message.toBuilder().mergeFrom(other).build();
+  }
+
+  @Override
+  int getSerializedSize(UnknownFieldSet message) {
+    return message.getSerializedSize();
+  }
+
+  @Override
+  int getSerializedSizeAsMessageSet(UnknownFieldSet unknowns) {
+    return unknowns.getSerializedSizeAsMessageSet();
+  }
+}
diff --git a/java/core/src/main/java/com/google/protobuf/Utf8.java b/java/core/src/main/java/com/google/protobuf/Utf8.java
index 9fe1383..104ab09 100644
--- a/java/core/src/main/java/com/google/protobuf/Utf8.java
+++ b/java/core/src/main/java/com/google/protobuf/Utf8.java
@@ -794,7 +794,7 @@
       // if it occurs.
       try {
         // Designed to take advantage of
-        // https://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination
+        // https://wiki.openjdk.java.net/display/HotSpotInternals/RangeCheckElimination
         for (char c; inIx < inLength && (c = in.charAt(inIx)) < 0x80; ++inIx) {
           out.put(outIx + inIx, (byte) c);
         }
@@ -1041,7 +1041,7 @@
       int i = 0;
       int limit = offset + length;
       // Designed to take advantage of
-      // https://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination
+      // https://wiki.openjdk.java.net/display/HotSpotInternals/RangeCheckElimination
       for (char c; i < utf16Length && i + j < limit && (c = in.charAt(i)) < 0x80; i++) {
         out[j + i] = (byte) c;
       }
@@ -1527,7 +1527,7 @@
       }
 
       // Designed to take advantage of
-      // https://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination
+      // https://wiki.openjdk.java.net/display/HotSpotInternals/RangeCheckElimination
       int inIx = 0;
       for (char c; inIx < inLimit && (c = in.charAt(inIx)) < 0x80; ++inIx) {
         UnsafeUtil.putByte(out, outIx++, (byte) c);
@@ -1589,7 +1589,7 @@
       }
 
       // Designed to take advantage of
-      // https://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination
+      // https://wiki.openjdk.java.net/display/HotSpotInternals/RangeCheckElimination
       int inIx = 0;
       for (char c; inIx < inLimit && (c = in.charAt(inIx)) < 0x80; ++inIx) {
         UnsafeUtil.putByte(outIx++, (byte) c);
diff --git a/java/core/src/main/java/com/google/protobuf/Writer.java b/java/core/src/main/java/com/google/protobuf/Writer.java
new file mode 100755
index 0000000..3f95c32
--- /dev/null
+++ b/java/core/src/main/java/com/google/protobuf/Writer.java
@@ -0,0 +1,219 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/** A writer that performs serialization of protobuf message fields. */
+@ExperimentalApi
+interface Writer {
+
+  /** The order in which the fields are written by a {@link Writer}. */
+  enum FieldOrder {
+    /** Fields are written in ascending order by field number. */
+    ASCENDING,
+
+    /** Fields are written in descending order by field number. */
+    DESCENDING
+  }
+
+  /** Indicates the order in which the fields are written by this {@link Writer}. */
+  FieldOrder fieldOrder();
+
+  /** Writes a field of type {@link FieldType#SFIXED32}. */
+  void writeSFixed32(int fieldNumber, int value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#INT64}. */
+  void writeInt64(int fieldNumber, long value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#SFIXED64}. */
+  void writeSFixed64(int fieldNumber, long value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#FLOAT}. */
+  void writeFloat(int fieldNumber, float value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#DOUBLE}. */
+  void writeDouble(int fieldNumber, double value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#ENUM}. */
+  void writeEnum(int fieldNumber, int value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#UINT64}. */
+  void writeUInt64(int fieldNumber, long value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#INT32}. */
+  void writeInt32(int fieldNumber, int value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#FIXED64}. */
+  void writeFixed64(int fieldNumber, long value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#FIXED32}. */
+  void writeFixed32(int fieldNumber, int value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#BOOL}. */
+  void writeBool(int fieldNumber, boolean value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#STRING}. */
+  void writeString(int fieldNumber, String value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#BYTES}. */
+  void writeBytes(int fieldNumber, ByteString value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#UINT32}. */
+  void writeUInt32(int fieldNumber, int value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#SINT32}. */
+  void writeSInt32(int fieldNumber, int value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#SINT64}. */
+  void writeSInt64(int fieldNumber, long value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#MESSAGE}. */
+  void writeMessage(int fieldNumber, Object value) throws IOException;
+
+  /** Writes a field of type {@link FieldType#MESSAGE}. */
+  void writeMessage(int fieldNumber, Object value, Schema schema) throws IOException;
+
+  /**
+   * Writes a field of type {@link FieldType#GROUP}.
+   *
+   * @deprecated groups fields are deprecated.
+   */
+  @Deprecated
+  void writeGroup(int fieldNumber, Object value) throws IOException;
+
+  /**
+   * Writes a field of type {@link FieldType#GROUP}.
+   *
+   * @deprecated groups fields are deprecated.
+   */
+  @Deprecated
+  void writeGroup(int fieldNumber, Object value, Schema schema) throws IOException;
+
+  /**
+   * Writes a single start group tag.
+   *
+   * @deprecated groups fields are deprecated.
+   */
+  @Deprecated
+  void writeStartGroup(int fieldNumber) throws IOException;
+
+  /**
+   * Writes a single end group tag.
+   *
+   * @deprecated groups fields are deprecated.
+   */
+  @Deprecated
+  void writeEndGroup(int fieldNumber) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#INT32}. */
+  void writeInt32List(int fieldNumber, List<Integer> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#FIXED32}. */
+  void writeFixed32List(int fieldNumber, List<Integer> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#INT64}. */
+  void writeInt64List(int fieldNumber, List<Long> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#UINT64}. */
+  void writeUInt64List(int fieldNumber, List<Long> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#FIXED64}. */
+  void writeFixed64List(int fieldNumber, List<Long> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#FLOAT}. */
+  void writeFloatList(int fieldNumber, List<Float> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#DOUBLE}. */
+  void writeDoubleList(int fieldNumber, List<Double> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#ENUM}. */
+  void writeEnumList(int fieldNumber, List<Integer> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#BOOL}. */
+  void writeBoolList(int fieldNumber, List<Boolean> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#STRING}. */
+  void writeStringList(int fieldNumber, List<String> value) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#BYTES}. */
+  void writeBytesList(int fieldNumber, List<ByteString> value) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#UINT32}. */
+  void writeUInt32List(int fieldNumber, List<Integer> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#SFIXED32}. */
+  void writeSFixed32List(int fieldNumber, List<Integer> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#SFIXED64}. */
+  void writeSFixed64List(int fieldNumber, List<Long> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#SINT32}. */
+  void writeSInt32List(int fieldNumber, List<Integer> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#SINT64}. */
+  void writeSInt64List(int fieldNumber, List<Long> value, boolean packed) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#MESSAGE}. */
+  void writeMessageList(int fieldNumber, List<?> value) throws IOException;
+
+  /** Writes a list field of type {@link FieldType#MESSAGE}. */
+  void writeMessageList(int fieldNumber, List<?> value, Schema schema) throws IOException;
+
+  /**
+   * Writes a list field of type {@link FieldType#GROUP}.
+   *
+   * @deprecated groups fields are deprecated.
+   */
+  @Deprecated
+  void writeGroupList(int fieldNumber, List<?> value) throws IOException;
+
+  /**
+   * Writes a list field of type {@link FieldType#GROUP}.
+   *
+   * @deprecated groups fields are deprecated.
+   */
+  @Deprecated
+  void writeGroupList(int fieldNumber, List<?> value, Schema schema) throws IOException;
+
+  /**
+   * Writes a message field in {@code MessageSet} wire-format.
+   *
+   * @param value A message instance or an opaque {@link ByteString} for an unknown field.
+   */
+  void writeMessageSetItem(int fieldNumber, Object value) throws IOException;
+
+  /** Writes a map field. */
+  <K, V> void writeMap(int fieldNumber, MapEntryLite.Metadata<K, V> metadata, Map<K, V> map)
+      throws IOException;
+}
diff --git a/java/core/src/test/java/com/google/protobuf/AbstractProto2LiteSchemaTest.java b/java/core/src/test/java/com/google/protobuf/AbstractProto2LiteSchemaTest.java
new file mode 100755
index 0000000..5d3fd3b
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/AbstractProto2LiteSchemaTest.java
@@ -0,0 +1,199 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+
+import com.google.protobuf.testing.Proto2TestingLite.Proto2EmptyLite;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite.TestEnum;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLiteWithMaps;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
+import org.junit.Test;
+
+/** Base class for tests using {@link Proto2MessageLite}. */
+public abstract class AbstractProto2LiteSchemaTest extends AbstractSchemaTest<Proto2MessageLite> {
+
+  @Override
+  protected Proto2MessageLiteFactory messageFactory() {
+    return new Proto2MessageLiteFactory(10, 20, 2, 2);
+  }
+
+  @Test
+  public void mergeOptionalMessageFields() throws Exception {
+    Proto2MessageLite message1 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().setFieldInt643(123).clearFieldInt325().build())
+            .build();
+    Proto2MessageLite message2 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().clearFieldInt643().setFieldInt325(456).build())
+            .build();
+    Proto2MessageLite message3 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().setFieldInt643(789).clearFieldInt325().build())
+            .build();
+    ByteArrayOutputStream output = new ByteArrayOutputStream();
+    message1.writeTo(output);
+    message2.writeTo(output);
+    message3.writeTo(output);
+    byte[] data = output.toByteArray();
+
+    Proto2MessageLite merged =
+        ExperimentalSerializationUtil.fromByteArray(data, Proto2MessageLite.class);
+    assertEquals(789, merged.getFieldMessage10().getFieldInt643());
+    assertEquals(456, merged.getFieldMessage10().getFieldInt325());
+  }
+
+  @Test
+  public void oneofFieldsShouldRoundtrip() throws IOException {
+    roundtrip("Field 53", newBuilder().setFieldDouble53(100).build());
+    roundtrip("Field 54", newBuilder().setFieldFloat54(100).build());
+    roundtrip("Field 55", newBuilder().setFieldInt6455(100).build());
+    roundtrip("Field 56", newBuilder().setFieldUint6456(100L).build());
+    roundtrip("Field 57", newBuilder().setFieldInt3257(100).build());
+    roundtrip("Field 58", newBuilder().setFieldFixed6458(100).build());
+    roundtrip("Field 59", newBuilder().setFieldFixed3259(100).build());
+    roundtrip("Field 60", newBuilder().setFieldBool60(true).build());
+    roundtrip("Field 61", newBuilder().setFieldString61(data().getString()).build());
+    roundtrip(
+        "Field 62", newBuilder().setFieldMessage62(newBuilder().setFieldDouble1(100)).build());
+    roundtrip("Field 63", newBuilder().setFieldBytes63(data().getBytes()).build());
+    roundtrip("Field 64", newBuilder().setFieldUint3264(100).build());
+    roundtrip("Field 65", newBuilder().setFieldSfixed3265(100).build());
+    roundtrip("Field 66", newBuilder().setFieldSfixed6466(100).build());
+    roundtrip("Field 67", newBuilder().setFieldSint3267(100).build());
+    roundtrip("Field 68", newBuilder().setFieldSint6468(100).build());
+    roundtrip(
+        "Field 69",
+        newBuilder()
+            .setFieldGroup69(
+                Proto2MessageLite.FieldGroup69.newBuilder().setFieldInt3270(data().getInt()))
+            .build());
+  }
+
+  private Proto2MessageLite.Builder newBuilder() {
+    return messageFactory().newMessage().toBuilder();
+  }
+
+  @Override
+  protected List<Proto2MessageLite> newMessagesMissingRequiredFields() {
+    return messageFactory().newMessagesMissingRequiredFields();
+  }
+
+  @Test
+  public void mapsShouldRoundtrip() throws IOException {
+    roundtrip(
+        "Proto2MessageLiteWithMaps",
+        new Proto2MessageLiteFactory(2, 10, 2, 2).newMessageWithMaps(),
+        Protobuf.getInstance().schemaFor(Proto2MessageLiteWithMaps.class));
+  }
+
+  @Test
+  public void unknownFieldsUnrecognized() throws Exception {
+    Proto2MessageLite expectedMessage = messageFactory().newMessage();
+    byte[] serializedBytes = expectedMessage.toByteArray();
+    Proto2EmptyLite empty =
+        ExperimentalSerializationUtil.fromByteArray(serializedBytes, Proto2EmptyLite.class);
+
+    // Merge serialized bytes into an empty message, then reserialize and merge it to a new
+    // Proto2Message. Make sure the two messages equal.
+    byte[] roundtripBytes = ExperimentalSerializationUtil.toByteArray(empty);
+    Proto2MessageLite roundtripMessage =
+        ExperimentalSerializationUtil.fromByteArray(roundtripBytes, Proto2MessageLite.class);
+    assertEquals(expectedMessage, roundtripMessage);
+  }
+
+  @Test
+  public void unknownEnum() throws IOException {
+    // Use unknown fields to hold invalid enum values.
+    UnknownFieldSetLite unknowns = UnknownFieldSetLite.newInstance();
+    final int outOfRange = 1000;
+    assertNull(TestEnum.forNumber(outOfRange));
+    unknowns.storeField(
+        WireFormat.makeTag(
+            Proto2MessageLite.FIELD_ENUM_13_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) outOfRange);
+    unknowns.storeField(
+        WireFormat.makeTag(
+            Proto2MessageLite.FIELD_ENUM_LIST_30_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) TestEnum.ONE_VALUE);
+    unknowns.storeField(
+        WireFormat.makeTag(
+            Proto2MessageLite.FIELD_ENUM_LIST_30_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) outOfRange);
+    unknowns.storeField(
+        WireFormat.makeTag(
+            Proto2MessageLite.FIELD_ENUM_LIST_30_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) TestEnum.TWO_VALUE);
+
+    {
+      // Construct a packed enum list.
+      int packedSize =
+          CodedOutputStream.computeUInt32SizeNoTag(TestEnum.ONE_VALUE)
+              + CodedOutputStream.computeUInt32SizeNoTag(outOfRange)
+              + CodedOutputStream.computeUInt32SizeNoTag(TestEnum.ONE_VALUE);
+      ByteString.CodedBuilder packedBuilder = ByteString.newCodedBuilder(packedSize);
+      CodedOutputStream packedOut = packedBuilder.getCodedOutput();
+      packedOut.writeEnumNoTag(TestEnum.ONE_VALUE);
+      packedOut.writeEnumNoTag(outOfRange);
+      packedOut.writeEnumNoTag(TestEnum.TWO_VALUE);
+      unknowns.storeField(
+          WireFormat.makeTag(
+              Proto2MessageLite.FIELD_ENUM_LIST_PACKED_44_FIELD_NUMBER,
+              WireFormat.WIRETYPE_LENGTH_DELIMITED),
+          packedBuilder.build());
+    }
+    int size = unknowns.getSerializedSize();
+    byte[] output = new byte[size];
+    CodedOutputStream codedOutput = CodedOutputStream.newInstance(output);
+    unknowns.writeTo(codedOutput);
+    codedOutput.flush();
+
+    Proto2MessageLite parsed =
+        ExperimentalSerializationUtil.fromByteArray(output, Proto2MessageLite.class);
+    assertFalse("out-of-range singular enum should not be in message", parsed.hasFieldEnum13());
+    assertEquals(
+        "out-of-range repeated enum should not be in message", 2, parsed.getFieldEnumList30Count());
+    assertEquals(TestEnum.ONE, parsed.getFieldEnumList30(0));
+    assertEquals(TestEnum.TWO, parsed.getFieldEnumList30(1));
+    assertEquals(
+        "out-of-range packed repeated enum should not be in message",
+        2,
+        parsed.getFieldEnumListPacked44Count());
+    assertEquals(TestEnum.ONE, parsed.getFieldEnumListPacked44(0));
+    assertEquals(TestEnum.TWO, parsed.getFieldEnumListPacked44(1));
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/AbstractProto2SchemaTest.java b/java/core/src/test/java/com/google/protobuf/AbstractProto2SchemaTest.java
new file mode 100755
index 0000000..0c16818
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/AbstractProto2SchemaTest.java
@@ -0,0 +1,224 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+
+import com.google.protobuf.testing.Proto2Testing.Proto2Empty;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message.TestEnum;
+import com.google.protobuf.testing.Proto2Testing.Proto2MessageWithMaps;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
+import org.junit.Test;
+
+/** Base class for tests using {@link Proto2Message}. */
+public abstract class AbstractProto2SchemaTest extends AbstractSchemaTest<Proto2Message> {
+
+  @Override
+  protected Proto2MessageFactory messageFactory() {
+    return new Proto2MessageFactory(10, 20, 2, 2);
+  }
+
+  @Test
+  public void mergeOptionalMessageFields() throws Exception {
+    Proto2Message message1 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().setFieldInt643(123).clearFieldInt325().build())
+            .build();
+    Proto2Message message2 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().clearFieldInt643().setFieldInt325(456).build())
+            .build();
+    Proto2Message message3 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().setFieldInt643(789).clearFieldInt325().build())
+            .build();
+    ByteArrayOutputStream output = new ByteArrayOutputStream();
+    message1.writeTo(output);
+    message2.writeTo(output);
+    message3.writeTo(output);
+    byte[] data = output.toByteArray();
+
+    Proto2Message merged = ExperimentalSerializationUtil.fromByteArray(data, Proto2Message.class);
+    assertEquals(789, merged.getFieldMessage10().getFieldInt643());
+    assertEquals(456, merged.getFieldMessage10().getFieldInt325());
+  }
+
+  @Test
+  public void oneofFieldsShouldRoundtrip() throws IOException {
+    roundtrip("Field 53", newBuilder().setFieldDouble53(100).build());
+    roundtrip("Field 54", newBuilder().setFieldFloat54(100).build());
+    roundtrip("Field 55", newBuilder().setFieldInt6455(100).build());
+    roundtrip("Field 56", newBuilder().setFieldUint6456(100L).build());
+    roundtrip("Field 57", newBuilder().setFieldInt3257(100).build());
+    roundtrip("Field 58", newBuilder().setFieldFixed6458(100).build());
+    roundtrip("Field 59", newBuilder().setFieldFixed3259(100).build());
+    roundtrip("Field 60", newBuilder().setFieldBool60(true).build());
+    roundtrip("Field 61", newBuilder().setFieldString61(data().getString()).build());
+    roundtrip(
+        "Field 62", newBuilder().setFieldMessage62(newBuilder().setFieldDouble1(100)).build());
+    roundtrip("Field 63", newBuilder().setFieldBytes63(data().getBytes()).build());
+    roundtrip("Field 64", newBuilder().setFieldUint3264(100).build());
+    roundtrip("Field 65", newBuilder().setFieldSfixed3265(100).build());
+    roundtrip("Field 66", newBuilder().setFieldSfixed6466(100).build());
+    roundtrip("Field 67", newBuilder().setFieldSint3267(100).build());
+    roundtrip("Field 68", newBuilder().setFieldSint6468(100).build());
+    roundtrip(
+        "Field 69",
+        newBuilder()
+            .setFieldGroup69(
+                Proto2Message.FieldGroup69.newBuilder().setFieldInt3270(data().getInt()))
+            .build());
+  }
+
+  private Proto2Message.Builder newBuilder() {
+    return messageFactory().newMessage().toBuilder();
+  }
+
+  @Test
+  public void mapsShouldRoundtrip() throws IOException {
+    roundtrip(
+        "Proto2MessageWithMaps",
+        new Proto2MessageFactory(2, 10, 2, 2).newMessageWithMaps(),
+        Protobuf.getInstance().schemaFor(Proto2MessageWithMaps.class));
+  }
+
+  @Test
+  public void unknownFieldsUnrecognized() throws Exception {
+    Proto2Message expectedMessage = messageFactory().newMessage();
+    byte[] serializedBytes = expectedMessage.toByteArray();
+    Proto2Empty empty =
+        ExperimentalSerializationUtil.fromByteArray(serializedBytes, Proto2Empty.class);
+
+    // Merge serialized bytes into an empty message, then reserialize and merge it to a new
+    // Proto2Message. Make sure the two messages equal.
+    byte[] roundtripBytes = ExperimentalSerializationUtil.toByteArray(empty);
+    assertEquals(serializedBytes.length, roundtripBytes.length);
+    Proto2Message roundtripMessage =
+        ExperimentalSerializationUtil.fromByteArray(roundtripBytes, Proto2Message.class);
+    assertEquals(expectedMessage, roundtripMessage);
+  }
+
+  @Test
+  public void unknownEnum() throws IOException {
+    // Use unknown fields to hold invalid enum values.
+    UnknownFieldSetLite unknowns = UnknownFieldSetLite.newInstance();
+    final int outOfRange = 1000;
+    assertNull(TestEnum.forNumber(outOfRange));
+    unknowns.storeField(
+        WireFormat.makeTag(Proto2Message.FIELD_ENUM_13_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) outOfRange);
+    unknowns.storeField(
+        WireFormat.makeTag(
+            Proto2Message.FIELD_ENUM_LIST_30_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) TestEnum.ONE_VALUE);
+    unknowns.storeField(
+        WireFormat.makeTag(
+            Proto2Message.FIELD_ENUM_LIST_30_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) outOfRange);
+    unknowns.storeField(
+        WireFormat.makeTag(
+            Proto2Message.FIELD_ENUM_LIST_30_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) TestEnum.TWO_VALUE);
+
+    {
+      // Construct a packed enum list.
+      int packedSize =
+          CodedOutputStream.computeUInt32SizeNoTag(TestEnum.ONE_VALUE)
+              + CodedOutputStream.computeUInt32SizeNoTag(outOfRange)
+              + CodedOutputStream.computeUInt32SizeNoTag(TestEnum.ONE_VALUE);
+      ByteString.CodedBuilder packedBuilder = ByteString.newCodedBuilder(packedSize);
+      CodedOutputStream packedOut = packedBuilder.getCodedOutput();
+      packedOut.writeEnumNoTag(TestEnum.ONE_VALUE);
+      packedOut.writeEnumNoTag(outOfRange);
+      packedOut.writeEnumNoTag(TestEnum.TWO_VALUE);
+      unknowns.storeField(
+          WireFormat.makeTag(
+              Proto2Message.FIELD_ENUM_LIST_PACKED_44_FIELD_NUMBER,
+              WireFormat.WIRETYPE_LENGTH_DELIMITED),
+          packedBuilder.build());
+    }
+    int size = unknowns.getSerializedSize();
+    byte[] output = new byte[size];
+    CodedOutputStream codedOutput = CodedOutputStream.newInstance(output);
+    unknowns.writeTo(codedOutput);
+    codedOutput.flush();
+
+    Proto2Message parsed = ExperimentalSerializationUtil.fromByteArray(output, Proto2Message.class);
+    assertFalse("out-of-range singular enum should not be in message", parsed.hasFieldEnum13());
+    {
+      List<Long> singularEnum =
+          parsed
+              .getUnknownFields()
+              .getField(Proto2Message.FIELD_ENUM_13_FIELD_NUMBER)
+              .getVarintList();
+      assertEquals(1, singularEnum.size());
+      assertEquals((Long) (long) outOfRange, singularEnum.get(0));
+    }
+    {
+      List<Long> repeatedEnum =
+          parsed
+              .getUnknownFields()
+              .getField(Proto2Message.FIELD_ENUM_LIST_30_FIELD_NUMBER)
+              .getVarintList();
+      assertEquals(1, repeatedEnum.size());
+      assertEquals((Long) (long) outOfRange, repeatedEnum.get(0));
+    }
+    {
+      List<Long> packedRepeatedEnum =
+          parsed
+              .getUnknownFields()
+              .getField(Proto2Message.FIELD_ENUM_LIST_PACKED_44_FIELD_NUMBER)
+              .getVarintList();
+      assertEquals(1, packedRepeatedEnum.size());
+      assertEquals((Long) (long) outOfRange, packedRepeatedEnum.get(0));
+    }
+    assertEquals(
+        "out-of-range repeated enum should not be in message", 2, parsed.getFieldEnumList30Count());
+    assertEquals(TestEnum.ONE, parsed.getFieldEnumList30(0));
+    assertEquals(TestEnum.TWO, parsed.getFieldEnumList30(1));
+    assertEquals(
+        "out-of-range packed repeated enum should not be in message",
+        2,
+        parsed.getFieldEnumListPacked44Count());
+    assertEquals(TestEnum.ONE, parsed.getFieldEnumListPacked44(0));
+    assertEquals(TestEnum.TWO, parsed.getFieldEnumListPacked44(1));
+  }
+
+  @Override
+  protected List<Proto2Message> newMessagesMissingRequiredFields() {
+    return messageFactory().newMessagesMissingRequiredFields();
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/AbstractProto3LiteSchemaTest.java b/java/core/src/test/java/com/google/protobuf/AbstractProto3LiteSchemaTest.java
new file mode 100755
index 0000000..9cc04ec
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/AbstractProto3LiteSchemaTest.java
@@ -0,0 +1,143 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.protobuf.testing.Proto3TestingLite.Proto3EmptyLite;
+import com.google.protobuf.testing.Proto3TestingLite.Proto3MessageLite;
+import com.google.protobuf.testing.Proto3TestingLite.Proto3MessageLiteWithMaps;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+
+/** Base class for tests using {@link Proto3MessageLite}. */
+public abstract class AbstractProto3LiteSchemaTest extends AbstractSchemaTest<Proto3MessageLite> {
+  @Override
+  protected Proto3MessageLiteFactory messageFactory() {
+    return new Proto3MessageLiteFactory(10, 20, 2, 2);
+  }
+
+  @Override
+  protected List<ByteBuffer> serializedBytesWithInvalidUtf8() throws IOException {
+    List<ByteBuffer> invalidBytes = new ArrayList<>();
+    byte[] invalid = new byte[] {(byte) 0x80};
+    {
+      ByteBuffer buffer = ByteBuffer.allocate(100);
+      CodedOutputStream codedOutput = CodedOutputStream.newInstance(buffer);
+      codedOutput.writeByteArray(Proto3MessageLite.FIELD_STRING_9_FIELD_NUMBER, invalid);
+      codedOutput.flush();
+      buffer.flip();
+      invalidBytes.add(buffer);
+    }
+    {
+      ByteBuffer buffer = ByteBuffer.allocate(100);
+      CodedOutputStream codedOutput = CodedOutputStream.newInstance(buffer);
+      codedOutput.writeByteArray(Proto3MessageLite.FIELD_STRING_LIST_26_FIELD_NUMBER, invalid);
+      codedOutput.flush();
+      buffer.flip();
+      invalidBytes.add(buffer);
+    }
+    return invalidBytes;
+  }
+
+  @Test
+  public void mergeOptionalMessageFields() throws Exception {
+    Proto3MessageLite message1 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().setFieldInt643(123).clearFieldInt325().build())
+            .build();
+    Proto3MessageLite message2 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().clearFieldInt643().setFieldInt325(456).build())
+            .build();
+    Proto3MessageLite message3 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().setFieldInt643(789).clearFieldInt325().build())
+            .build();
+    ByteArrayOutputStream output = new ByteArrayOutputStream();
+    message1.writeTo(output);
+    message2.writeTo(output);
+    message3.writeTo(output);
+    byte[] data = output.toByteArray();
+
+    Proto3MessageLite merged =
+        ExperimentalSerializationUtil.fromByteArray(data, Proto3MessageLite.class);
+    assertEquals(789, merged.getFieldMessage10().getFieldInt643());
+    assertEquals(456, merged.getFieldMessage10().getFieldInt325());
+  }
+
+  @Test
+  public void oneofFieldsShouldRoundtrip() throws IOException {
+    roundtrip("Field 53", newBuilder().setFieldDouble53(100).build());
+    roundtrip("Field 54", newBuilder().setFieldFloat54(100).build());
+    roundtrip("Field 55", newBuilder().setFieldInt6455(100).build());
+    roundtrip("Field 56", newBuilder().setFieldUint6456(100L).build());
+    roundtrip("Field 57", newBuilder().setFieldInt3257(100).build());
+    roundtrip("Field 58", newBuilder().setFieldFixed6458(100).build());
+    roundtrip("Field 59", newBuilder().setFieldFixed3259(100).build());
+    roundtrip("Field 60", newBuilder().setFieldBool60(true).build());
+    roundtrip("Field 61", newBuilder().setFieldString61(data().getString()).build());
+    roundtrip(
+        "Field 62", newBuilder().setFieldMessage62(newBuilder().setFieldDouble1(100)).build());
+    roundtrip("Field 63", newBuilder().setFieldBytes63(data().getBytes()).build());
+    roundtrip("Field 64", newBuilder().setFieldUint3264(100).build());
+    roundtrip("Field 65", newBuilder().setFieldSfixed3265(100).build());
+    roundtrip("Field 66", newBuilder().setFieldSfixed6466(100).build());
+    roundtrip("Field 67", newBuilder().setFieldSint3267(100).build());
+    roundtrip("Field 68", newBuilder().setFieldSint6468(100).build());
+  }
+
+  @Test
+  public void retainUnknownFields() {
+    // Unknown fields are retained in lite runtime.
+    Proto3MessageLite expectedMessage = messageFactory().newMessage();
+    Proto3EmptyLite empty =
+        ExperimentalSerializationUtil.fromByteArray(
+            expectedMessage.toByteArray(), Proto3EmptyLite.class);
+    assertEquals(expectedMessage.getSerializedSize(), empty.getSerializedSize());
+  }
+
+  @Test
+  public void mapsShouldRoundtrip() throws IOException {
+    roundtrip(
+        "Proto3MessageLiteWithMaps",
+        new Proto3MessageLiteFactory(2, 10, 2, 2).newMessageWithMaps(),
+        Protobuf.getInstance().schemaFor(Proto3MessageLiteWithMaps.class));
+  }
+
+  private static Proto3MessageLite.Builder newBuilder() {
+    return Proto3MessageLite.newBuilder();
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/AbstractProto3SchemaTest.java b/java/core/src/test/java/com/google/protobuf/AbstractProto3SchemaTest.java
new file mode 100755
index 0000000..358f1e3
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/AbstractProto3SchemaTest.java
@@ -0,0 +1,151 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.protobuf.testing.Proto3Testing.Proto3Empty;
+import com.google.protobuf.testing.Proto3Testing.Proto3Message;
+import com.google.protobuf.testing.Proto3Testing.Proto3MessageWithMaps;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+
+/** Base class for tests using {@link Proto3Message}. */
+public abstract class AbstractProto3SchemaTest extends AbstractSchemaTest<Proto3Message> {
+  @Override
+  protected Proto3MessageFactory messageFactory() {
+    return new Proto3MessageFactory(10, 20, 2, 2);
+  }
+
+  @Override
+  protected List<ByteBuffer> serializedBytesWithInvalidUtf8() throws IOException {
+    List<ByteBuffer> invalidBytes = new ArrayList<>();
+    byte[] invalid = new byte[] {(byte) 0x80};
+    {
+      ByteBuffer buffer = ByteBuffer.allocate(100);
+      CodedOutputStream codedOutput = CodedOutputStream.newInstance(buffer);
+      codedOutput.writeByteArray(Proto3Message.FIELD_STRING_9_FIELD_NUMBER, invalid);
+      codedOutput.flush();
+      buffer.flip();
+      invalidBytes.add(buffer);
+    }
+    {
+      ByteBuffer buffer = ByteBuffer.allocate(100);
+      CodedOutputStream codedOutput = CodedOutputStream.newInstance(buffer);
+      codedOutput.writeByteArray(Proto3Message.FIELD_STRING_LIST_26_FIELD_NUMBER, invalid);
+      codedOutput.flush();
+      buffer.flip();
+      invalidBytes.add(buffer);
+    }
+    return invalidBytes;
+  }
+
+  @Test
+  public void mergeOptionalMessageFields() throws Exception {
+    Proto3Message message1 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().setFieldInt643(123).clearFieldInt325().build())
+            .build();
+    Proto3Message message2 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().clearFieldInt643().setFieldInt325(456).build())
+            .build();
+    Proto3Message message3 =
+        newBuilder()
+            .setFieldMessage10(newBuilder().setFieldInt643(789).clearFieldInt325().build())
+            .build();
+    ByteArrayOutputStream output = new ByteArrayOutputStream();
+    message1.writeTo(output);
+    message2.writeTo(output);
+    message3.writeTo(output);
+    byte[] data = output.toByteArray();
+
+    Proto3Message merged = ExperimentalSerializationUtil.fromByteArray(data, Proto3Message.class);
+    assertEquals(789, merged.getFieldMessage10().getFieldInt643());
+    assertEquals(456, merged.getFieldMessage10().getFieldInt325());
+  }
+
+  @Test
+  public void oneofFieldsShouldRoundtrip() throws IOException {
+    roundtrip("Field 53", newBuilder().setFieldDouble53(100).build());
+    roundtrip("Field 54", newBuilder().setFieldFloat54(100).build());
+    roundtrip("Field 55", newBuilder().setFieldInt6455(100).build());
+    roundtrip("Field 56", newBuilder().setFieldUint6456(100L).build());
+    roundtrip("Field 57", newBuilder().setFieldInt3257(100).build());
+    roundtrip("Field 58", newBuilder().setFieldFixed6458(100).build());
+    roundtrip("Field 59", newBuilder().setFieldFixed3259(100).build());
+    roundtrip("Field 60", newBuilder().setFieldBool60(true).build());
+    roundtrip("Field 61", newBuilder().setFieldString61(data().getString()).build());
+    roundtrip(
+        "Field 62", newBuilder().setFieldMessage62(newBuilder().setFieldDouble1(100)).build());
+    roundtrip("Field 63", newBuilder().setFieldBytes63(data().getBytes()).build());
+    roundtrip("Field 64", newBuilder().setFieldUint3264(100).build());
+    roundtrip("Field 65", newBuilder().setFieldSfixed3265(100).build());
+    roundtrip("Field 66", newBuilder().setFieldSfixed6466(100).build());
+    roundtrip("Field 67", newBuilder().setFieldSint3267(100).build());
+    roundtrip("Field 68", newBuilder().setFieldSint6468(100).build());
+  }
+
+  @Test
+  public void preserveUnknownFields() {
+    Proto3Message expectedMessage = messageFactory().newMessage();
+    Proto3Empty empty =
+        ExperimentalSerializationUtil.fromByteArray(
+            expectedMessage.toByteArray(), Proto3Empty.class);
+    assertEquals(expectedMessage.getSerializedSize(), empty.getSerializedSize());
+    assertEquals(expectedMessage.toByteString(), empty.toByteString());
+  }
+
+  @Test
+  public void preserveUnknownFieldsProto2() {
+    // Make sure we will be able to preserve valid proto2 wireformat, including those that are not
+    // supported in proto3, e.g. groups.
+    byte[] payload = new Proto2MessageFactory(10, 20, 2, 2).newMessage().toByteArray();
+    Proto3Empty empty = ExperimentalSerializationUtil.fromByteArray(payload, Proto3Empty.class);
+    assertEquals(payload.length, empty.getSerializedSize());
+  }
+
+  @Test
+  public void mapsShouldRoundtrip() throws IOException {
+    roundtrip(
+        "Proto3MessageWithMaps",
+        new Proto3MessageFactory(2, 10, 2, 2).newMessageWithMaps(),
+        Protobuf.getInstance().schemaFor(Proto3MessageWithMaps.class));
+  }
+
+  private static Proto3Message.Builder newBuilder() {
+    return Proto3Message.newBuilder();
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/AbstractSchemaTest.java b/java/core/src/test/java/com/google/protobuf/AbstractSchemaTest.java
new file mode 100755
index 0000000..c69a4fd
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/AbstractSchemaTest.java
@@ -0,0 +1,157 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+
+public abstract class AbstractSchemaTest<T extends MessageLite> {
+  private Schema<T> schema;
+
+  @Before
+  public void setup() {
+    schema = schema();
+    registerSchemas();
+  }
+
+  // Subclass should override this method if it needs to register more than one schemas.
+  protected void registerSchemas() {
+    // Register this schema with the runtime to support processing of nested messages.
+    Protobuf.getInstance().registerSchemaOverride(schema.newInstance().getClass(), schema);
+  }
+
+  protected abstract Schema<T> schema();
+
+  protected abstract ExperimentalMessageFactory<? extends T> messageFactory();
+
+  @SuppressWarnings("unused")
+  protected List<ByteBuffer> serializedBytesWithInvalidUtf8() throws IOException {
+    return Collections.emptyList();
+  }
+
+  @Test
+  public void randomMessageShouldRoundtrip() throws IOException {
+    roundtrip("", messageFactory().newMessage());
+  }
+
+  @Test
+  public void invalidUtf8StringParsing() throws IOException {
+    for (ByteBuffer invalidUtf8Bytes : serializedBytesWithInvalidUtf8()) {
+      Reader reader = BinaryReader.newInstance(invalidUtf8Bytes, /* bufferIsImmutable= */ true);
+
+      T newMsg = schema.newInstance();
+      try {
+        schema.mergeFrom(newMsg, reader, ExtensionRegistryLite.getEmptyRegistry());
+        fail("should throw invalid ");
+      } catch (InvalidProtocolBufferException expected) {
+      }
+    }
+  }
+
+  @Test
+  public void mergeFromByteArrayFastPathMayThrowIndexOutOfBoundsException() throws IOException {
+    if (!Android.isOnAndroidDevice()) {
+      // Skip this test if not on Android.
+      return;
+    }
+    byte[] data = messageFactory().newMessage().toByteArray();
+    int exceptionCount = 0;
+    for (int i = 0; i <= data.length; i++) {
+      byte[] truncatedData = Arrays.copyOf(data, i);
+      try {
+        T message = schema.newInstance();
+        // Test that this method throws the expected exceptions.
+        schema.mergeFrom(message, truncatedData, 0, i, new ArrayDecoders.Registers());
+      } catch (InvalidProtocolBufferException e) {
+        // Ignore expected exceptions.
+      } catch (IndexOutOfBoundsException e) {
+        exceptionCount += 1;
+      }
+    }
+    assertNotEquals(0, exceptionCount);
+  }
+
+  protected static final <M extends MessageLite> void roundtrip(
+      String failureMessage, M msg, Schema<M> schema) throws IOException {
+    byte[] serializedBytes = ExperimentalSerializationUtil.toByteArray(msg, schema);
+    assertEquals(failureMessage, msg.getSerializedSize(), serializedBytes.length);
+
+    // Now read it back in and verify it matches the original.
+    if (Android.isOnAndroidDevice()) {
+      // Test the fast path on Android.
+      M newMsg = schema.newInstance();
+      schema.mergeFrom(
+          newMsg, serializedBytes, 0, serializedBytes.length, new ArrayDecoders.Registers());
+      schema.makeImmutable(newMsg);
+      assertEquals(failureMessage, msg, newMsg);
+    }
+    M newMsg = schema.newInstance();
+    Reader reader = BinaryReader.newInstance(ByteBuffer.wrap(serializedBytes), true);
+    schema.mergeFrom(newMsg, reader, ExtensionRegistryLite.getEmptyRegistry());
+    schema.makeImmutable(newMsg);
+
+    assertEquals(failureMessage, msg, newMsg);
+  }
+
+  protected final void roundtrip(String failureMessage, T msg) throws IOException {
+    roundtrip(failureMessage, msg, schema);
+  }
+
+  protected final ExperimentalTestDataProvider data() {
+    return messageFactory().dataProvider();
+  }
+
+  protected List<T> newMessagesMissingRequiredFields() {
+    return Collections.emptyList();
+  }
+
+  @SuppressWarnings("unchecked")
+  @Test
+  public void testRequiredFields() throws Exception {
+    for (T msg : newMessagesMissingRequiredFields()) {
+      if (schema.isInitialized(msg)) {
+        assertEquals("", msg.toString());
+        msg = (T) msg.toBuilder().build();
+      }
+      assertFalse(schema.isInitialized(msg));
+    }
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/ArrayDecodersTest.java b/java/core/src/test/java/com/google/protobuf/ArrayDecodersTest.java
new file mode 100755
index 0000000..037173b
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/ArrayDecodersTest.java
@@ -0,0 +1,236 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.ArrayDecoders.Registers;
+import java.io.IOException;
+import junit.framework.TestCase;
+
+public class ArrayDecodersTest extends TestCase {
+
+  private static final int TAG = WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED);
+  private static final ByteString NEGATIVE_SIZE_0 = generateNegativeLength(0);
+  private static final ByteString NEGATIVE_SIZE_1 = generateNegativeLength(1);
+
+  private Registers registers;
+
+  @Override
+  public void setUp() {
+    registers = new Registers();
+    registers.int1 = TAG;
+  }
+
+  public void testException_decodeString() {
+    try {
+      ArrayDecoders.decodeString(NEGATIVE_SIZE_0.toByteArray(), 0, registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  public void testException_decodeStringRequireUtf8() {
+    try {
+      ArrayDecoders.decodeStringRequireUtf8(NEGATIVE_SIZE_0.toByteArray(), 0, registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  public void testException_decodeBytes() {
+    try {
+      ArrayDecoders.decodeBytes(NEGATIVE_SIZE_0.toByteArray(), 0, registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  public void testException_decodeStringList_first() {
+    try {
+      ArrayDecoders.decodeStringList(
+          TAG,
+          NEGATIVE_SIZE_0.toByteArray(),
+          0,
+          NEGATIVE_SIZE_0.size(),
+          new ProtobufArrayList<Object>(),
+          registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  public void testException_decodeStringList_second() {
+    try {
+      ArrayDecoders.decodeStringList(
+          TAG,
+          NEGATIVE_SIZE_1.toByteArray(),
+          0,
+          NEGATIVE_SIZE_1.size(),
+          new ProtobufArrayList<Object>(),
+          registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  public void testException_decodeStringListRequireUtf8_first() {
+    try {
+      ArrayDecoders.decodeStringListRequireUtf8(
+          TAG,
+          NEGATIVE_SIZE_0.toByteArray(),
+          0,
+          NEGATIVE_SIZE_0.size(),
+          new ProtobufArrayList<Object>(),
+          registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  public void testException_decodeStringListRequireUtf8_second() {
+    try {
+      ArrayDecoders.decodeStringListRequireUtf8(
+          TAG,
+          NEGATIVE_SIZE_1.toByteArray(),
+          0,
+          NEGATIVE_SIZE_1.size(),
+          new ProtobufArrayList<Object>(),
+          registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  public void testException_decodeBytesList_first() {
+    try {
+      ArrayDecoders.decodeBytesList(
+          TAG,
+          NEGATIVE_SIZE_0.toByteArray(),
+          0,
+          NEGATIVE_SIZE_0.size(),
+          new ProtobufArrayList<Object>(),
+          registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  public void testException_decodeBytesList_second() {
+    try {
+      ArrayDecoders.decodeBytesList(
+          TAG,
+          NEGATIVE_SIZE_1.toByteArray(),
+          0,
+          NEGATIVE_SIZE_1.size(),
+          new ProtobufArrayList<Object>(),
+          registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  public void testException_decodeUnknownField() {
+    try {
+      ArrayDecoders.decodeUnknownField(
+          TAG,
+          NEGATIVE_SIZE_0.toByteArray(),
+          0,
+          NEGATIVE_SIZE_0.size(),
+          UnknownFieldSetLite.newInstance(),
+          registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  public void testException_decodeHugeField() {
+    byte[] badBytes =
+        new byte[] {
+          (byte) 0x80, (byte) 0xFF, (byte) 0xFF, (byte) 0xEF, 0x73, 0x74, 0x69, 0x6E, 0x67
+        };
+    try {
+      ArrayDecoders.decodeUnknownField(
+          TAG, badBytes, 0, badBytes.length, UnknownFieldSetLite.newInstance(), registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+
+    try {
+      ArrayDecoders.decodeBytes(badBytes, 0, registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+
+    byte[] badBytesList =
+        new byte[] {
+          0x01,
+          0x77,
+          0x0A,
+          (byte) 0x80,
+          (byte) 0xFF,
+          (byte) 0xFF,
+          (byte) 0xEF,
+          0x73,
+          0x74,
+          0x69,
+          0x6E,
+          0x67
+        };
+    try {
+      ArrayDecoders.decodeBytesList(
+          TAG, badBytesList, 0, badBytes.length, new ProtobufArrayList<>(), registers);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
+  private static ByteString generateNegativeLength(int count) {
+    try {
+      ByteString.Output byteStringOutput = ByteString.newOutput();
+      CodedOutputStream codedOutput = CodedOutputStream.newInstance(byteStringOutput);
+
+      // Write out count - 1 valid 0 length fields; we only write out tags after the field since
+      // ArrayDecoders expects the first tag to already have been parsed.
+      for (int i = 0; i < count; i++) {
+        codedOutput.writeInt32NoTag(0);
+        codedOutput.writeInt32NoTag(TAG);
+      }
+
+      // Write out a negative length
+      codedOutput.writeInt32NoTag(-1);
+
+      codedOutput.flush();
+
+      return byteStringOutput.toByteString();
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/BinaryProtocolTest.java b/java/core/src/test/java/com/google/protobuf/BinaryProtocolTest.java
new file mode 100755
index 0000000..cda2998
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/BinaryProtocolTest.java
@@ -0,0 +1,90 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.protobuf.testing.Proto2Testing.Proto2Message;
+import com.google.protobuf.testing.Proto3Testing.Proto3Message;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public final class BinaryProtocolTest {
+  @Before
+  public void setup() {
+    TestSchemas.registerGenericProto2Schemas();
+
+    Protobuf.getInstance()
+        .registerSchemaOverride(Proto3Message.class, TestSchemas.genericProto3Schema);
+  }
+
+  @Test
+  public void proto3Roundtrip() throws Exception {
+    Proto3Message expected = new Proto3MessageFactory(5, 10, 2, 2).newMessage();
+    byte[] expectedBytes = expected.toByteArray();
+
+    // Deserialize with BinaryReader and verify that the message matches the original.
+    Proto3Message result =
+        ExperimentalSerializationUtil.fromByteArray(expectedBytes, Proto3Message.class);
+    assertEquals(expected, result);
+
+    // Now write it back out using BinaryWriter and verify the output length.
+    byte[] actualBytes = ExperimentalSerializationUtil.toByteArray(result);
+    Assert.assertEquals(expectedBytes.length, actualBytes.length);
+
+    // Read back in the bytes and verify that it matches the original message.
+    Proto3Message actual = Proto3Message.parseFrom(actualBytes);
+    assertEquals(expected, actual);
+  }
+
+  @Test
+  public void proto2Roundtrip() throws Exception {
+    Proto2Message expected = new Proto2MessageFactory(5, 10, 2, 2).newMessage();
+    byte[] expectedBytes = expected.toByteArray();
+
+    // Deserialize with BinaryReader and verify that the message matches the original.
+    Proto2Message result =
+        ExperimentalSerializationUtil.fromByteArray(expectedBytes, Proto2Message.class);
+    assertEquals(expected, result);
+
+    // Now write it back out using BinaryWriter and verify the output length.
+    byte[] actualBytes = ExperimentalSerializationUtil.toByteArray(result);
+    Assert.assertEquals(expectedBytes.length, actualBytes.length);
+
+    // Read back in the bytes and verify that it matches the original message.
+    Proto2Message actual = Proto2Message.parseFrom(actualBytes);
+    assertEquals(expected, actual);
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/CachedFieldSizeTest.java b/java/core/src/test/java/com/google/protobuf/CachedFieldSizeTest.java
new file mode 100755
index 0000000..96319d9
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/CachedFieldSizeTest.java
@@ -0,0 +1,65 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static org.junit.Assert.assertEquals;
+
+import protobuf_unittest.UnittestProto.TestPackedTypes;
+import proto3_unittest.UnittestProto3;
+import protobuf_unittest.TestCachedFieldSizeMessage;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public final class CachedFieldSizeTest {
+  // Regression test for b/74087933
+  @Test
+  public void testCachedFieldSize() throws Exception {
+    TestCachedFieldSizeMessage.Builder builder = TestCachedFieldSizeMessage.newBuilder();
+    builder.setProto2Child(TestUtil.getPackedSet());
+    builder.setProto3Child(
+        UnittestProto3.TestPackedTypes.parseFrom(TestUtil.getPackedSet().toByteArray()));
+    TestCachedFieldSizeMessage message = builder.build();
+
+    // Serialize once to cache all field sizes. This will use the experimental runtime because
+    // the proto has optimize_for = CODE_SIZE.
+    message.toByteArray();
+    // Serialize individual submessages. This will use the generated implementation. If the
+    // experimental runtime hasn't set the correct cached size, this will throw an exception.
+    byte[] data2 = message.getProto2Child().toByteArray();
+    byte[] data3 = message.getProto3Child().toByteArray();
+
+    // Make sure the serialized data is correct.
+    assertEquals(message.getProto2Child(), TestPackedTypes.parseFrom(data2));
+    assertEquals(message.getProto3Child(), UnittestProto3.TestPackedTypes.parseFrom(data3));
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/CodedAdapterTest.java b/java/core/src/test/java/com/google/protobuf/CodedAdapterTest.java
new file mode 100755
index 0000000..a24b48b
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/CodedAdapterTest.java
@@ -0,0 +1,110 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.protobuf.testing.Proto2Testing.Proto2Message;
+import com.google.protobuf.testing.Proto3Testing.Proto3Message;
+import java.io.IOException;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public final class CodedAdapterTest {
+  @Before
+  public void setup() {
+    TestSchemas.registerGenericProto2Schemas();
+
+    Protobuf.getInstance()
+        .registerSchemaOverride(Proto3Message.class, TestSchemas.genericProto3Schema);
+  }
+
+  @Test
+  public void proto3Roundtrip() throws Exception {
+    Proto3Message expected = new Proto3MessageFactory(5, 10, 2, 2).newMessage();
+    byte[] expectedBytes = expected.toByteArray();
+
+    // Deserialize with BinaryReader and verify that the message matches the original.
+    Proto3Message result = fromByteArray(expectedBytes, Proto3Message.class);
+    assertEquals(expected, result);
+
+    // Now write it back out using BinaryWriter and verify the output length.
+    byte[] actualBytes = toByteArray(result, expectedBytes.length);
+
+    // Read back in the bytes and verify that it matches the original message.
+    Proto3Message actual = Proto3Message.parseFrom(actualBytes);
+    assertEquals(expected, actual);
+  }
+
+  @Test
+  public void proto2Roundtrip() throws Exception {
+    Proto2Message expected = new Proto2MessageFactory(5, 10, 2, 2).newMessage();
+    byte[] expectedBytes = expected.toByteArray();
+
+    // Deserialize with BinaryReader and verify that the message matches the original.
+    Proto2Message result = fromByteArray(expectedBytes, Proto2Message.class);
+    assertEquals(expected, result);
+
+    // Now write it back out using BinaryWriter and verify the output length.
+    byte[] actualBytes = toByteArray(result, expectedBytes.length);
+
+    // Read back in the bytes and verify that it matches the original message.
+    Proto2Message actual = Proto2Message.parseFrom(actualBytes);
+    assertEquals(expected, actual);
+  }
+
+  public static <T> byte[] toByteArray(T msg, int size) throws Exception {
+    Schema<T> schema = Protobuf.getInstance().schemaFor(msg);
+    byte[] out = new byte[size];
+    CodedOutputStreamWriter writer =
+        CodedOutputStreamWriter.forCodedOutput(CodedOutputStream.newInstance(out));
+    schema.writeTo(msg, writer);
+    assertEquals(out.length, writer.getTotalBytesWritten());
+    return out;
+  }
+
+  public static <T> T fromByteArray(byte[] data, Class<T> messageType) {
+    Schema<T> schema = Protobuf.getInstance().schemaFor(messageType);
+    try {
+      T msg = schema.newInstance();
+      schema.mergeFrom(
+          msg,
+          CodedInputStreamReader.forCodedInput(CodedInputStream.newInstance(data)),
+          ExtensionRegistryLite.EMPTY_REGISTRY_LITE);
+      return msg;
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/CodedInputStreamTest.java b/java/core/src/test/java/com/google/protobuf/CodedInputStreamTest.java
index 9c5d6da..532052c 100644
--- a/java/core/src/test/java/com/google/protobuf/CodedInputStreamTest.java
+++ b/java/core/src/test/java/com/google/protobuf/CodedInputStreamTest.java
@@ -44,6 +44,7 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import junit.framework.TestCase;
 
 /**
@@ -1195,4 +1196,59 @@
       // Expected
     }
   }
+  
+  public void testMaliciousInputStream() throws Exception {
+    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+    CodedOutputStream codedOutputStream = CodedOutputStream.newInstance(outputStream);
+    codedOutputStream.writeByteArrayNoTag(new byte[] { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5 });
+    codedOutputStream.flush();
+    final List<byte[]> maliciousCapture = new ArrayList<>();
+    InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()) {
+      @Override
+      public synchronized int read(byte[] b, int off, int len) {
+        maliciousCapture.add(b);
+        return super.read(b, off, len);
+      }
+    };
+    
+    // test ByteString
+    
+    CodedInputStream codedInputStream = CodedInputStream.newInstance(inputStream, 1);
+    ByteString byteString = codedInputStream.readBytes();
+    assertEquals(0x0, byteString.byteAt(0));
+    maliciousCapture.get(1)[0] = 0x9;
+    assertEquals(0x0, byteString.byteAt(0));
+    
+    // test ByteBuffer
+    
+    inputStream.reset();
+    maliciousCapture.clear();
+    codedInputStream = CodedInputStream.newInstance(inputStream, 1);
+    ByteBuffer byteBuffer = codedInputStream.readByteBuffer();
+    assertEquals(0x0, byteBuffer.get(0));
+    maliciousCapture.get(1)[0] = 0x9;
+    assertEquals(0x0, byteBuffer.get(0));
+    
+
+    // test byte[]
+    
+    inputStream.reset();
+    maliciousCapture.clear();
+    codedInputStream = CodedInputStream.newInstance(inputStream, 1);
+    byte[] byteArray = codedInputStream.readByteArray();
+    assertEquals(0x0, byteArray[0]);
+    maliciousCapture.get(1)[0] = 0x9;
+    assertEquals(0x9, byteArray[0]); // MODIFICATION! Should we fix?
+
+    // test rawBytes
+    
+    inputStream.reset();
+    maliciousCapture.clear();
+    codedInputStream = CodedInputStream.newInstance(inputStream, 1);
+    int length = codedInputStream.readRawVarint32();
+    byteArray = codedInputStream.readRawBytes(length);
+    assertEquals(0x0, byteArray[0]);
+    maliciousCapture.get(1)[0] = 0x9;
+    assertEquals(0x9, byteArray[0]); // MODIFICATION! Should we fix?
+  }
 }
diff --git a/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java b/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java
index 5f91324..c222ff3 100644
--- a/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java
+++ b/java/core/src/test/java/com/google/protobuf/DescriptorsTest.java
@@ -30,6 +30,8 @@
 
 package com.google.protobuf;
 
+import protobuf_unittest.NestedExtension;
+import protobuf_unittest.NonNestedExtension;
 import com.google.protobuf.DescriptorProtos.DescriptorProto;
 import com.google.protobuf.DescriptorProtos.EnumDescriptorProto;
 import com.google.protobuf.DescriptorProtos.EnumValueDescriptorProto;
@@ -779,4 +781,23 @@
     assertEquals("FIELDNAME5", d.getFields().get(4).getJsonName());
     assertEquals("@type", d.getFields().get(5).getJsonName());
   }
+
+  public void testExtensionRenamesKeywords() {
+    assertTrue(NonNestedExtension.if_ instanceof GeneratedMessage.GeneratedExtension);
+    assertTrue(
+        NestedExtension.MyNestedExtension.default_
+            instanceof GeneratedMessage.GeneratedExtension);
+
+    NonNestedExtension.MessageToBeExtended msg =
+        NonNestedExtension.MessageToBeExtended.newBuilder()
+            .setExtension(NonNestedExtension.if_, "!fi")
+            .build();
+    assertEquals("!fi", msg.getExtension(NonNestedExtension.if_));
+
+    msg =
+        NonNestedExtension.MessageToBeExtended.newBuilder()
+            .setExtension(NestedExtension.MyNestedExtension.default_, 8)
+            .build();
+    assertEquals(8, msg.getExtension(NestedExtension.MyNestedExtension.default_).intValue());
+  }
 }
diff --git a/java/core/src/test/java/com/google/protobuf/ExperimentalMessageFactory.java b/java/core/src/test/java/com/google/protobuf/ExperimentalMessageFactory.java
new file mode 100755
index 0000000..60c8609
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/ExperimentalMessageFactory.java
@@ -0,0 +1,40 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+/** Interface for a test factory for messages. */
+public interface ExperimentalMessageFactory<T extends MessageLite> {
+  /** Creates a new random message instance. */
+  T newMessage();
+
+  /** Gets the underlying data provider. */
+  ExperimentalTestDataProvider dataProvider();
+}
diff --git a/java/core/src/test/java/com/google/protobuf/ExperimentalSerializationUtil.java b/java/core/src/test/java/com/google/protobuf/ExperimentalSerializationUtil.java
new file mode 100755
index 0000000..05aaa67
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/ExperimentalSerializationUtil.java
@@ -0,0 +1,113 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Queue;
+
+/** Utilities for serialization. */
+public class ExperimentalSerializationUtil {
+
+  /**
+   * Serializes the given message to a byte array using {@link com.google.protobuf.BinaryWriter}.
+   */
+  public static <T> byte[] toByteArray(T msg) throws IOException {
+    return toByteArray(msg, Protobuf.getInstance().schemaFor(msg));
+  }
+
+  /**
+   * Serializes the given message to a byte array using {@link com.google.protobuf.BinaryWriter}
+   * with a customized Schema.
+   */
+  public static <T> byte[] toByteArray(T msg, Schema<T> schema) throws IOException {
+    BinaryWriter writer = BinaryWriter.newHeapInstance(BufferAllocator.unpooled());
+    schema.writeTo(msg, writer);
+
+    byte[] out = new byte[writer.getTotalBytesWritten()];
+    int outPos = 0;
+    Queue<AllocatedBuffer> buffers = writer.complete();
+    while (true) {
+      AllocatedBuffer buffer = buffers.poll();
+      if (buffer == null) {
+        break;
+      }
+      int length = buffer.limit() - buffer.position();
+      System.arraycopy(
+          buffer.array(), buffer.arrayOffset() + buffer.position(), out, outPos, length);
+      outPos += length;
+    }
+    if (out.length != outPos) {
+      throw new IllegalArgumentException("Failed to serialize test message");
+    }
+    return out;
+  }
+
+  /** Deserializes a message from the given byte array. */
+  public static <T> T fromByteArray(byte[] data, Class<T> messageType) {
+    if (Android.isOnAndroidDevice()) {
+      return fromByteArrayFastPath(data, messageType);
+    } else {
+      return fromByteArray(data, messageType, ExtensionRegistryLite.getEmptyRegistry());
+    }
+  }
+
+  /**
+   * Deserializes a message from the given byte array using {@link com.google.protobuf.BinaryReader}
+   * with an extension registry and a customized Schema.
+   */
+  public static <T> T fromByteArray(
+      byte[] data, Class<T> messageType, ExtensionRegistryLite extensionRegistry) {
+    try {
+      Schema<T> schema = Protobuf.getInstance().schemaFor(messageType);
+      T msg = schema.newInstance();
+      schema.mergeFrom(
+          msg, BinaryReader.newInstance(ByteBuffer.wrap(data), true), extensionRegistry);
+      schema.makeImmutable(msg);
+      return msg;
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  /** Deserializes a lite message from the given byte array using fast path. */
+  private static <T> T fromByteArrayFastPath(byte[] data, Class<T> messageType) {
+    try {
+      Schema<T> schema = Protobuf.getInstance().schemaFor(messageType);
+      T msg = schema.newInstance();
+      schema.mergeFrom(msg, data, 0, data.length, new ArrayDecoders.Registers());
+      schema.makeImmutable(msg);
+      return msg;
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/ExperimentalTestDataProvider.java b/java/core/src/test/java/com/google/protobuf/ExperimentalTestDataProvider.java
new file mode 100755
index 0000000..3ef93ac
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/ExperimentalTestDataProvider.java
@@ -0,0 +1,189 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.util.Random;
+
+/** Utility class that provides data primitives for filling out protobuf messages. */
+public final class ExperimentalTestDataProvider {
+  private static final Random RANDOM = new Random(100);
+
+  private final Varint32Provider varint32s = new Varint32Provider();
+  private final Varint64Provider varint64s = new Varint64Provider();
+  private final int stringLength;
+
+  public ExperimentalTestDataProvider(int stringLength) {
+    this.stringLength = stringLength;
+  }
+
+  public double getDouble() {
+    double value = 0.0;
+    while (Double.compare(0.0, value) == 0) {
+      value = RANDOM.nextDouble();
+    }
+    return value;
+  }
+
+  public float getFloat() {
+    float value = 0.0f;
+    while (Float.compare(0.0f, value) == 0) {
+      value = RANDOM.nextFloat();
+    }
+    return value;
+  }
+
+  public long getLong() {
+    return varint64s.getLong();
+  }
+
+  public int getInt() {
+    return varint32s.getInt();
+  }
+
+  public boolean getBool() {
+    return true;
+  }
+
+  public int getEnum() {
+    return Math.abs(getInt()) % 3;
+  }
+
+  public String getString() {
+    StringBuilder builder = new StringBuilder(stringLength);
+    for (int i = 0; i < stringLength; ++i) {
+      builder.append((char) (RANDOM.nextInt('z' - 'a') + 'a'));
+    }
+    return builder.toString();
+  }
+
+  public ByteString getBytes() {
+    return ByteString.copyFromUtf8(getString());
+  }
+
+  /**
+   * Iterator over integer values. Uses a simple distribution over 32-bit varints (generally
+   * favoring smaller values).
+   */
+  private static final class Varint32Provider {
+    private static final int[][] VALUES = {
+      new int[] {1, 50, 100, 127}, // 1 byte values
+      new int[] {128, 500, 10000, 16383}, // 2 bytes values
+      new int[] {16384, 50000, 1000000, 2097151}, // 3 bytes values
+      new int[] {2097152, 10000000, 200000000, 268435455}, // 4 bytes values
+      new int[] {268435456, 0x30000000, 0x7FFFFFFF, 0xFFFFFFFF} // 5 bytes values
+    };
+
+    /** Number of samples that should be taken from each value array. */
+    private static final int[] NUM_SAMPLES = {3, 2, 1, 1, 2};
+
+    /**
+     * The index into the {@link #VALUES} array that identifies the list of samples currently being
+     * iterated over.
+     */
+    private int listIndex;
+
+    /** The index of the next sample within a list. */
+    private int sampleIndex;
+
+    /** The number of successive samples that have been taken from the current list. */
+    private int samplesTaken;
+
+    public int getInt() {
+      if (samplesTaken++ > NUM_SAMPLES[listIndex]) {
+        // Done taking samples from this list. Go to the next one.
+        listIndex = (listIndex + 1) % VALUES.length;
+        sampleIndex = 0;
+        samplesTaken = 0;
+      }
+
+      int value = VALUES[listIndex][sampleIndex];
+
+      // All lists are exactly 4 long (i.e. power of 2), so we can optimize the mod operation
+      // with masking.
+      sampleIndex = (sampleIndex + 1) & 3;
+
+      return value;
+    }
+  }
+
+  /**
+   * Iterator over integer values. Uses a simple distribution over 64-bit varints (generally
+   * favoring smaller values).
+   */
+  private static final class Varint64Provider {
+    private static final long[][] VALUES = {
+      new long[] {1, 50, 100, 127},
+      new long[] {128, 500, 10000, 16383},
+      new long[] {16384, 50000, 1000000, 2097151},
+      new long[] {2097152, 10000000, 200000000, 268435455},
+      new long[] {268435456, 0x30000000, 0x7FFFFFFF, 34359738367L},
+      new long[] {34359738368L, 2000000000000L, 4000000000000L, 4398046511103L},
+      new long[] {4398046511104L, 200000000000000L, 500000000000000L, 562949953421311L},
+      new long[] {0x4000000000000L, 0x5000000000000L, 0x6000000000000L, 0x0FFFFFFFFFFFFFFL},
+      new long[] {0x100000000000000L, 0x3FFFFFFFFFFFFFFFL, 0x5FFFFFFFFFFFFFFL, 0x7FFFFFFFFFFFFFFFL},
+      new long[] {
+        0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL, 0xFFFFFFFFFFFFFFFFL
+      }
+    };
+
+    /** Number of samples that should be taken from each value array. */
+    private static final int[] NUM_SAMPLES = {4, 2, 2, 1, 1, 1, 1, 2, 2, 4};
+
+    /**
+     * The index into the {@link #VALUES} array that identifies the list of samples currently being
+     * iterated over.
+     */
+    private int listIndex;
+
+    /** The index of the next sample within a list. */
+    private int sampleIndex;
+
+    /** The number of successive samples that have been taken from the current list. */
+    private int samplesTaken;
+
+    public long getLong() {
+      if (samplesTaken++ > NUM_SAMPLES[listIndex]) {
+        // Done taking samples from this list. Go to the next one.
+        listIndex = (listIndex + 1) % VALUES.length;
+        sampleIndex = 0;
+        samplesTaken = 0;
+      }
+
+      long value = VALUES[listIndex][sampleIndex];
+
+      // All lists are exactly 4 long (i.e. power of 2), so we can optimize the mod operation
+      // with masking.
+      sampleIndex = (sampleIndex + 1) & 3;
+
+      return value;
+    }
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/ExtensionRegistryFactoryTest.java b/java/core/src/test/java/com/google/protobuf/ExtensionRegistryFactoryTest.java
index 30fd147..3eb0ced 100644
--- a/java/core/src/test/java/com/google/protobuf/ExtensionRegistryFactoryTest.java
+++ b/java/core/src/test/java/com/google/protobuf/ExtensionRegistryFactoryTest.java
@@ -30,8 +30,6 @@
 
 package com.google.protobuf;
 
-import protobuf_unittest.NestedExtension;
-import protobuf_unittest.NestedExtensionLite;
 import protobuf_unittest.NonNestedExtension;
 import protobuf_unittest.NonNestedExtensionLite;
 import java.lang.reflect.Method;
@@ -71,8 +69,6 @@
     void testAdd();
 
     void testAdd_immutable();
-
-    void testExtensionRenamesKeywords();
   }
 
   /** Test implementations for the non-Lite usage of ExtensionRegistryFactory. */
@@ -160,23 +156,6 @@
       } catch (IllegalArgumentException expected) {
       }
     }
-
-    @Override
-    public void testExtensionRenamesKeywords() {
-      assertTrue(NonNestedExtension.if_ instanceof GeneratedMessage.GeneratedExtension);
-      assertTrue(NestedExtension.MyNestedExtension.default_ instanceof GeneratedMessage.GeneratedExtension);
-
-      NonNestedExtension.MessageToBeExtended msg =
-              NonNestedExtension.MessageToBeExtended.newBuilder()
-                      .setExtension(NonNestedExtension.if_, "!fi")
-                      .build();
-      assertEquals("!fi", msg.getExtension(NonNestedExtension.if_));
-
-      msg = NonNestedExtension.MessageToBeExtended.newBuilder()
-              .setExtension(NestedExtension.MyNestedExtension.default_, 8)
-              .build();
-      assertEquals(8, msg.getExtension(NestedExtension.MyNestedExtension.default_).intValue());
-    }
   }
 
   /** Test implementations for the Lite usage of ExtensionRegistryFactory. */
@@ -223,23 +202,6 @@
       } catch (UnsupportedOperationException expected) {
       }
     }
-
-    @Override
-    public void testExtensionRenamesKeywords() {
-      assertTrue(NonNestedExtensionLite.package_ instanceof GeneratedMessageLite.GeneratedExtension);
-      assertTrue(NestedExtensionLite.MyNestedExtensionLite.private_ instanceof GeneratedMessageLite.GeneratedExtension);
-
-      NonNestedExtensionLite.MessageLiteToBeExtended msg =
-              NonNestedExtensionLite.MessageLiteToBeExtended.newBuilder()
-              .setExtension(NonNestedExtensionLite.package_, true)
-              .build();
-      assertTrue(msg.getExtension(NonNestedExtensionLite.package_));
-
-      msg = NonNestedExtensionLite.MessageLiteToBeExtended.newBuilder()
-              .setExtension(NestedExtensionLite.MyNestedExtensionLite.private_, 2.4)
-              .build();
-      assertEquals(2.4, msg.getExtension(NestedExtensionLite.MyNestedExtensionLite.private_), 0.001);
-    }
   }
 
   /** Defines a suite of tests which the JUnit3 runner retrieves by reflection. */
@@ -311,7 +273,10 @@
               resolveClass(loadedClass);
             }
           }
-        } catch (ClassNotFoundException e) {
+        } catch (ClassNotFoundException | SecurityException e) {
+          // Java 8+ would throw a SecurityException if we attempt to find a loaded class from
+          // java.lang.* package. We don't really care about those anyway, so just delegate to the
+          // parent class loader.
           loadedClass = super.loadClass(name, resolve);
         }
         return loadedClass;
diff --git a/java/core/src/test/java/com/google/protobuf/MapLiteTest.java b/java/core/src/test/java/com/google/protobuf/MapLiteTest.java
new file mode 100755
index 0000000..d18fd13
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/MapLiteTest.java
@@ -0,0 +1,894 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import map_lite_test.MapTestProto.BizarroTestMap;
+import map_lite_test.MapTestProto.TestMap;
+import map_lite_test.MapTestProto.TestMap.MessageValue;
+import map_lite_test.MapTestProto.TestMapOrBuilder;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import junit.framework.TestCase;
+
+/** Unit tests for map fields. */
+public final class MapLiteTest extends TestCase {
+
+  private void setMapValues(TestMap.Builder builder) {
+    builder
+        .putInt32ToInt32Field(1, 11)
+        .putInt32ToInt32Field(2, 22)
+        .putInt32ToInt32Field(3, 33)
+        .putInt32ToStringField(1, "11")
+        .putInt32ToStringField(2, "22")
+        .putInt32ToStringField(3, "33")
+        .putInt32ToBytesField(1, TestUtil.toBytes("11"))
+        .putInt32ToBytesField(2, TestUtil.toBytes("22"))
+        .putInt32ToBytesField(3, TestUtil.toBytes("33"))
+        .putInt32ToEnumField(1, TestMap.EnumValue.FOO)
+        .putInt32ToEnumField(2, TestMap.EnumValue.BAR)
+        .putInt32ToEnumField(3, TestMap.EnumValue.BAZ)
+        .putInt32ToMessageField(1, MessageValue.newBuilder().setValue(11).build())
+        .putInt32ToMessageField(2, MessageValue.newBuilder().setValue(22).build())
+        .putInt32ToMessageField(3, MessageValue.newBuilder().setValue(33).build())
+        .putStringToInt32Field("1", 11)
+        .putStringToInt32Field("2", 22)
+        .putStringToInt32Field("3", 33);
+  }
+
+  public void testSetMapValues() {
+    TestMap.Builder usingMutableMapBuilder = TestMap.newBuilder();
+    setMapValues(usingMutableMapBuilder);
+    TestMap usingMutableMap = usingMutableMapBuilder.build();
+    assertMapValuesSet(usingMutableMap);
+
+    TestMap.Builder usingAccessorsBuilder = TestMap.newBuilder();
+    setMapValues(usingAccessorsBuilder);
+    TestMap usingAccessors = usingAccessorsBuilder.build();
+    assertMapValuesSet(usingAccessors);
+    assertEquals(usingAccessors, usingMutableMap);
+  }
+
+  private void copyMapValues(TestMap source, TestMap.Builder destination) {
+    destination
+        .putAllInt32ToInt32Field(source.getInt32ToInt32Field())
+        .putAllInt32ToStringField(source.getInt32ToStringField())
+        .putAllInt32ToBytesField(source.getInt32ToBytesField())
+        .putAllInt32ToEnumField(source.getInt32ToEnumField())
+        .putAllInt32ToMessageField(source.getInt32ToMessageField())
+        .putAllStringToInt32Field(source.getStringToInt32Field());
+  }
+
+  private void assertMapValuesSet(TestMap message) {
+    assertEquals(3, message.getInt32ToInt32Field().size());
+    assertEquals(11, message.getInt32ToInt32Field().get(1).intValue());
+    assertEquals(22, message.getInt32ToInt32Field().get(2).intValue());
+    assertEquals(33, message.getInt32ToInt32Field().get(3).intValue());
+
+    assertEquals(3, message.getInt32ToStringField().size());
+    assertEquals("11", message.getInt32ToStringField().get(1));
+    assertEquals("22", message.getInt32ToStringField().get(2));
+    assertEquals("33", message.getInt32ToStringField().get(3));
+
+    assertEquals(3, message.getInt32ToBytesField().size());
+    assertEquals(TestUtil.toBytes("11"), message.getInt32ToBytesField().get(1));
+    assertEquals(TestUtil.toBytes("22"), message.getInt32ToBytesField().get(2));
+    assertEquals(TestUtil.toBytes("33"), message.getInt32ToBytesField().get(3));
+
+    assertEquals(3, message.getInt32ToEnumField().size());
+    assertEquals(TestMap.EnumValue.FOO, message.getInt32ToEnumField().get(1));
+    assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(2));
+    assertEquals(TestMap.EnumValue.BAZ, message.getInt32ToEnumField().get(3));
+
+    assertEquals(3, message.getInt32ToMessageField().size());
+    assertEquals(11, message.getInt32ToMessageField().get(1).getValue());
+    assertEquals(22, message.getInt32ToMessageField().get(2).getValue());
+    assertEquals(33, message.getInt32ToMessageField().get(3).getValue());
+
+    assertEquals(3, message.getStringToInt32Field().size());
+    assertEquals(11, message.getStringToInt32Field().get("1").intValue());
+    assertEquals(22, message.getStringToInt32Field().get("2").intValue());
+    assertEquals(33, message.getStringToInt32Field().get("3").intValue());
+  }
+
+  private void updateMapValues(TestMap.Builder builder) {
+    builder
+        .putInt32ToInt32Field(1, 111)
+        .removeInt32ToInt32Field(2)
+        .putInt32ToInt32Field(4, 44)
+        .putInt32ToStringField(1, "111")
+        .removeInt32ToStringField(2)
+        .putInt32ToStringField(4, "44")
+        .putInt32ToBytesField(1, TestUtil.toBytes("111"))
+        .removeInt32ToBytesField(2)
+        .putInt32ToBytesField(4, TestUtil.toBytes("44"))
+        .putInt32ToEnumField(1, TestMap.EnumValue.BAR)
+        .removeInt32ToEnumField(2)
+        .putInt32ToEnumField(4, TestMap.EnumValue.QUX)
+        .putInt32ToMessageField(1, MessageValue.newBuilder().setValue(111).build())
+        .removeInt32ToMessageField(2)
+        .putInt32ToMessageField(4, MessageValue.newBuilder().setValue(44).build())
+        .putStringToInt32Field("1", 111)
+        .removeStringToInt32Field("2")
+        .putStringToInt32Field("4", 44);
+  }
+
+  public void testUpdateMapValues() {
+    TestMap.Builder mapBuilder = TestMap.newBuilder();
+    setMapValues(mapBuilder);
+    TestMap map = mapBuilder.build();
+    assertMapValuesSet(map);
+
+    mapBuilder = map.toBuilder();
+    updateMapValues(mapBuilder);
+    map = mapBuilder.build();
+    assertMapValuesUpdated(map);
+  }
+
+  private void assertMapValuesUpdated(TestMap message) {
+    assertEquals(3, message.getInt32ToInt32Field().size());
+    assertEquals(111, message.getInt32ToInt32Field().get(1).intValue());
+    assertEquals(33, message.getInt32ToInt32Field().get(3).intValue());
+    assertEquals(44, message.getInt32ToInt32Field().get(4).intValue());
+
+    assertEquals(3, message.getInt32ToStringField().size());
+    assertEquals("111", message.getInt32ToStringField().get(1));
+    assertEquals("33", message.getInt32ToStringField().get(3));
+    assertEquals("44", message.getInt32ToStringField().get(4));
+
+    assertEquals(3, message.getInt32ToBytesField().size());
+    assertEquals(TestUtil.toBytes("111"), message.getInt32ToBytesField().get(1));
+    assertEquals(TestUtil.toBytes("33"), message.getInt32ToBytesField().get(3));
+    assertEquals(TestUtil.toBytes("44"), message.getInt32ToBytesField().get(4));
+
+    assertEquals(3, message.getInt32ToEnumField().size());
+    assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(1));
+    assertEquals(TestMap.EnumValue.BAZ, message.getInt32ToEnumField().get(3));
+    assertEquals(TestMap.EnumValue.QUX, message.getInt32ToEnumField().get(4));
+
+    assertEquals(3, message.getInt32ToMessageField().size());
+    assertEquals(111, message.getInt32ToMessageField().get(1).getValue());
+    assertEquals(33, message.getInt32ToMessageField().get(3).getValue());
+    assertEquals(44, message.getInt32ToMessageField().get(4).getValue());
+
+    assertEquals(3, message.getStringToInt32Field().size());
+    assertEquals(111, message.getStringToInt32Field().get("1").intValue());
+    assertEquals(33, message.getStringToInt32Field().get("3").intValue());
+    assertEquals(44, message.getStringToInt32Field().get("4").intValue());
+  }
+
+  private void assertMapValuesCleared(TestMapOrBuilder testMapOrBuilder) {
+    assertEquals(0, testMapOrBuilder.getInt32ToInt32Field().size());
+    assertEquals(0, testMapOrBuilder.getInt32ToInt32FieldCount());
+    assertEquals(0, testMapOrBuilder.getInt32ToStringField().size());
+    assertEquals(0, testMapOrBuilder.getInt32ToStringFieldCount());
+    assertEquals(0, testMapOrBuilder.getInt32ToBytesField().size());
+    assertEquals(0, testMapOrBuilder.getInt32ToBytesFieldCount());
+    assertEquals(0, testMapOrBuilder.getInt32ToEnumField().size());
+    assertEquals(0, testMapOrBuilder.getInt32ToEnumFieldCount());
+    assertEquals(0, testMapOrBuilder.getInt32ToMessageField().size());
+    assertEquals(0, testMapOrBuilder.getInt32ToMessageFieldCount());
+    assertEquals(0, testMapOrBuilder.getStringToInt32Field().size());
+    assertEquals(0, testMapOrBuilder.getStringToInt32FieldCount());
+  }
+
+  public void testSanityCopyOnWrite() throws InvalidProtocolBufferException {
+    // Since builders are implemented as a thin wrapper around a message
+    // instance, we attempt to verify that we can't cause the builder to modify
+    // a produced message.
+
+    TestMap.Builder builder = TestMap.newBuilder();
+    TestMap message = builder.build();
+    builder.putInt32ToInt32Field(1, 2);
+    assertTrue(message.getInt32ToInt32Field().isEmpty());
+    assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
+    message = builder.build();
+    builder.putInt32ToInt32Field(2, 3);
+    assertEquals(newMap(1, 2), message.getInt32ToInt32Field());
+    assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field());
+  }
+
+  public void testGetMapIsImmutable() {
+    TestMap.Builder builder = TestMap.newBuilder();
+    assertMapsAreImmutable(builder);
+    assertMapsAreImmutable(builder.build());
+
+    setMapValues(builder);
+    assertMapsAreImmutable(builder);
+    assertMapsAreImmutable(builder.build());
+  }
+
+  private void assertMapsAreImmutable(TestMapOrBuilder testMapOrBuilder) {
+    assertImmutable(testMapOrBuilder.getInt32ToInt32Field(), 1, 2);
+    assertImmutable(testMapOrBuilder.getInt32ToStringField(), 1, "2");
+    assertImmutable(testMapOrBuilder.getInt32ToBytesField(), 1, TestUtil.toBytes("2"));
+    assertImmutable(testMapOrBuilder.getInt32ToEnumField(), 1, TestMap.EnumValue.FOO);
+    assertImmutable(
+        testMapOrBuilder.getInt32ToMessageField(), 1, MessageValue.getDefaultInstance());
+    assertImmutable(testMapOrBuilder.getStringToInt32Field(), "1", 2);
+  }
+
+  private <K, V> void assertImmutable(Map<K, V> map, K key, V value) {
+    try {
+      map.put(key, value);
+      fail();
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+    if (!map.isEmpty()) {
+      try {
+        map.entrySet().remove(map.entrySet().iterator().next());
+        fail();
+      } catch (UnsupportedOperationException e) {
+        // expected
+      }
+    }
+  }
+
+  public void testMapFieldClear() {
+    TestMap.Builder builder = TestMap.newBuilder().putInt32ToInt32Field(1, 2);
+    builder.clearInt32ToInt32Field();
+    assertEquals(0, builder.getInt32ToInt32FieldCount());
+  }
+
+  public void testMutableMapLifecycle() {
+    TestMap.Builder builder = TestMap.newBuilder().putInt32ToInt32Field(1, 2);
+    assertEquals(newMap(1, 2), builder.build().getInt32ToInt32Field());
+    assertEquals(newMap(1, 2), builder.getInt32ToInt32Field());
+    builder.putInt32ToInt32Field(2, 3);
+    assertEquals(newMap(1, 2, 2, 3), builder.getInt32ToInt32Field());
+
+    builder.putInt32ToEnumField(1, TestMap.EnumValue.BAR);
+    assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.build().getInt32ToEnumField());
+    assertEquals(newMap(1, TestMap.EnumValue.BAR), builder.getInt32ToEnumField());
+    builder.putInt32ToEnumField(2, TestMap.EnumValue.FOO);
+    assertEquals(
+        newMap(1, TestMap.EnumValue.BAR, 2, TestMap.EnumValue.FOO), builder.getInt32ToEnumField());
+
+    builder.putInt32ToStringField(1, "1");
+    assertEquals(newMap(1, "1"), builder.build().getInt32ToStringField());
+    assertEquals(newMap(1, "1"), builder.getInt32ToStringField());
+    builder.putInt32ToStringField(2, "2");
+    assertEquals(newMap(1, "1", 2, "2"), builder.getInt32ToStringField());
+
+    builder.putInt32ToMessageField(1, TestMap.MessageValue.getDefaultInstance());
+    assertEquals(
+        newMap(1, TestMap.MessageValue.getDefaultInstance()),
+        builder.build().getInt32ToMessageField());
+    assertEquals(
+        newMap(1, TestMap.MessageValue.getDefaultInstance()), builder.getInt32ToMessageField());
+    builder.putInt32ToMessageField(2, TestMap.MessageValue.getDefaultInstance());
+    assertEquals(
+        newMap(
+            1,
+            TestMap.MessageValue.getDefaultInstance(),
+            2,
+            TestMap.MessageValue.getDefaultInstance()),
+        builder.getInt32ToMessageField());
+  }
+
+  public void testGettersAndSetters() throws Exception {
+    TestMap.Builder builder = TestMap.newBuilder();
+    TestMap message = builder.build();
+    assertMapValuesCleared(message);
+
+    builder = message.toBuilder();
+    setMapValues(builder);
+    message = builder.build();
+    assertMapValuesSet(message);
+
+    builder = message.toBuilder();
+    updateMapValues(builder);
+    message = builder.build();
+    assertMapValuesUpdated(message);
+
+    builder = message.toBuilder();
+    builder.clear();
+    assertMapValuesCleared(builder);
+    message = builder.build();
+    assertMapValuesCleared(message);
+  }
+
+  public void testPutAll() throws Exception {
+    TestMap.Builder sourceBuilder = TestMap.newBuilder();
+    setMapValues(sourceBuilder);
+    TestMap source = sourceBuilder.build();
+    assertMapValuesSet(source);
+
+    TestMap.Builder destination = TestMap.newBuilder();
+    copyMapValues(source, destination);
+    assertMapValuesSet(destination.build());
+  }
+
+  public void testPutAllForUnknownEnumValues() throws Exception {
+    TestMap.Builder sourceBuilder =
+        TestMap.newBuilder()
+            .putInt32ToEnumFieldValue(0, 0)
+            .putInt32ToEnumFieldValue(1, 1)
+            .putAllInt32ToEnumFieldValue(newMap(2, 1000)); // unknown value.
+    TestMap source = sourceBuilder.build();
+
+    TestMap.Builder destinationBuilder = TestMap.newBuilder();
+    destinationBuilder.putAllInt32ToEnumFieldValue(source.getInt32ToEnumFieldValue());
+    TestMap destination = destinationBuilder.build();
+
+    assertEquals(0, destination.getInt32ToEnumFieldValue().get(0).intValue());
+    assertEquals(1, destination.getInt32ToEnumFieldValue().get(1).intValue());
+    assertEquals(1000, destination.getInt32ToEnumFieldValue().get(2).intValue());
+    assertEquals(3, destination.getInt32ToEnumFieldCount());
+  }
+
+  public void testPutForUnknownEnumValues() throws Exception {
+    TestMap.Builder builder =
+        TestMap.newBuilder()
+            .putInt32ToEnumFieldValue(0, 0)
+            .putInt32ToEnumFieldValue(1, 1)
+            .putInt32ToEnumFieldValue(2, 1000); // unknown value.
+    TestMap message = builder.build();
+
+    assertEquals(0, message.getInt32ToEnumFieldValueOrThrow(0));
+    assertEquals(1, message.getInt32ToEnumFieldValueOrThrow(1));
+    assertEquals(1000, message.getInt32ToEnumFieldValueOrThrow(2));
+    assertEquals(3, message.getInt32ToEnumFieldCount());
+  }
+
+  public void testPutChecksNullKeysAndValues() throws Exception {
+    TestMap.Builder builder = TestMap.newBuilder();
+
+    try {
+      builder.putInt32ToStringField(1, null);
+      fail();
+    } catch (NullPointerException e) {
+      // expected.
+    }
+
+    try {
+      builder.putInt32ToBytesField(1, null);
+      fail();
+    } catch (NullPointerException e) {
+      // expected.
+    }
+
+    try {
+      builder.putInt32ToEnumField(1, null);
+      fail();
+    } catch (NullPointerException e) {
+      // expected.
+    }
+
+    try {
+      builder.putInt32ToMessageField(1, null);
+      fail();
+    } catch (NullPointerException e) {
+      // expected.
+    }
+
+    try {
+      builder.putStringToInt32Field(null, 1);
+      fail();
+    } catch (NullPointerException e) {
+      // expected.
+    }
+  }
+
+  public void testSerializeAndParse() throws Exception {
+    TestMap.Builder builder = TestMap.newBuilder();
+    setMapValues(builder);
+    TestMap message = builder.build();
+    assertEquals(message.getSerializedSize(), message.toByteString().size());
+    message = TestMap.parser().parseFrom(message.toByteString());
+    assertMapValuesSet(message);
+
+    builder = message.toBuilder();
+    updateMapValues(builder);
+    message = builder.build();
+    assertEquals(message.getSerializedSize(), message.toByteString().size());
+    message = TestMap.parser().parseFrom(message.toByteString());
+    assertMapValuesUpdated(message);
+
+    builder = message.toBuilder();
+    builder.clear();
+    message = builder.build();
+    assertEquals(message.getSerializedSize(), message.toByteString().size());
+    message = TestMap.parser().parseFrom(message.toByteString());
+    assertMapValuesCleared(message);
+  }
+
+  private TestMap tryParseTestMap(BizarroTestMap bizarroMap) throws IOException {
+    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+    CodedOutputStream output = CodedOutputStream.newInstance(byteArrayOutputStream);
+    bizarroMap.writeTo(output);
+    output.flush();
+    return TestMap.parser().parseFrom(ByteString.copyFrom(byteArrayOutputStream.toByteArray()));
+  }
+
+  public void testParseError() throws Exception {
+    ByteString bytes = TestUtil.toBytes("SOME BYTES");
+    String stringKey = "a string key";
+
+    TestMap map =
+        tryParseTestMap(BizarroTestMap.newBuilder().putInt32ToInt32Field(5, bytes).build());
+    assertEquals(0, map.getInt32ToInt32FieldOrDefault(5, -1));
+
+    map = tryParseTestMap(BizarroTestMap.newBuilder().putInt32ToStringField(stringKey, 5).build());
+    assertEquals("", map.getInt32ToStringFieldOrDefault(0, null));
+
+    map = tryParseTestMap(BizarroTestMap.newBuilder().putInt32ToBytesField(stringKey, 5).build());
+    assertEquals(map.getInt32ToBytesFieldOrDefault(0, null), ByteString.EMPTY);
+
+    map =
+        tryParseTestMap(BizarroTestMap.newBuilder().putInt32ToEnumField(stringKey, bytes).build());
+    assertEquals(TestMap.EnumValue.FOO, map.getInt32ToEnumFieldOrDefault(0, null));
+
+    try {
+      tryParseTestMap(BizarroTestMap.newBuilder().putInt32ToMessageField(stringKey, bytes).build());
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+      assertTrue(expected.getUnfinishedMessage() instanceof TestMap);
+      map = (TestMap) expected.getUnfinishedMessage();
+      assertTrue(map.getInt32ToMessageField().isEmpty());
+    }
+
+    map =
+        tryParseTestMap(
+            BizarroTestMap.newBuilder().putStringToInt32Field(stringKey, bytes).build());
+    assertEquals(0, map.getStringToInt32FieldOrDefault(stringKey, -1));
+  }
+
+  public void testMergeFrom() throws Exception {
+    TestMap.Builder builder = TestMap.newBuilder();
+    setMapValues(builder);
+    TestMap message = builder.build();
+
+    TestMap.Builder other = TestMap.newBuilder();
+    other.mergeFrom(message);
+    assertMapValuesSet(other.build());
+  }
+
+  public void testEqualsAndHashCode() throws Exception {
+    // Test that generated equals() and hashCode() will disregard the order
+    // of map entries when comparing/hashing map fields.
+
+    // We can't control the order of elements in a HashMap. The best we can do
+    // here is to add elements in different order.
+    TestMap.Builder b1 =
+        TestMap.newBuilder()
+            .putInt32ToInt32Field(1, 2)
+            .putInt32ToInt32Field(3, 4)
+            .putInt32ToInt32Field(5, 6);
+    TestMap m1 = b1.build();
+
+    TestMap.Builder b2 =
+        TestMap.newBuilder()
+            .putInt32ToInt32Field(5, 6)
+            .putInt32ToInt32Field(1, 2)
+            .putInt32ToInt32Field(3, 4);
+    TestMap m2 = b2.build();
+
+    assertEquals(m1, m2);
+    assertEquals(m1.hashCode(), m2.hashCode());
+
+    // Make sure we did compare map fields.
+    b2.putInt32ToInt32Field(1, 0);
+    m2 = b2.build();
+    assertFalse(m1.equals(m2));
+    // Don't check m1.hashCode() != m2.hashCode() because it's not guaranteed
+    // to be different.
+
+    // Regression test for b/18549190: if a map is a subset of the other map,
+    // equals() should return false.
+    b2.removeInt32ToInt32Field(1);
+    m2 = b2.build();
+    assertFalse(m1.equals(m2));
+    assertFalse(m2.equals(m1));
+  }
+
+  public void testUnknownEnumValues() throws Exception {
+    TestMap.Builder builder =
+        TestMap.newBuilder()
+            .putInt32ToEnumFieldValue(0, 0)
+            .putInt32ToEnumFieldValue(1, 1)
+            .putInt32ToEnumFieldValue(2, 1000); // unknown value.
+    TestMap message = builder.build();
+
+    assertEquals(TestMap.EnumValue.FOO, message.getInt32ToEnumField().get(0));
+    assertEquals(TestMap.EnumValue.BAR, message.getInt32ToEnumField().get(1));
+    assertEquals(TestMap.EnumValue.UNRECOGNIZED, message.getInt32ToEnumField().get(2));
+
+    builder.putAllInt32ToEnumFieldValue(newMap(2, 1000)); // unknown value.
+    message = builder.build();
+    assertEquals(TestMap.EnumValue.UNRECOGNIZED, message.getInt32ToEnumField().get(2));
+
+    // Unknown enum values should be preserved after:
+    //   1. Serialization and parsing.
+    //   2. toBuild().
+    //   3. mergeFrom().
+    message = TestMap.parseFrom(message.toByteString());
+    assertEquals(1000, message.getInt32ToEnumFieldValue().get(2).intValue());
+    builder = message.toBuilder();
+    assertEquals(1000, builder.getInt32ToEnumFieldValue().get(2).intValue());
+    builder = TestMap.newBuilder().mergeFrom(message);
+    assertEquals(1000, builder.getInt32ToEnumFieldValue().get(2).intValue());
+
+    // hashCode()/equals() should take unknown enum values into account.
+    builder.putAllInt32ToEnumFieldValue(newMap(2, 1001));
+    TestMap message2 = builder.build();
+    assertFalse(message.hashCode() == message2.hashCode());
+    assertFalse(message.equals(message2));
+    // Unknown values will be converted to UNRECOGNIZED so the resulted enum map
+    // should be the same.
+    assertEquals(message2.getInt32ToEnumField(), message.getInt32ToEnumField());
+  }
+
+  public void testIterationOrder() throws Exception {
+    TestMap.Builder builder = TestMap.newBuilder();
+    setMapValues(builder);
+    TestMap message = builder.build();
+
+    assertEquals(
+        Arrays.asList("1", "2", "3"), new ArrayList<>(message.getStringToInt32Field().keySet()));
+  }
+
+  public void testGetMap() {
+    TestMap.Builder builder = TestMap.newBuilder();
+    setMapValues(builder);
+    TestMap message = builder.build();
+    assertEquals(message.getStringToInt32Field(), message.getStringToInt32FieldMap());
+    assertEquals(message.getInt32ToBytesField(), message.getInt32ToBytesFieldMap());
+    assertEquals(message.getInt32ToEnumField(), message.getInt32ToEnumFieldMap());
+    assertEquals(message.getInt32ToEnumFieldValue(), message.getInt32ToEnumFieldValueMap());
+    assertEquals(message.getInt32ToMessageField(), message.getInt32ToMessageFieldMap());
+  }
+
+  public void testContains() {
+    TestMap.Builder builder = TestMap.newBuilder();
+    setMapValues(builder);
+    assertMapContainsSetValues(builder);
+    assertMapContainsSetValues(builder.build());
+  }
+
+  private void assertMapContainsSetValues(TestMapOrBuilder testMapOrBuilder) {
+    assertTrue(testMapOrBuilder.containsInt32ToInt32Field(1));
+    assertTrue(testMapOrBuilder.containsInt32ToInt32Field(2));
+    assertTrue(testMapOrBuilder.containsInt32ToInt32Field(3));
+    assertFalse(testMapOrBuilder.containsInt32ToInt32Field(-1));
+
+    assertTrue(testMapOrBuilder.containsInt32ToStringField(1));
+    assertTrue(testMapOrBuilder.containsInt32ToStringField(2));
+    assertTrue(testMapOrBuilder.containsInt32ToStringField(3));
+    assertFalse(testMapOrBuilder.containsInt32ToStringField(-1));
+
+    assertTrue(testMapOrBuilder.containsInt32ToBytesField(1));
+    assertTrue(testMapOrBuilder.containsInt32ToBytesField(2));
+    assertTrue(testMapOrBuilder.containsInt32ToBytesField(3));
+    assertFalse(testMapOrBuilder.containsInt32ToBytesField(-1));
+
+    assertTrue(testMapOrBuilder.containsInt32ToEnumField(1));
+    assertTrue(testMapOrBuilder.containsInt32ToEnumField(2));
+    assertTrue(testMapOrBuilder.containsInt32ToEnumField(3));
+    assertFalse(testMapOrBuilder.containsInt32ToEnumField(-1));
+
+    assertTrue(testMapOrBuilder.containsInt32ToMessageField(1));
+    assertTrue(testMapOrBuilder.containsInt32ToMessageField(2));
+    assertTrue(testMapOrBuilder.containsInt32ToMessageField(3));
+    assertFalse(testMapOrBuilder.containsInt32ToMessageField(-1));
+
+    assertTrue(testMapOrBuilder.containsStringToInt32Field("1"));
+    assertTrue(testMapOrBuilder.containsStringToInt32Field("2"));
+    assertTrue(testMapOrBuilder.containsStringToInt32Field("3"));
+    assertFalse(testMapOrBuilder.containsStringToInt32Field("-1"));
+  }
+
+  public void testCount() {
+    TestMap.Builder builder = TestMap.newBuilder();
+    assertMapCounts(0, builder);
+
+    setMapValues(builder);
+    assertMapCounts(3, builder);
+
+    TestMap message = builder.build();
+    assertMapCounts(3, message);
+
+    builder = message.toBuilder().putInt32ToInt32Field(4, 44);
+    assertEquals(4, builder.getInt32ToInt32FieldCount());
+    assertEquals(4, builder.build().getInt32ToInt32FieldCount());
+
+    // already present - should be unchanged
+    builder.putInt32ToInt32Field(4, 44);
+    assertEquals(4, builder.getInt32ToInt32FieldCount());
+  }
+
+  private void assertMapCounts(int expectedCount, TestMapOrBuilder testMapOrBuilder) {
+    assertEquals(expectedCount, testMapOrBuilder.getInt32ToInt32FieldCount());
+    assertEquals(expectedCount, testMapOrBuilder.getInt32ToStringFieldCount());
+    assertEquals(expectedCount, testMapOrBuilder.getInt32ToBytesFieldCount());
+    assertEquals(expectedCount, testMapOrBuilder.getInt32ToEnumFieldCount());
+    assertEquals(expectedCount, testMapOrBuilder.getInt32ToMessageFieldCount());
+    assertEquals(expectedCount, testMapOrBuilder.getStringToInt32FieldCount());
+  }
+
+  public void testGetOrDefault() {
+    TestMap.Builder builder = TestMap.newBuilder();
+    assertMapCounts(0, builder);
+    setMapValues(builder);
+    doTestGetOrDefault(builder);
+    doTestGetOrDefault(builder.build());
+  }
+
+  public void doTestGetOrDefault(TestMapOrBuilder testMapOrBuilder) {
+    assertEquals(11, testMapOrBuilder.getInt32ToInt32FieldOrDefault(1, -11));
+    assertEquals(-11, testMapOrBuilder.getInt32ToInt32FieldOrDefault(-1, -11));
+
+    assertEquals("11", testMapOrBuilder.getInt32ToStringFieldOrDefault(1, "-11"));
+    assertNull("-11", testMapOrBuilder.getInt32ToStringFieldOrDefault(-1, null));
+
+    assertEquals(TestUtil.toBytes("11"), testMapOrBuilder.getInt32ToBytesFieldOrDefault(1, null));
+    assertNull(testMapOrBuilder.getInt32ToBytesFieldOrDefault(-1, null));
+
+    assertEquals(TestMap.EnumValue.FOO, testMapOrBuilder.getInt32ToEnumFieldOrDefault(1, null));
+    assertNull(testMapOrBuilder.getInt32ToEnumFieldOrDefault(-1, null));
+
+    assertEquals(
+        TestMap.EnumValue.BAR.getNumber(),
+        testMapOrBuilder.getInt32ToEnumFieldValueOrDefault(2, -1));
+    assertEquals(-1, testMapOrBuilder.getInt32ToEnumFieldValueOrDefault(-1000, -1));
+
+    assertEquals(
+        MessageValue.newBuilder().setValue(11).build(),
+        testMapOrBuilder.getInt32ToMessageFieldOrDefault(1, null));
+    assertNull(testMapOrBuilder.getInt32ToMessageFieldOrDefault(-1, null));
+
+    assertEquals(11, testMapOrBuilder.getStringToInt32FieldOrDefault("1", -11));
+    assertEquals(-11, testMapOrBuilder.getStringToInt32FieldOrDefault("-1", -11));
+
+    try {
+      testMapOrBuilder.getStringToInt32FieldOrDefault(null, -11);
+      fail();
+    } catch (NullPointerException e) {
+      // expected
+    }
+  }
+
+  public void testGetOrThrow() {
+    TestMap.Builder builder = TestMap.newBuilder();
+    assertMapCounts(0, builder);
+    setMapValues(builder);
+    doTestGetOrDefault(builder);
+    doTestGetOrDefault(builder.build());
+  }
+
+  public void doTestGetOrThrow(TestMapOrBuilder testMapOrBuilder) {
+    assertEquals(11, testMapOrBuilder.getInt32ToInt32FieldOrThrow(1));
+    try {
+      testMapOrBuilder.getInt32ToInt32FieldOrThrow(-1);
+      fail();
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+
+    assertEquals("11", testMapOrBuilder.getInt32ToStringFieldOrThrow(1));
+
+    try {
+      testMapOrBuilder.getInt32ToStringFieldOrThrow(-1);
+      fail();
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+
+    assertEquals(TestUtil.toBytes("11"), testMapOrBuilder.getInt32ToBytesFieldOrThrow(1));
+
+    try {
+      testMapOrBuilder.getInt32ToBytesFieldOrThrow(-1);
+      fail();
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+
+    assertEquals(TestMap.EnumValue.FOO, testMapOrBuilder.getInt32ToEnumFieldOrThrow(1));
+    try {
+      testMapOrBuilder.getInt32ToEnumFieldOrThrow(-1);
+      fail();
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+
+    assertEquals(
+        TestMap.EnumValue.BAR.getNumber(), testMapOrBuilder.getInt32ToEnumFieldValueOrThrow(2));
+    try {
+      testMapOrBuilder.getInt32ToEnumFieldValueOrThrow(-1);
+      fail();
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+
+    assertEquals(
+        MessageValue.newBuilder().setValue(11).build(),
+        testMapOrBuilder.getInt32ToMessageFieldOrThrow(1));
+    try {
+      testMapOrBuilder.getInt32ToMessageFieldOrThrow(-1);
+      fail();
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+
+    assertEquals(11, testMapOrBuilder.getStringToInt32FieldOrThrow("1"));
+    try {
+      testMapOrBuilder.getStringToInt32FieldOrThrow("-1");
+      fail();
+    } catch (IllegalArgumentException e) {
+      // expected
+    }
+
+    try {
+      testMapOrBuilder.getStringToInt32FieldOrThrow(null);
+      fail();
+    } catch (NullPointerException e) {
+      // expected
+    }
+  }
+
+  public void testPut() {
+    TestMap.Builder builder = TestMap.newBuilder();
+    builder.putInt32ToInt32Field(1, 11);
+    assertEquals(11, builder.getInt32ToInt32FieldOrThrow(1));
+
+    builder.putInt32ToStringField(1, "a");
+    assertEquals("a", builder.getInt32ToStringFieldOrThrow(1));
+    try {
+      builder.putInt32ToStringField(1, null);
+      fail();
+    } catch (NullPointerException e) {
+      // expected
+    }
+
+    builder.putInt32ToBytesField(1, TestUtil.toBytes("11"));
+    assertEquals(TestUtil.toBytes("11"), builder.getInt32ToBytesFieldOrThrow(1));
+    try {
+      builder.putInt32ToBytesField(1, null);
+      fail();
+    } catch (NullPointerException e) {
+      // expected
+    }
+
+    builder.putInt32ToEnumField(1, TestMap.EnumValue.FOO);
+    assertEquals(TestMap.EnumValue.FOO, builder.getInt32ToEnumFieldOrThrow(1));
+    try {
+      builder.putInt32ToEnumField(1, null);
+      fail();
+    } catch (NullPointerException e) {
+      // expected
+    }
+
+    builder.putStringToInt32Field("a", 1);
+    assertEquals(1, builder.getStringToInt32FieldOrThrow("a"));
+    try {
+      builder.putStringToInt32Field(null, -1);
+    } catch (NullPointerException e) {
+      // expected
+    }
+  }
+
+  public void testRemove() {
+    TestMap.Builder builder = TestMap.newBuilder();
+    setMapValues(builder);
+    assertEquals(11, builder.getInt32ToInt32FieldOrThrow(1));
+    for (int times = 0; times < 2; times++) {
+      builder.removeInt32ToInt32Field(1);
+      assertEquals(-1, builder.getInt32ToInt32FieldOrDefault(1, -1));
+    }
+
+    assertEquals("11", builder.getInt32ToStringFieldOrThrow(1));
+    for (int times = 0; times < 2; times++) {
+      builder.removeInt32ToStringField(1);
+      assertNull(builder.getInt32ToStringFieldOrDefault(1, null));
+    }
+
+    assertEquals(TestUtil.toBytes("11"), builder.getInt32ToBytesFieldOrThrow(1));
+    for (int times = 0; times < 2; times++) {
+      builder.removeInt32ToBytesField(1);
+      assertNull(builder.getInt32ToBytesFieldOrDefault(1, null));
+    }
+
+    assertEquals(TestMap.EnumValue.FOO, builder.getInt32ToEnumFieldOrThrow(1));
+    for (int times = 0; times < 2; times++) {
+      builder.removeInt32ToEnumField(1);
+      assertNull(builder.getInt32ToEnumFieldOrDefault(1, null));
+    }
+
+    assertEquals(11, builder.getStringToInt32FieldOrThrow("1"));
+    for (int times = 0; times < 2; times++) {
+      builder.removeStringToInt32Field("1");
+      assertEquals(-1, builder.getStringToInt32FieldOrDefault("1", -1));
+    }
+
+    try {
+      builder.removeStringToInt32Field(null);
+      fail();
+    } catch (NullPointerException e) {
+      // expected
+    }
+  }
+
+  private static <K, V> Map<K, V> newMap(K key1, V value1) {
+    Map<K, V> map = new HashMap<>();
+    map.put(key1, value1);
+    return map;
+  }
+
+  private static <K, V> Map<K, V> newMap(K key1, V value1, K key2, V value2) {
+    Map<K, V> map = new HashMap<>();
+    map.put(key1, value1);
+    map.put(key2, value2);
+    return map;
+  }
+
+  public void testMap_withNulls() {
+    TestMap.Builder builder = TestMap.newBuilder();
+
+    try {
+      builder.putStringToInt32Field(null, 3);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+
+    try {
+      builder.putAllStringToInt32Field(newMap(null, 3, "hi", 4));
+      fail();
+    } catch (NullPointerException expected) {
+    }
+
+    try {
+      builder.putInt32ToMessageField(3, null);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+
+    try {
+      builder.putAllInt32ToMessageField(
+          MapLiteTest.<Integer, MessageValue>newMap(4, null, 5, null));
+      fail();
+    } catch (NullPointerException expected) {
+    }
+
+    try {
+      builder.putAllInt32ToMessageField(null);
+      fail();
+    } catch (NullPointerException expected) {
+    }
+
+    assertArrayEquals(new byte[0], builder.build().toByteArray());
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/PackedFieldTest.java b/java/core/src/test/java/com/google/protobuf/PackedFieldTest.java
new file mode 100755
index 0000000..2397d2e
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/PackedFieldTest.java
@@ -0,0 +1,232 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.PackedFieldTestProto.TestAllTypes;
+import com.google.protobuf.PackedFieldTestProto.TestAllTypes.NestedEnum;
+import com.google.protobuf.PackedFieldTestProto.TestUnpackedTypes;
+import junit.framework.TestCase;
+
+/** Tests primitive repeated fields in proto3 are packed in wire format. */
+public class PackedFieldTest extends TestCase {
+  static final ByteString expectedPackedRawBytes =
+      ByteString.copyFrom(
+          new byte[] {
+            (byte) 0xFA,
+            0x01,
+            0x01,
+            0x01, // repeated int32
+            (byte) 0x82,
+            0x02,
+            0x01,
+            0x01, // repeated int64
+            (byte) 0x8A,
+            0x02,
+            0x01,
+            0x01, // repeated uint32
+            (byte) 0x92,
+            0x02,
+            0x01,
+            0x01, // repeated uint64
+            (byte) 0x9A,
+            0x02,
+            0x01,
+            0x02, // repeated sint32
+            (byte) 0xA2,
+            0x02,
+            0x01,
+            0x02, // repeated sint64
+            (byte) 0xAA,
+            0x02,
+            0x04,
+            0x01,
+            0x00,
+            0x00,
+            0x00, // repeated fixed32
+            (byte) 0xB2,
+            0x02,
+            0x08,
+            0x01,
+            0x00,
+            0x00,
+            0x00, // repeated fixed64
+            0x00,
+            0x00,
+            0x00,
+            0x00,
+            (byte) 0xBA,
+            0x02,
+            0x04,
+            0x01,
+            0x00,
+            0x00,
+            0x00, // repeated sfixed32
+            (byte) 0xC2,
+            0x02,
+            0x08,
+            0x01,
+            0x00,
+            0x00,
+            0x00, // repeated sfixed64
+            0x00,
+            0x00,
+            0x00,
+            0x00,
+            (byte) 0xCA,
+            0x02,
+            0x04,
+            0x00,
+            0x00,
+            (byte) 0x80,
+            0x3f, // repeated float
+            (byte) 0xD2,
+            0x02,
+            0x08,
+            0x00,
+            0x00,
+            0x00,
+            0x00, // repeated double
+            0x00,
+            0x00,
+            (byte) 0xf0,
+            0x3f,
+            (byte) 0xDA,
+            0x02,
+            0x01,
+            0x01, // repeated bool
+            (byte) 0x9A,
+            0x03,
+            0x01,
+            0x01 // repeated nested enum
+          });
+
+  static final ByteString expectedUnpackedRawBytes =
+      ByteString.copyFrom(
+          new byte[] {
+            0x08,
+            0x01, // repeated int32
+            0x10,
+            0x01, // repeated int64
+            0x18,
+            0x01, // repeated uint32
+            0x20,
+            0x01, // repeated uint64
+            0x28,
+            0x02, // repeated sint32
+            0x30,
+            0x02, // repeated sint64
+            0x3D,
+            0x01,
+            0x00,
+            0x00,
+            0x00, // repeated fixed32
+            0x41,
+            0x01,
+            0x00,
+            0x00,
+            0x00, // repeated fixed64
+            0x00,
+            0x00,
+            0x00,
+            0x00,
+            0x4D,
+            0x01,
+            0x00,
+            0x00,
+            0x00, // repeated sfixed32
+            0x51,
+            0x01,
+            0x00,
+            0x00,
+            0x00, // repeated sfixed64
+            0x00,
+            0x00,
+            0x00,
+            0x00,
+            0x5D,
+            0x00,
+            0x00,
+            (byte) 0x80,
+            0x3f, // repeated float
+            0x61,
+            0x00,
+            0x00,
+            0x00,
+            0x00, // repeated double
+            0x00,
+            0x00,
+            (byte) 0xf0,
+            0x3f,
+            0x68,
+            0x01, // repeated bool
+            0x70,
+            0x01, // repeated nested enum
+          });
+
+  public void testPackedGeneratedMessage() throws Exception {
+    TestAllTypes message = TestAllTypes.parseFrom(expectedPackedRawBytes);
+    assertEquals(expectedPackedRawBytes, message.toByteString());
+  }
+
+  public void testPackedDynamicMessageSerialize() throws Exception {
+    DynamicMessage message =
+        DynamicMessage.parseFrom(TestAllTypes.getDescriptor(), expectedPackedRawBytes);
+    assertEquals(expectedPackedRawBytes, message.toByteString());
+  }
+
+  public void testUnpackedGeneratedMessage() throws Exception {
+    TestUnpackedTypes message = TestUnpackedTypes.parseFrom(expectedUnpackedRawBytes);
+    assertEquals(expectedUnpackedRawBytes, message.toByteString());
+  }
+
+  public void testUnPackedDynamicMessageSerialize() throws Exception {
+    DynamicMessage message =
+        DynamicMessage.parseFrom(TestUnpackedTypes.getDescriptor(), expectedUnpackedRawBytes);
+    assertEquals(expectedUnpackedRawBytes, message.toByteString());
+  }
+
+  // Make sure we haven't screwed up the code generation for packing fields by default.
+  public void testPackedSerialization() throws Exception {
+    TestAllTypes message =
+        TestAllTypes.newBuilder()
+            .addRepeatedInt32(1234)
+            .addRepeatedNestedEnum(NestedEnum.BAR)
+            .build();
+
+    CodedInputStream in = CodedInputStream.newInstance(message.toByteArray());
+
+    while (!in.isAtEnd()) {
+      int tag = in.readTag();
+      assertEquals(WireFormat.WIRETYPE_LENGTH_DELIMITED, WireFormat.getTagWireType(tag));
+      in.skipField(tag);
+    }
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/ParserLiteTest.java b/java/core/src/test/java/com/google/protobuf/ParserLiteTest.java
new file mode 100755
index 0000000..eb2dc3d
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/ParserLiteTest.java
@@ -0,0 +1,191 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.UnittestLite.TestAllTypesLite;
+import com.google.protobuf.UnittestLite.TestPackedExtensionsLite;
+import com.google.protobuf.UnittestLite.TestParsingMergeLite;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import junit.framework.TestCase;
+
+public class ParserLiteTest extends TestCase {
+  private void assertRoundTripEquals(MessageLite message, ExtensionRegistryLite registry)
+      throws Exception {
+    final byte[] data = message.toByteArray();
+    final int offset = 20;
+    final int length = data.length;
+    final int padding = 30;
+    Parser<? extends MessageLite> parser = message.getParserForType();
+    assertEquals(message, parser.parseFrom(data, registry));
+    assertEquals(
+        message,
+        parser.parseFrom(generatePaddingArray(data, offset, padding), offset, length, registry));
+    assertEquals(message, parser.parseFrom(message.toByteString(), registry));
+    assertEquals(message, parser.parseFrom(new ByteArrayInputStream(data), registry));
+    assertEquals(message, parser.parseFrom(CodedInputStream.newInstance(data), registry));
+    assertEquals(
+        message, parser.parseFrom(message.toByteString().asReadOnlyByteBuffer(), registry));
+  }
+
+  @SuppressWarnings("unchecked")
+  private void assertRoundTripEquals(MessageLite message) throws Exception {
+    final byte[] data = message.toByteArray();
+    final int offset = 20;
+    final int length = data.length;
+    final int padding = 30;
+
+    Parser<MessageLite> parser = (Parser<MessageLite>) message.getParserForType();
+    assertEquals(message, parser.parseFrom(data));
+    assertEquals(
+        message, parser.parseFrom(generatePaddingArray(data, offset, padding), offset, length));
+    assertEquals(message, parser.parseFrom(message.toByteString()));
+    assertEquals(message, parser.parseFrom(new ByteArrayInputStream(data)));
+    assertEquals(message, parser.parseFrom(CodedInputStream.newInstance(data)));
+    assertEquals(message, parser.parseFrom(message.toByteString().asReadOnlyByteBuffer()));
+  }
+
+  private byte[] generatePaddingArray(byte[] data, int offset, int padding) {
+    byte[] result = new byte[offset + data.length + padding];
+    System.arraycopy(data, 0, result, offset, data.length);
+    return result;
+  }
+
+  public void testParseExtensionsLite() throws Exception {
+    assertRoundTripEquals(
+        TestUtilLite.getAllLiteExtensionsSet(), TestUtilLite.getExtensionRegistryLite());
+  }
+
+  public void testParsePacked() throws Exception {
+    assertRoundTripEquals(TestUtil.getPackedSet());
+    assertRoundTripEquals(TestUtil.getPackedExtensionsSet(), TestUtil.getExtensionRegistry());
+  }
+
+  public void testParsePackedLite() throws Exception {
+    assertRoundTripEquals(
+        TestUtilLite.getLitePackedExtensionsSet(), TestUtilLite.getExtensionRegistryLite());
+  }
+
+  public void testParseDelimitedToLite() throws Exception {
+    // Write MessageLite with packed extension fields.
+    TestPackedExtensionsLite packedMessage = TestUtilLite.getLitePackedExtensionsSet();
+    ByteArrayOutputStream output = new ByteArrayOutputStream();
+    packedMessage.writeDelimitedTo(output);
+    packedMessage.writeDelimitedTo(output);
+
+    InputStream input = new ByteArrayInputStream(output.toByteArray());
+    assertEquals(
+        packedMessage,
+        packedMessage
+            .getParserForType()
+            .parseDelimitedFrom(input, TestUtilLite.getExtensionRegistryLite()));
+    assertEquals(
+        packedMessage,
+        packedMessage
+            .getParserForType()
+            .parseDelimitedFrom(input, TestUtilLite.getExtensionRegistryLite()));
+  }
+
+  /** Helper method for {@link #testParsingMergeLite()}. */
+  private void assertMessageMerged(TestAllTypesLite allTypes) throws Exception {
+    assertEquals(3, allTypes.getOptionalInt32());
+    assertEquals(2, allTypes.getOptionalInt64());
+    assertEquals("hello", allTypes.getOptionalString());
+  }
+
+  public void testParsingMergeLite() throws Exception {
+    // Build messages.
+    TestAllTypesLite.Builder builder = TestAllTypesLite.newBuilder();
+    TestAllTypesLite msg1 = builder.setOptionalInt32(1).build();
+    builder.clear();
+    TestAllTypesLite msg2 = builder.setOptionalInt64(2).build();
+    builder.clear();
+    TestAllTypesLite msg3 = builder.setOptionalInt32(3).setOptionalString("hello").build();
+
+    // Build groups.
+    TestParsingMergeLite.RepeatedFieldsGenerator.Group1 optionalG1 =
+        TestParsingMergeLite.RepeatedFieldsGenerator.Group1.newBuilder().setField1(msg1).build();
+    TestParsingMergeLite.RepeatedFieldsGenerator.Group1 optionalG2 =
+        TestParsingMergeLite.RepeatedFieldsGenerator.Group1.newBuilder().setField1(msg2).build();
+    TestParsingMergeLite.RepeatedFieldsGenerator.Group1 optionalG3 =
+        TestParsingMergeLite.RepeatedFieldsGenerator.Group1.newBuilder().setField1(msg3).build();
+    TestParsingMergeLite.RepeatedFieldsGenerator.Group2 repeatedG1 =
+        TestParsingMergeLite.RepeatedFieldsGenerator.Group2.newBuilder().setField1(msg1).build();
+    TestParsingMergeLite.RepeatedFieldsGenerator.Group2 repeatedG2 =
+        TestParsingMergeLite.RepeatedFieldsGenerator.Group2.newBuilder().setField1(msg2).build();
+    TestParsingMergeLite.RepeatedFieldsGenerator.Group2 repeatedG3 =
+        TestParsingMergeLite.RepeatedFieldsGenerator.Group2.newBuilder().setField1(msg3).build();
+
+    // Assign and serialize RepeatedFieldsGenerator.
+    ByteString data =
+        TestParsingMergeLite.RepeatedFieldsGenerator.newBuilder()
+            .addField1(msg1)
+            .addField1(msg2)
+            .addField1(msg3)
+            .addField2(msg1)
+            .addField2(msg2)
+            .addField2(msg3)
+            .addField3(msg1)
+            .addField3(msg2)
+            .addField3(msg3)
+            .addGroup1(optionalG1)
+            .addGroup1(optionalG2)
+            .addGroup1(optionalG3)
+            .addGroup2(repeatedG1)
+            .addGroup2(repeatedG2)
+            .addGroup2(repeatedG3)
+            .addExt1(msg1)
+            .addExt1(msg2)
+            .addExt1(msg3)
+            .addExt2(msg1)
+            .addExt2(msg2)
+            .addExt2(msg3)
+            .build()
+            .toByteString();
+
+    // Parse TestParsingMergeLite.
+    ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance();
+    UnittestLite.registerAllExtensions(registry);
+    TestParsingMergeLite parsingMerge = TestParsingMergeLite.parser().parseFrom(data, registry);
+
+    // Required and optional fields should be merged.
+    assertMessageMerged(parsingMerge.getRequiredAllTypes());
+    assertMessageMerged(parsingMerge.getOptionalAllTypes());
+    assertMessageMerged(parsingMerge.getOptionalGroup().getOptionalGroupAllTypes());
+    assertMessageMerged(parsingMerge.getExtension(TestParsingMergeLite.optionalExt));
+
+    // Repeated fields should not be merged.
+    assertEquals(3, parsingMerge.getRepeatedAllTypesCount());
+    assertEquals(3, parsingMerge.getRepeatedGroupCount());
+    assertEquals(3, parsingMerge.getExtensionCount(TestParsingMergeLite.repeatedExt));
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto2ExtensionLookupSchemaTest.java b/java/core/src/test/java/com/google/protobuf/Proto2ExtensionLookupSchemaTest.java
new file mode 100755
index 0000000..dfda4b3
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto2ExtensionLookupSchemaTest.java
@@ -0,0 +1,171 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+
+import com.google.protobuf.testing.Proto2Testing;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message.TestEnum;
+import com.google.protobuf.testing.Proto2Testing.Proto2MessageWithExtensions;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class Proto2ExtensionLookupSchemaTest {
+  private byte[] data;
+  private ExtensionRegistry extensionRegistry;
+
+  @Before
+  public void setup() {
+    TestSchemas.registerGenericProto2Schemas();
+
+    Protobuf.getInstance().schemaFor(Proto2MessageWithExtensions.class);
+    data = new Proto2MessageFactory(10, 20, 1, 1).newMessage().toByteArray();
+    extensionRegistry = ExtensionRegistry.newInstance();
+    Proto2Testing.registerAllExtensions(extensionRegistry);
+  }
+
+  @Test
+  public void testExtensions() throws Exception {
+    Proto2MessageWithExtensions base =
+        Proto2MessageWithExtensions.parseFrom(data, extensionRegistry);
+
+    Proto2MessageWithExtensions message =
+        ExperimentalSerializationUtil.fromByteArray(
+            data, Proto2MessageWithExtensions.class, extensionRegistry);
+    assertEquals(base, message);
+
+    Proto2MessageWithExtensions roundtripMessage =
+        ExperimentalSerializationUtil.fromByteArray(
+            ExperimentalSerializationUtil.toByteArray(message),
+            Proto2MessageWithExtensions.class,
+            extensionRegistry);
+    assertEquals(base, roundtripMessage);
+  }
+
+  @Test
+  public void testUnknownEnum() throws Exception {
+    // Use unknown fields to hold invalid enum values.
+    UnknownFieldSetLite unknowns = UnknownFieldSetLite.newInstance();
+    final int outOfRange = 1000;
+    assertNull(TestEnum.forNumber(outOfRange));
+    unknowns.storeField(
+        WireFormat.makeTag(Proto2Message.FIELD_ENUM_13_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) outOfRange);
+    unknowns.storeField(
+        WireFormat.makeTag(
+            Proto2Message.FIELD_ENUM_LIST_30_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) TestEnum.ONE_VALUE);
+    unknowns.storeField(
+        WireFormat.makeTag(
+            Proto2Message.FIELD_ENUM_LIST_30_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) outOfRange);
+    unknowns.storeField(
+        WireFormat.makeTag(
+            Proto2Message.FIELD_ENUM_LIST_30_FIELD_NUMBER, WireFormat.WIRETYPE_VARINT),
+        (long) TestEnum.TWO_VALUE);
+
+    {
+      // Construct a packed enum list.
+      int packedSize =
+          CodedOutputStream.computeUInt32SizeNoTag(TestEnum.ONE_VALUE)
+              + CodedOutputStream.computeUInt32SizeNoTag(outOfRange)
+              + CodedOutputStream.computeUInt32SizeNoTag(TestEnum.ONE_VALUE);
+      ByteString.CodedBuilder packedBuilder = ByteString.newCodedBuilder(packedSize);
+      CodedOutputStream packedOut = packedBuilder.getCodedOutput();
+      packedOut.writeEnumNoTag(TestEnum.ONE_VALUE);
+      packedOut.writeEnumNoTag(outOfRange);
+      packedOut.writeEnumNoTag(TestEnum.TWO_VALUE);
+      unknowns.storeField(
+          WireFormat.makeTag(
+              Proto2Message.FIELD_ENUM_LIST_PACKED_44_FIELD_NUMBER,
+              WireFormat.WIRETYPE_LENGTH_DELIMITED),
+          packedBuilder.build());
+    }
+    int size = unknowns.getSerializedSize();
+    byte[] output = new byte[size];
+    CodedOutputStream codedOutput = CodedOutputStream.newInstance(output);
+    unknowns.writeTo(codedOutput);
+    codedOutput.flush();
+
+    Proto2MessageWithExtensions parsed =
+        ExperimentalSerializationUtil.fromByteArray(
+            output, Proto2MessageWithExtensions.class, extensionRegistry);
+    assertFalse(
+        "out-of-range singular enum should not be in message",
+        parsed.hasExtension(Proto2Testing.fieldEnum13));
+    {
+      List<Long> singularEnum =
+          parsed
+              .getUnknownFields()
+              .getField(Proto2Message.FIELD_ENUM_13_FIELD_NUMBER)
+              .getVarintList();
+      assertEquals(1, singularEnum.size());
+      assertEquals((Long) (long) outOfRange, singularEnum.get(0));
+    }
+    {
+      List<Long> repeatedEnum =
+          parsed
+              .getUnknownFields()
+              .getField(Proto2Message.FIELD_ENUM_LIST_30_FIELD_NUMBER)
+              .getVarintList();
+      assertEquals(1, repeatedEnum.size());
+      assertEquals((Long) (long) outOfRange, repeatedEnum.get(0));
+    }
+    {
+      List<Long> packedRepeatedEnum =
+          parsed
+              .getUnknownFields()
+              .getField(Proto2Message.FIELD_ENUM_LIST_PACKED_44_FIELD_NUMBER)
+              .getVarintList();
+      assertEquals(1, packedRepeatedEnum.size());
+      assertEquals((Long) (long) outOfRange, packedRepeatedEnum.get(0));
+    }
+    assertEquals(
+        "out-of-range repeated enum should not be in message",
+        2,
+        parsed.getExtension(Proto2Testing.fieldEnumList30).size());
+    assertEquals(TestEnum.ONE, parsed.getExtension(Proto2Testing.fieldEnumList30, 0));
+    assertEquals(TestEnum.TWO, parsed.getExtension(Proto2Testing.fieldEnumList30, 1));
+    assertEquals(
+        "out-of-range packed repeated enum should not be in message",
+        2,
+        parsed.getExtension(Proto2Testing.fieldEnumListPacked44).size());
+    assertEquals(TestEnum.ONE, parsed.getExtension(Proto2Testing.fieldEnumListPacked44, 0));
+    assertEquals(TestEnum.TWO, parsed.getExtension(Proto2Testing.fieldEnumListPacked44, 1));
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto2LiteSchemaTest.java b/java/core/src/test/java/com/google/protobuf/Proto2LiteSchemaTest.java
new file mode 100755
index 0000000..8242f84
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto2LiteSchemaTest.java
@@ -0,0 +1,49 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class Proto2LiteSchemaTest extends AbstractProto2LiteSchemaTest {
+
+  @Override
+  protected Schema<Proto2MessageLite> schema() {
+    return TestSchemasLite.genericProto2LiteSchema;
+  }
+
+  @Override
+  protected void registerSchemas() {
+    TestSchemasLite.registerGenericProto2LiteSchemas();
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto2MessageFactory.java b/java/core/src/test/java/com/google/protobuf/Proto2MessageFactory.java
new file mode 100755
index 0000000..b5c61ed
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto2MessageFactory.java
@@ -0,0 +1,555 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.testing.Proto2Testing.Proto2Message;
+import com.google.protobuf.testing.Proto2Testing.Proto2MessageWithMaps;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Creates instances of {@link Proto2Message} based on the tree configuration. */
+public final class Proto2MessageFactory implements ExperimentalMessageFactory<Proto2Message> {
+  private final int numRepeatedFields;
+  private final int branchingFactor;
+  private final Proto2MessageFactory nextLevel;
+  private final ExperimentalTestDataProvider data;
+
+  public Proto2MessageFactory(
+      int numRepeatedFields, int stringLength, int branchingFactor, int treeDepth) {
+    this(
+        new ExperimentalTestDataProvider(stringLength),
+        numRepeatedFields,
+        branchingFactor,
+        treeDepth);
+  }
+
+  private Proto2MessageFactory(
+      ExperimentalTestDataProvider data,
+      int numRepeatedFields,
+      int branchingFactor,
+      int treeDepth) {
+    this.numRepeatedFields = numRepeatedFields;
+    this.branchingFactor = branchingFactor;
+    this.data = data;
+    if (treeDepth > 0) {
+      nextLevel = new Proto2MessageFactory(data, numRepeatedFields, branchingFactor, treeDepth - 1);
+    } else {
+      nextLevel = null;
+    }
+  }
+
+  @Override
+  public ExperimentalTestDataProvider dataProvider() {
+    return data;
+  }
+
+  @Override
+  public Proto2Message newMessage() {
+    Proto2Message.Builder builder = Proto2Message.newBuilder();
+    builder.setFieldDouble1(data.getDouble());
+    builder.setFieldFloat2(data.getFloat());
+    builder.setFieldInt643(data.getLong());
+    builder.setFieldUint644(data.getLong());
+    builder.setFieldInt325(data.getInt());
+    builder.setFieldFixed646(data.getLong());
+    builder.setFieldFixed327(data.getInt());
+    builder.setFieldBool8(data.getBool());
+    builder.setFieldString9(data.getString());
+    // We don't populate the message field. Instead we apply the branching factor to the
+    // repeated message field below.
+    builder.setFieldBytes11(data.getBytes());
+    builder.setFieldUint3212(data.getInt());
+    builder.setFieldEnum13(Proto2Message.TestEnum.forNumber(data.getEnum()));
+    builder.setFieldSfixed3214(data.getInt());
+    builder.setFieldSfixed6415(data.getLong());
+    builder.setFieldSint3216(data.getInt());
+    builder.setFieldSint6417(data.getLong());
+
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      builder.addFieldDoubleList18(data.getDouble());
+      builder.addFieldFloatList19(data.getFloat());
+      builder.addFieldInt64List20(data.getLong());
+      builder.addFieldUint64List21(data.getLong());
+      builder.addFieldInt32List22(data.getInt());
+      builder.addFieldFixed64List23(data.getLong());
+      builder.addFieldFixed32List24(data.getInt());
+      builder.addFieldBoolList25(data.getBool());
+      builder.addFieldStringList26(data.getString());
+      // Repeated message field is controlled by the branching factor below.
+      builder.addFieldBytesList28(data.getBytes());
+      builder.addFieldUint32List29(data.getInt());
+      builder.addFieldEnumList30(Proto2Message.TestEnum.forNumber(data.getEnum()));
+      builder.addFieldSfixed32List31(data.getInt());
+      builder.addFieldSfixed64List32(data.getLong());
+      builder.addFieldSint32List33(data.getInt());
+      builder.addFieldSint64List34(data.getLong());
+
+      builder.addFieldDoubleListPacked35(data.getDouble());
+      builder.addFieldFloatListPacked36(data.getFloat());
+      builder.addFieldInt64ListPacked37(data.getLong());
+      builder.addFieldUint64ListPacked38(data.getLong());
+      builder.addFieldInt32ListPacked39(data.getInt());
+      builder.addFieldFixed64ListPacked40(data.getLong());
+      builder.addFieldFixed32ListPacked41(data.getInt());
+      builder.addFieldBoolListPacked42(data.getBool());
+      builder.addFieldUint32ListPacked43(data.getInt());
+      builder.addFieldEnumListPacked44(Proto2Message.TestEnum.forNumber(data.getEnum()));
+      builder.addFieldSfixed32ListPacked45(data.getInt());
+      builder.addFieldSfixed64ListPacked46(data.getLong());
+      builder.addFieldSint32ListPacked47(data.getInt());
+      builder.addFieldSint64ListPacked48(data.getLong());
+    }
+
+    builder.setFieldGroup49(Proto2Message.FieldGroup49.newBuilder().setFieldInt3250(data.getInt()));
+
+    for (int i = 0; i < branchingFactor; ++i) {
+      builder.addFieldGroupList51(
+          Proto2Message.FieldGroupList51.newBuilder().setFieldInt3252(data.getInt()));
+    }
+
+    // Set all required fields.
+    populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
+
+    // Handle the branching factor.
+    if (nextLevel != null) {
+      for (int i = 0; i < branchingFactor; ++i) {
+        builder.addFieldMessageList27(nextLevel.newMessage());
+      }
+    }
+
+    return builder.build();
+  }
+
+  private interface MapValueProvider<T> {
+    public T getValue();
+  }
+
+  private final MapValueProvider<Integer> integerProvider =
+      new MapValueProvider<Integer>() {
+        @Override
+        public Integer getValue() {
+          return data.getInt();
+        }
+      };
+  private final MapValueProvider<Long> longProvider =
+      new MapValueProvider<Long>() {
+        @Override
+        public Long getValue() {
+          return data.getLong();
+        }
+      };
+  private final MapValueProvider<String> stringProvider =
+      new MapValueProvider<String>() {
+        @Override
+        public String getValue() {
+          return data.getString();
+        }
+      };
+  private final MapValueProvider<ByteString> bytesProvider =
+      new MapValueProvider<ByteString>() {
+        @Override
+        public ByteString getValue() {
+          return data.getBytes();
+        }
+      };
+  private final MapValueProvider<Boolean> booleanProvider =
+      new MapValueProvider<Boolean>() {
+        @Override
+        public Boolean getValue() {
+          return data.getBool();
+        }
+      };
+  private final MapValueProvider<Float> floatProvider =
+      new MapValueProvider<Float>() {
+        @Override
+        public Float getValue() {
+          return data.getFloat();
+        }
+      };
+  private final MapValueProvider<Double> doubleProvider =
+      new MapValueProvider<Double>() {
+        @Override
+        public Double getValue() {
+          return data.getDouble();
+        }
+      };
+  private final MapValueProvider<Proto2Message> messageProvider =
+      new MapValueProvider<Proto2Message>() {
+        @Override
+        public Proto2Message getValue() {
+          return newMessage();
+        }
+      };
+  private final MapValueProvider<Proto2Message.TestEnum> enumProvider =
+      new MapValueProvider<Proto2Message.TestEnum>() {
+        @Override
+        public Proto2Message.TestEnum getValue() {
+          return Proto2Message.TestEnum.forNumber(data.getEnum());
+        }
+      };
+
+  private <V> Map<Integer, V> populateIntegerMap(MapValueProvider<V> provider) {
+    Map<Integer, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getInt(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<Long, V> populateLongMap(MapValueProvider<V> provider) {
+    Map<Long, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getLong(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<String, V> populateStringMap(MapValueProvider<V> provider) {
+    Map<String, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getString(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<Boolean, V> populateBooleanMap(MapValueProvider<V> provider) {
+    Map<Boolean, V> map = new HashMap<>();
+    map.put(false, provider.getValue());
+    map.put(true, provider.getValue());
+    return map;
+  }
+
+  public Proto2MessageWithMaps newMessageWithMaps() {
+    Proto2MessageWithMaps.Builder builder = Proto2MessageWithMaps.newBuilder();
+
+    builder.putAllFieldMapBoolBool1(populateBooleanMap(booleanProvider));
+    builder.putAllFieldMapBoolBytes2(populateBooleanMap(bytesProvider));
+    builder.putAllFieldMapBoolDouble3(populateBooleanMap(doubleProvider));
+    builder.putAllFieldMapBoolEnum4(populateBooleanMap(enumProvider));
+    builder.putAllFieldMapBoolFixed325(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolFixed646(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolFloat7(populateBooleanMap(floatProvider));
+    builder.putAllFieldMapBoolInt328(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolInt649(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolMessage10(populateBooleanMap(messageProvider));
+    builder.putAllFieldMapBoolSfixed3211(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolSfixed6412(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolSint3213(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolSint6414(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolString15(populateBooleanMap(stringProvider));
+    builder.putAllFieldMapBoolUint3216(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolUint6417(populateBooleanMap(longProvider));
+    builder.putAllFieldMapFixed32Bool18(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapFixed32Bytes19(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapFixed32Double20(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapFixed32Enum21(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapFixed32Fixed3222(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Fixed6423(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Float24(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapFixed32Int3225(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Int6426(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Message27(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapFixed32Sfixed3228(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Sfixed6429(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Sint3230(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Sint6431(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32String32(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapFixed32Uint3233(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Uint6434(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed64Bool35(populateLongMap(booleanProvider));
+    builder.putAllFieldMapFixed64Bytes36(populateLongMap(bytesProvider));
+    builder.putAllFieldMapFixed64Double37(populateLongMap(doubleProvider));
+    builder.putAllFieldMapFixed64Enum38(populateLongMap(enumProvider));
+    builder.putAllFieldMapFixed64Fixed3239(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Fixed6440(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Float41(populateLongMap(floatProvider));
+    builder.putAllFieldMapFixed64Int3242(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Int6443(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Message44(populateLongMap(messageProvider));
+    builder.putAllFieldMapFixed64Sfixed3245(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Sfixed6446(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Sint3247(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Sint6448(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64String49(populateLongMap(stringProvider));
+    builder.putAllFieldMapFixed64Uint3250(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Uint6451(populateLongMap(longProvider));
+    builder.putAllFieldMapInt32Bool52(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapInt32Bytes53(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapInt32Double54(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapInt32Enum55(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapInt32Fixed3256(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Fixed6457(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Float58(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapInt32Int3259(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Int6460(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Message61(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapInt32Sfixed3262(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Sfixed6463(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Sint3264(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Sint6465(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32String66(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapInt32Uint3267(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Uint6468(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt64Bool69(populateLongMap(booleanProvider));
+    builder.putAllFieldMapInt64Bytes70(populateLongMap(bytesProvider));
+    builder.putAllFieldMapInt64Double71(populateLongMap(doubleProvider));
+    builder.putAllFieldMapInt64Enum72(populateLongMap(enumProvider));
+    builder.putAllFieldMapInt64Fixed3273(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Fixed6474(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Float75(populateLongMap(floatProvider));
+    builder.putAllFieldMapInt64Int3276(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Int6477(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Message78(populateLongMap(messageProvider));
+    builder.putAllFieldMapInt64Sfixed3279(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Sfixed6480(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Sint3281(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Sint6482(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64String83(populateLongMap(stringProvider));
+    builder.putAllFieldMapInt64Uint3284(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Uint6485(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed32Bool86(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapSfixed32Bytes87(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapSfixed32Double88(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapSfixed32Enum89(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapSfixed32Fixed3290(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Fixed6491(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Float92(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapSfixed32Int3293(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Int6494(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Message95(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapSfixed32Sfixed3296(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Sfixed6497(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Sint3298(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Sint6499(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32String100(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapSfixed32Uint32101(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Uint64102(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed64Bool103(populateLongMap(booleanProvider));
+    builder.putAllFieldMapSfixed64Bytes104(populateLongMap(bytesProvider));
+    builder.putAllFieldMapSfixed64Double105(populateLongMap(doubleProvider));
+    builder.putAllFieldMapSfixed64Enum106(populateLongMap(enumProvider));
+    builder.putAllFieldMapSfixed64Fixed32107(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Fixed64108(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Float109(populateLongMap(floatProvider));
+    builder.putAllFieldMapSfixed64Int32110(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Int64111(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Message112(populateLongMap(messageProvider));
+    builder.putAllFieldMapSfixed64Sfixed32113(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Sfixed64114(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Sint32115(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Sint64116(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64String117(populateLongMap(stringProvider));
+    builder.putAllFieldMapSfixed64Uint32118(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Uint64119(populateLongMap(longProvider));
+    builder.putAllFieldMapSint32Bool120(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapSint32Bytes121(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapSint32Double122(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapSint32Enum123(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapSint32Fixed32124(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Fixed64125(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Float126(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapSint32Int32127(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Int64128(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Message129(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapSint32Sfixed32130(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Sfixed64131(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Sint32132(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Sint64133(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32String134(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapSint32Uint32135(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Uint64136(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint64Bool137(populateLongMap(booleanProvider));
+    builder.putAllFieldMapSint64Bytes138(populateLongMap(bytesProvider));
+    builder.putAllFieldMapSint64Double139(populateLongMap(doubleProvider));
+    builder.putAllFieldMapSint64Enum140(populateLongMap(enumProvider));
+    builder.putAllFieldMapSint64Fixed32141(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Fixed64142(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Float143(populateLongMap(floatProvider));
+    builder.putAllFieldMapSint64Int32144(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Int64145(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Message146(populateLongMap(messageProvider));
+    builder.putAllFieldMapSint64Sfixed32147(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Sfixed64148(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Sint32149(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Sint64150(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64String151(populateLongMap(stringProvider));
+    builder.putAllFieldMapSint64Uint32152(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Uint64153(populateLongMap(longProvider));
+    builder.putAllFieldMapStringBool154(populateStringMap(booleanProvider));
+    builder.putAllFieldMapStringBytes155(populateStringMap(bytesProvider));
+    builder.putAllFieldMapStringDouble156(populateStringMap(doubleProvider));
+    builder.putAllFieldMapStringEnum157(populateStringMap(enumProvider));
+    builder.putAllFieldMapStringFixed32158(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringFixed64159(populateStringMap(longProvider));
+    builder.putAllFieldMapStringFloat160(populateStringMap(floatProvider));
+    builder.putAllFieldMapStringInt32161(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringInt64162(populateStringMap(longProvider));
+    builder.putAllFieldMapStringMessage163(populateStringMap(messageProvider));
+    builder.putAllFieldMapStringSfixed32164(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringSfixed64165(populateStringMap(longProvider));
+    builder.putAllFieldMapStringSint32166(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringSint64167(populateStringMap(longProvider));
+    builder.putAllFieldMapStringString168(populateStringMap(stringProvider));
+    builder.putAllFieldMapStringUint32169(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringUint64170(populateStringMap(longProvider));
+    builder.putAllFieldMapUint32Bool171(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapUint32Bytes172(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapUint32Double173(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapUint32Enum174(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapUint32Fixed32175(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Fixed64176(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Float177(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapUint32Int32178(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Int64179(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Message180(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapUint32Sfixed32181(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Sfixed64182(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Sint32183(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Sint64184(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32String185(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapUint32Uint32186(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Uint64187(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint64Bool188(populateLongMap(booleanProvider));
+    builder.putAllFieldMapUint64Bytes189(populateLongMap(bytesProvider));
+    builder.putAllFieldMapUint64Double190(populateLongMap(doubleProvider));
+    builder.putAllFieldMapUint64Enum191(populateLongMap(enumProvider));
+    builder.putAllFieldMapUint64Fixed32192(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Fixed64193(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Float194(populateLongMap(floatProvider));
+    builder.putAllFieldMapUint64Int32195(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Int64196(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Message197(populateLongMap(messageProvider));
+    builder.putAllFieldMapUint64Sfixed32198(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Sfixed64199(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Sint32200(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Sint64201(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64String202(populateLongMap(stringProvider));
+    builder.putAllFieldMapUint64Uint32203(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Uint64204(populateLongMap(longProvider));
+
+    return builder.build();
+  }
+
+  public List<Proto2Message> newMessagesMissingRequiredFields() {
+    List<Proto2Message> results = new ArrayList<>();
+    for (int i = 71; i <= 88; ++i) {
+      Proto2Message.Builder builder = Proto2Message.newBuilder();
+      populateRequiredFields(builder, i);
+      results.add(builder.buildPartial());
+    }
+    {
+      // A nested optional message field is missing required fields.
+      Proto2Message.Builder builder = Proto2Message.newBuilder();
+      populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
+      builder.setFieldMessage10(Proto2Message.getDefaultInstance());
+      results.add(builder.buildPartial());
+    }
+    {
+      // A nested repeated message field is missing required fields.
+      Proto2Message.Builder builder = Proto2Message.newBuilder();
+      populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
+      builder.addFieldMessageList27(Proto2Message.getDefaultInstance());
+      results.add(builder.buildPartial());
+    }
+    {
+      // A nested oneof message field is missing required fields.
+      Proto2Message.Builder builder = Proto2Message.newBuilder();
+      populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
+      builder.setFieldMessage62(Proto2Message.getDefaultInstance());
+      results.add(builder.buildPartial());
+    }
+    return results;
+  }
+
+  // 0 is not a valid field number so we use it to mean no fields are excluded.
+  private static final int INCLUDE_ALL_REQUIRED_FIELDS = 0;
+
+  private void populateRequiredFields(Proto2Message.Builder builder, int excludedFieldNumber) {
+    if (excludedFieldNumber != 71) {
+      builder.setFieldRequiredDouble71(data.getDouble());
+    }
+    if (excludedFieldNumber != 72) {
+      builder.setFieldRequiredFloat72(data.getFloat());
+    }
+    if (excludedFieldNumber != 73) {
+      builder.setFieldRequiredInt6473(data.getLong());
+    }
+    if (excludedFieldNumber != 74) {
+      builder.setFieldRequiredUint6474(data.getLong());
+    }
+    if (excludedFieldNumber != 75) {
+      builder.setFieldRequiredInt3275(data.getInt());
+    }
+    if (excludedFieldNumber != 76) {
+      builder.setFieldRequiredFixed6476(data.getLong());
+    }
+    if (excludedFieldNumber != 77) {
+      builder.setFieldRequiredFixed3277(data.getInt());
+    }
+    if (excludedFieldNumber != 78) {
+      builder.setFieldRequiredBool78(data.getBool());
+    }
+    if (excludedFieldNumber != 79) {
+      builder.setFieldRequiredString79(data.getString());
+    }
+    if (excludedFieldNumber != 80) {
+      builder.setFieldRequiredMessage80(
+          Proto2Message.RequiredNestedMessage.newBuilder().setValue(data.getInt()));
+    }
+    if (excludedFieldNumber != 81) {
+      builder.setFieldRequiredBytes81(data.getBytes());
+    }
+    if (excludedFieldNumber != 82) {
+      builder.setFieldRequiredUint3282(data.getInt());
+    }
+    if (excludedFieldNumber != 83) {
+      builder.setFieldRequiredEnum83(Proto2Message.TestEnum.forNumber(data.getEnum()));
+    }
+    if (excludedFieldNumber != 84) {
+      builder.setFieldRequiredSfixed3284(data.getInt());
+    }
+    if (excludedFieldNumber != 85) {
+      builder.setFieldRequiredSfixed6485(data.getLong());
+    }
+    if (excludedFieldNumber != 86) {
+      builder.setFieldRequiredSint3286(data.getInt());
+    }
+    if (excludedFieldNumber != 87) {
+      builder.setFieldRequiredSint6487(data.getLong());
+    }
+    if (excludedFieldNumber != 88) {
+      builder.setFieldRequiredGroup88(
+          Proto2Message.FieldRequiredGroup88.newBuilder().setFieldInt3289(data.getInt()));
+    }
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto2MessageInfoFactory.java b/java/core/src/test/java/com/google/protobuf/Proto2MessageInfoFactory.java
new file mode 100755
index 0000000..af671b2
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto2MessageInfoFactory.java
@@ -0,0 +1,892 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.FieldInfo.forField;
+import static com.google.protobuf.FieldInfo.forFieldWithEnumVerifier;
+import static com.google.protobuf.FieldInfo.forMapField;
+import static com.google.protobuf.FieldInfo.forOneofMemberField;
+import static com.google.protobuf.FieldInfo.forProto2OptionalField;
+import static com.google.protobuf.FieldInfo.forProto2RequiredField;
+import static com.google.protobuf.FieldInfo.forRepeatedMessageField;
+
+import com.google.protobuf.testing.Proto2Testing;
+import com.google.protobuf.testing.Proto2Testing.Proto2Empty;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message.FieldGroup49;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message.FieldGroup69;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message.FieldGroupList51;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message.FieldRequiredGroup88;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message.RequiredNestedMessage;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message.TestEnum;
+import com.google.protobuf.testing.Proto2Testing.Proto2MessageWithExtensions;
+import com.google.protobuf.testing.Proto2Testing.Proto2MessageWithMaps;
+import java.lang.reflect.Field;
+
+/** A factory that generates a hard-coded message info for {@link Proto2Message}. */
+public final class Proto2MessageInfoFactory implements MessageInfoFactory {
+  private static final Proto2MessageInfoFactory INSTANCE = new Proto2MessageInfoFactory();
+
+  private Proto2MessageInfoFactory() {}
+
+  public static Proto2MessageInfoFactory getInstance() {
+    return INSTANCE;
+  }
+
+  @Override
+  public boolean isSupported(Class<?> clazz) {
+    return true;
+  }
+
+  @Override
+  public MessageInfo messageInfoFor(Class<?> clazz) {
+    if (Proto2Message.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto2Message();
+    } else if (FieldGroup49.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForFieldGroup49();
+    } else if (FieldGroupList51.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForFieldGroupList51();
+    } else if (FieldGroup69.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForFieldGroup69();
+    } else if (FieldRequiredGroup88.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForFieldRequiredGroup88();
+    } else if (RequiredNestedMessage.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForRequiredNestedMessage();
+    } else if (Proto2Empty.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto2Empty();
+    } else if (Proto2MessageWithExtensions.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto2MessageWithExtensions();
+    } else if (Proto2Testing.FieldGroup49.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForExtensionFieldGroup49();
+    } else if (Proto2Testing.FieldGroupList51.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForExtensionFieldGroupList51();
+    } else if (Proto2Testing.Proto2MessageWithMaps.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto2MessageWithMaps();
+    } else {
+      throw new IllegalArgumentException("Unsupported class: " + clazz.getName());
+    }
+  }
+
+  /**
+   * Creates a new hard-coded info for {@link Proto2Message}. Each time this is called, we manually
+   * go through the entire process of what a message would do if it self-registered its own info,
+   * including looking up each field by name. This is done for benchmarking purposes, so that we get
+   * a more accurate representation of the time it takes to perform this process.
+   */
+  private static StructuralMessageInfo newMessageInfoForProto2Message() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(50);
+    builder.withCheckInitialized(
+        new int[] {
+          10, 27, 62, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+        });
+    lookupFieldsByName(builder);
+    return builder.build();
+  }
+
+  private static void lookupFieldsByName(StructuralMessageInfo.Builder builder) {
+    Field bitField0 = field("bitField0_");
+
+    builder.withDefaultInstance(Proto2Message.getDefaultInstance());
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldDouble1_"), 1, FieldType.DOUBLE, bitField0, 0x00000001, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldFloat2_"), 2, FieldType.FLOAT, bitField0, 0x00000002, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldInt643_"), 3, FieldType.INT64, bitField0, 0x00000004, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldUint644_"), 4, FieldType.UINT64, bitField0, 0x00000008, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldInt325_"), 5, FieldType.INT32, bitField0, 0x00000010, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldFixed646_"), 6, FieldType.FIXED64, bitField0, 0x00000020, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldFixed327_"), 7, FieldType.FIXED32, bitField0, 0x00000040, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldBool8_"), 8, FieldType.BOOL, bitField0, 0x00000080, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldString9_"), 9, FieldType.STRING, bitField0, 0x00000100, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldMessage10_"), 10, FieldType.MESSAGE, bitField0, 0x00000200, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldBytes11_"), 11, FieldType.BYTES, bitField0, 0x00000400, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldUint3212_"), 12, FieldType.UINT32, bitField0, 0x00000800, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldEnum13_"),
+            13,
+            FieldType.ENUM,
+            bitField0,
+            0x00001000,
+            false,
+            asVerifier(TestEnum.internalGetValueMap())));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldSfixed3214_"), 14, FieldType.SFIXED32, bitField0, 0x00002000, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldSfixed6415_"), 15, FieldType.SFIXED64, bitField0, 0x00004000, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldSint3216_"), 16, FieldType.SINT32, bitField0, 0x00008000, false, null));
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldSint6417_"), 17, FieldType.SINT64, bitField0, 0x00010000, false, null));
+    builder.withField(forField(field("fieldDoubleList18_"), 18, FieldType.DOUBLE_LIST, false));
+    builder.withField(forField(field("fieldFloatList19_"), 19, FieldType.FLOAT_LIST, false));
+    builder.withField(forField(field("fieldInt64List20_"), 20, FieldType.INT64_LIST, false));
+    builder.withField(forField(field("fieldUint64List21_"), 21, FieldType.UINT64_LIST, false));
+    builder.withField(forField(field("fieldInt32List22_"), 22, FieldType.INT32_LIST, false));
+    builder.withField(forField(field("fieldFixed64List23_"), 23, FieldType.FIXED64_LIST, false));
+    builder.withField(forField(field("fieldFixed32List24_"), 24, FieldType.FIXED32_LIST, false));
+    builder.withField(forField(field("fieldBoolList25_"), 25, FieldType.BOOL_LIST, false));
+    builder.withField(forField(field("fieldStringList26_"), 26, FieldType.STRING_LIST, false));
+    builder.withField(
+        forRepeatedMessageField(
+            field("fieldMessageList27_"), 27, FieldType.MESSAGE_LIST, Proto2Message.class));
+    builder.withField(forField(field("fieldBytesList28_"), 28, FieldType.BYTES_LIST, false));
+    builder.withField(forField(field("fieldUint32List29_"), 29, FieldType.UINT32_LIST, false));
+    builder.withField(
+        forFieldWithEnumVerifier(
+            field("fieldEnumList30_"),
+            30,
+            FieldType.ENUM_LIST,
+            asVerifier(TestEnum.internalGetValueMap())));
+    builder.withField(forField(field("fieldSfixed32List31_"), 31, FieldType.SFIXED32_LIST, false));
+    builder.withField(forField(field("fieldSfixed64List32_"), 32, FieldType.SFIXED64_LIST, false));
+    builder.withField(forField(field("fieldSint32List33_"), 33, FieldType.SINT32_LIST, false));
+    builder.withField(forField(field("fieldSint64List34_"), 34, FieldType.SINT64_LIST, false));
+    builder.withField(
+        forField(field("fieldDoubleListPacked35_"), 35, FieldType.DOUBLE_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldFloatListPacked36_"), 36, FieldType.FLOAT_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldInt64ListPacked37_"), 37, FieldType.INT64_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldUint64ListPacked38_"), 38, FieldType.UINT64_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldInt32ListPacked39_"), 39, FieldType.INT32_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldFixed64ListPacked40_"), 40, FieldType.FIXED64_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldFixed32ListPacked41_"), 41, FieldType.FIXED32_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldBoolListPacked42_"), 42, FieldType.BOOL_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldUint32ListPacked43_"), 43, FieldType.UINT32_LIST_PACKED, false));
+    builder.withField(
+        forFieldWithEnumVerifier(
+            field("fieldEnumListPacked44_"),
+            44,
+            FieldType.ENUM_LIST_PACKED,
+            asVerifier(TestEnum.internalGetValueMap())));
+    builder.withField(
+        forField(field("fieldSfixed32ListPacked45_"), 45, FieldType.SFIXED32_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldSfixed64ListPacked46_"), 46, FieldType.SFIXED64_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldSint32ListPacked47_"), 47, FieldType.SINT32_LIST_PACKED, false));
+    builder.withField(
+        forField(field("fieldSint64ListPacked48_"), 48, FieldType.SINT64_LIST_PACKED, false));
+
+    builder.withField(
+        forProto2OptionalField(
+            field("fieldGroup49_"), 49, FieldType.GROUP, bitField0, 0x00020000, false, null));
+    builder.withField(
+        forRepeatedMessageField(
+            field("fieldGroupList51_"),
+            51,
+            FieldType.GROUP_LIST,
+            Proto2Message.FieldGroupList51.class));
+
+    OneofInfo oneof = new OneofInfo(0, field("testOneofCase_"), field("testOneof_"));
+    builder.withField(forOneofMemberField(53, FieldType.DOUBLE, oneof, Double.class, false, null));
+    builder.withField(forOneofMemberField(54, FieldType.FLOAT, oneof, Float.class, false, null));
+    builder.withField(forOneofMemberField(55, FieldType.INT64, oneof, Long.class, false, null));
+    builder.withField(forOneofMemberField(56, FieldType.UINT64, oneof, Long.class, false, null));
+    builder.withField(forOneofMemberField(57, FieldType.INT32, oneof, Integer.class, false, null));
+    builder.withField(forOneofMemberField(58, FieldType.FIXED64, oneof, Long.class, false, null));
+    builder.withField(
+        forOneofMemberField(59, FieldType.FIXED32, oneof, Integer.class, false, null));
+    builder.withField(forOneofMemberField(60, FieldType.BOOL, oneof, Boolean.class, false, null));
+    builder.withField(forOneofMemberField(61, FieldType.STRING, oneof, String.class, false, null));
+    builder.withField(
+        forOneofMemberField(62, FieldType.MESSAGE, oneof, Proto2Message.class, false, null));
+    builder.withField(
+        forOneofMemberField(63, FieldType.BYTES, oneof, ByteString.class, false, null));
+    builder.withField(forOneofMemberField(64, FieldType.UINT32, oneof, Integer.class, false, null));
+    builder.withField(
+        forOneofMemberField(65, FieldType.SFIXED32, oneof, Integer.class, false, null));
+    builder.withField(forOneofMemberField(66, FieldType.SFIXED64, oneof, Long.class, false, null));
+    builder.withField(forOneofMemberField(67, FieldType.SINT32, oneof, Integer.class, false, null));
+    builder.withField(forOneofMemberField(68, FieldType.SINT64, oneof, Long.class, false, null));
+    builder.withField(
+        forOneofMemberField(
+            69, FieldType.GROUP, oneof, Proto2Message.FieldGroup69.class, false, null));
+
+    Field bitField1 = field("bitField1_");
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredDouble71_"),
+            71,
+            FieldType.DOUBLE,
+            bitField1,
+            0x00000008,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredFloat72_"),
+            72,
+            FieldType.FLOAT,
+            bitField1,
+            0x00000010,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredInt6473_"),
+            73,
+            FieldType.INT64,
+            bitField1,
+            0x00000020,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredUint6474_"),
+            74,
+            FieldType.UINT64,
+            bitField1,
+            0x00000040,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredInt3275_"),
+            75,
+            FieldType.INT32,
+            bitField1,
+            0x00000080,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredFixed6476_"),
+            76,
+            FieldType.FIXED64,
+            bitField1,
+            0x00000100,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredFixed3277_"),
+            77,
+            FieldType.FIXED32,
+            bitField1,
+            0x00000200,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredBool78_"), 78, FieldType.BOOL, bitField1, 0x00000400, false, null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredString79_"),
+            79,
+            FieldType.STRING,
+            bitField1,
+            0x00000800,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredMessage80_"),
+            80,
+            FieldType.MESSAGE,
+            bitField1,
+            0x00001000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredBytes81_"),
+            81,
+            FieldType.BYTES,
+            bitField1,
+            0x00002000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredUint3282_"),
+            82,
+            FieldType.UINT32,
+            bitField1,
+            0x00004000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredEnum83_"),
+            83,
+            FieldType.ENUM,
+            bitField1,
+            0x00008000,
+            false,
+            asVerifier(TestEnum.internalGetValueMap())));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredSfixed3284_"),
+            84,
+            FieldType.SFIXED32,
+            bitField1,
+            0x00010000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredSfixed6485_"),
+            85,
+            FieldType.SFIXED64,
+            bitField1,
+            0x00020000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredSint3286_"),
+            86,
+            FieldType.SINT32,
+            bitField1,
+            0x00040000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredSint6487_"),
+            87,
+            FieldType.SINT64,
+            bitField1,
+            0x00080000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field("fieldRequiredGroup88_"),
+            88,
+            FieldType.GROUP,
+            bitField1,
+            0x00100000,
+            false,
+            null));
+  }
+
+  private static StructuralMessageInfo newMessageInfoForFieldGroup49() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(FieldGroup49.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(FieldGroup49.class, "fieldInt3250_"),
+            50,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForFieldGroupList51() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(FieldGroupList51.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(FieldGroupList51.class, "fieldInt3252_"),
+            52,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForFieldGroup69() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(FieldGroup69.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(FieldGroup69.class, "fieldInt3270_"),
+            70,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForRequiredNestedMessage() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(RequiredNestedMessage.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(RequiredNestedMessage.class, "value_"),
+            1,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForFieldRequiredGroup88() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(FieldRequiredGroup88.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(FieldRequiredGroup88.class, "fieldInt3289_"),
+            89,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForProto2Empty() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForProto2MessageWithExtensions() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(0);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForExtensionFieldGroup49() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(Proto2Testing.FieldGroup49.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2Testing.FieldGroup49.class, "fieldInt3250_"),
+            50,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForExtensionFieldGroupList51() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(Proto2Testing.FieldGroupList51.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2Testing.FieldGroupList51.class, "fieldInt3252_"),
+            52,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForProto2MessageWithMaps() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder();
+    builder.withCheckInitialized(
+        new int[] {
+          10, 27, 44, 61, 78, 95, 112, 129, 146, 163, 180, 197,
+        });
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_bool_1", 1));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_bytes_2", 2));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_double_3", 3));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_enum_4", 4));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_fixed32_5", 5));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_fixed64_6", 6));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_float_7", 7));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_int32_8", 8));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_int64_9", 9));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_message_10", 10));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_sfixed32_11", 11));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_sfixed64_12", 12));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_sint32_13", 13));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_sint64_14", 14));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_string_15", 15));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_uint32_16", 16));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_bool_uint64_17", 17));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_bool_18", 18));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_bytes_19", 19));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_double_20", 20));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_enum_21", 21));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_fixed32_22", 22));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_fixed64_23", 23));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_float_24", 24));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_int32_25", 25));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_int64_26", 26));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_message_27", 27));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_sfixed32_28", 28));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_sfixed64_29", 29));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_sint32_30", 30));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_sint64_31", 31));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_string_32", 32));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_uint32_33", 33));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed32_uint64_34", 34));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_bool_35", 35));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_bytes_36", 36));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_double_37", 37));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_enum_38", 38));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_fixed32_39", 39));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_fixed64_40", 40));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_float_41", 41));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_int32_42", 42));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_int64_43", 43));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_message_44", 44));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_sfixed32_45", 45));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_sfixed64_46", 46));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_sint32_47", 47));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_sint64_48", 48));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_string_49", 49));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_uint32_50", 50));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_fixed64_uint64_51", 51));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_bool_52", 52));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_bytes_53", 53));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_double_54", 54));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_enum_55", 55));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_fixed32_56", 56));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_fixed64_57", 57));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_float_58", 58));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_int32_59", 59));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_int64_60", 60));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_message_61", 61));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_sfixed32_62", 62));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_sfixed64_63", 63));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_sint32_64", 64));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_sint64_65", 65));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_string_66", 66));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_uint32_67", 67));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int32_uint64_68", 68));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_bool_69", 69));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_bytes_70", 70));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_double_71", 71));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_enum_72", 72));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_fixed32_73", 73));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_fixed64_74", 74));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_float_75", 75));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_int32_76", 76));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_int64_77", 77));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_message_78", 78));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_sfixed32_79", 79));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_sfixed64_80", 80));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_sint32_81", 81));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_sint64_82", 82));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_string_83", 83));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_uint32_84", 84));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_int64_uint64_85", 85));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_bool_86", 86));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_bytes_87", 87));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_double_88", 88));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_enum_89", 89));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_fixed32_90", 90));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_fixed64_91", 91));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_float_92", 92));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_int32_93", 93));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_int64_94", 94));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_message_95", 95));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_sfixed32_96", 96));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_sfixed64_97", 97));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_sint32_98", 98));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_sint64_99", 99));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_string_100", 100));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_uint32_101", 101));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed32_uint64_102", 102));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_bool_103", 103));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_bytes_104", 104));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_double_105", 105));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_enum_106", 106));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_fixed32_107", 107));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_fixed64_108", 108));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_float_109", 109));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_int32_110", 110));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_int64_111", 111));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_message_112", 112));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_sfixed32_113", 113));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_sfixed64_114", 114));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_sint32_115", 115));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_sint64_116", 116));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_string_117", 117));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_uint32_118", 118));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sfixed64_uint64_119", 119));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_bool_120", 120));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_bytes_121", 121));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_double_122", 122));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_enum_123", 123));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_fixed32_124", 124));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_fixed64_125", 125));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_float_126", 126));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_int32_127", 127));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_int64_128", 128));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_message_129", 129));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_sfixed32_130", 130));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_sfixed64_131", 131));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_sint32_132", 132));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_sint64_133", 133));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_string_134", 134));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_uint32_135", 135));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint32_uint64_136", 136));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_bool_137", 137));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_bytes_138", 138));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_double_139", 139));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_enum_140", 140));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_fixed32_141", 141));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_fixed64_142", 142));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_float_143", 143));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_int32_144", 144));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_int64_145", 145));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_message_146", 146));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_sfixed32_147", 147));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_sfixed64_148", 148));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_sint32_149", 149));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_sint64_150", 150));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_string_151", 151));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_uint32_152", 152));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_sint64_uint64_153", 153));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_bool_154", 154));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_bytes_155", 155));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_double_156", 156));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_enum_157", 157));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_fixed32_158", 158));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_fixed64_159", 159));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_float_160", 160));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_int32_161", 161));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_int64_162", 162));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_message_163", 163));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_sfixed32_164", 164));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_sfixed64_165", 165));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_sint32_166", 166));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_sint64_167", 167));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_string_168", 168));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_uint32_169", 169));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_string_uint64_170", 170));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_bool_171", 171));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_bytes_172", 172));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_double_173", 173));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_enum_174", 174));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_fixed32_175", 175));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_fixed64_176", 176));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_float_177", 177));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_int32_178", 178));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_int64_179", 179));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_message_180", 180));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_sfixed32_181", 181));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_sfixed64_182", 182));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_sint32_183", 183));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_sint64_184", 184));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_string_185", 185));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_uint32_186", 186));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint32_uint64_187", 187));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_bool_188", 188));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_bytes_189", 189));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_double_190", 190));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_enum_191", 191));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_fixed32_192", 192));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_fixed64_193", 193));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_float_194", 194));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_int32_195", 195));
+    builder.withField(mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_int64_196", 196));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_message_197", 197));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_sfixed32_198", 198));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_sfixed64_199", 199));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_sint32_200", 200));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_sint64_201", 201));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_string_202", 202));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_uint32_203", 203));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_uint64_204", 204));
+
+    return builder.build();
+  }
+
+  private static FieldInfo mapFieldInfo(Class<?> clazz, String fieldName, int fieldNumber) {
+    try {
+      return forMapField(
+          field(clazz, SchemaUtil.toCamelCase(fieldName, false) + "_"),
+          fieldNumber,
+          SchemaUtil.getMapDefaultEntry(clazz, fieldName),
+          fieldName.contains("_enum_") ? asVerifier(TestEnum.internalGetValueMap()) : null);
+    } catch (Throwable t) {
+      throw new RuntimeException(t);
+    }
+  }
+
+
+  private static Field field(String name) {
+    return field(Proto2Message.class, name);
+  }
+
+  private static Field field(Class<?> clazz, String name) {
+    try {
+      return clazz.getDeclaredField(name);
+    } catch (NoSuchFieldException | SecurityException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private static Internal.EnumVerifier asVerifier(final Internal.EnumLiteMap<?> map) {
+    return new Internal.EnumVerifier() {
+      @Override
+      public boolean isInRange(int number) {
+        return map.findValueByNumber(number) != null;
+      }
+    };
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto2MessageLiteFactory.java b/java/core/src/test/java/com/google/protobuf/Proto2MessageLiteFactory.java
new file mode 100755
index 0000000..2da3494
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto2MessageLiteFactory.java
@@ -0,0 +1,558 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLiteWithMaps;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/** Creates instances of {@link Proto2MessageLite} based on the tree configuration. */
+public final class Proto2MessageLiteFactory
+    implements ExperimentalMessageFactory<Proto2MessageLite> {
+  private final int numRepeatedFields;
+  private final int branchingFactor;
+  private final Proto2MessageLiteFactory nextLevel;
+  private final ExperimentalTestDataProvider data;
+
+  public Proto2MessageLiteFactory(
+      int numRepeatedFields, int stringLength, int branchingFactor, int treeDepth) {
+    this(
+        new ExperimentalTestDataProvider(stringLength),
+        numRepeatedFields,
+        branchingFactor,
+        treeDepth);
+  }
+
+  private Proto2MessageLiteFactory(
+      ExperimentalTestDataProvider data,
+      int numRepeatedFields,
+      int branchingFactor,
+      int treeDepth) {
+    this.numRepeatedFields = numRepeatedFields;
+    this.branchingFactor = branchingFactor;
+    this.data = data;
+    if (treeDepth > 0) {
+      nextLevel =
+          new Proto2MessageLiteFactory(data, numRepeatedFields, branchingFactor, treeDepth - 1);
+    } else {
+      nextLevel = null;
+    }
+  }
+
+  @Override
+  public ExperimentalTestDataProvider dataProvider() {
+    return data;
+  }
+
+  @Override
+  public Proto2MessageLite newMessage() {
+    Proto2MessageLite.Builder builder = Proto2MessageLite.newBuilder();
+    builder.setFieldDouble1(data.getDouble());
+    builder.setFieldFloat2(data.getFloat());
+    builder.setFieldInt643(data.getLong());
+    builder.setFieldUint644(data.getLong());
+    builder.setFieldInt325(data.getInt());
+    builder.setFieldFixed646(data.getLong());
+    builder.setFieldFixed327(data.getInt());
+    builder.setFieldBool8(data.getBool());
+    builder.setFieldString9(data.getString());
+    // We don't populate the message field. Instead we apply the branching factor to the
+    // repeated message field below.
+    builder.setFieldBytes11(data.getBytes());
+    builder.setFieldUint3212(data.getInt());
+    builder.setFieldEnum13(Proto2MessageLite.TestEnum.forNumber(data.getEnum()));
+    builder.setFieldSfixed3214(data.getInt());
+    builder.setFieldSfixed6415(data.getLong());
+    builder.setFieldSint3216(data.getInt());
+    builder.setFieldSint6417(data.getLong());
+
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      builder.addFieldDoubleList18(data.getDouble());
+      builder.addFieldFloatList19(data.getFloat());
+      builder.addFieldInt64List20(data.getLong());
+      builder.addFieldUint64List21(data.getLong());
+      builder.addFieldInt32List22(data.getInt());
+      builder.addFieldFixed64List23(data.getLong());
+      builder.addFieldFixed32List24(data.getInt());
+      builder.addFieldBoolList25(data.getBool());
+      builder.addFieldStringList26(data.getString());
+      // Repeated message field is controlled by the branching factor below.
+      builder.addFieldBytesList28(data.getBytes());
+      builder.addFieldUint32List29(data.getInt());
+      builder.addFieldEnumList30(Proto2MessageLite.TestEnum.forNumber(data.getEnum()));
+      builder.addFieldSfixed32List31(data.getInt());
+      builder.addFieldSfixed64List32(data.getLong());
+      builder.addFieldSint32List33(data.getInt());
+      builder.addFieldSint64List34(data.getLong());
+
+      builder.addFieldDoubleListPacked35(data.getDouble());
+      builder.addFieldFloatListPacked36(data.getFloat());
+      builder.addFieldInt64ListPacked37(data.getLong());
+      builder.addFieldUint64ListPacked38(data.getLong());
+      builder.addFieldInt32ListPacked39(data.getInt());
+      builder.addFieldFixed64ListPacked40(data.getLong());
+      builder.addFieldFixed32ListPacked41(data.getInt());
+      builder.addFieldBoolListPacked42(data.getBool());
+      builder.addFieldUint32ListPacked43(data.getInt());
+      builder.addFieldEnumListPacked44(Proto2MessageLite.TestEnum.forNumber(data.getEnum()));
+      builder.addFieldSfixed32ListPacked45(data.getInt());
+      builder.addFieldSfixed64ListPacked46(data.getLong());
+      builder.addFieldSint32ListPacked47(data.getInt());
+      builder.addFieldSint64ListPacked48(data.getLong());
+    }
+
+    builder.setFieldGroup49(
+        Proto2MessageLite.FieldGroup49.newBuilder().setFieldInt3250(data.getInt()));
+
+    for (int i = 0; i < branchingFactor; ++i) {
+      builder.addFieldGroupList51(
+          Proto2MessageLite.FieldGroupList51.newBuilder().setFieldInt3252(data.getInt()));
+    }
+
+    // Set all required fields.
+    populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
+
+    // Handle the branching factor.
+    if (nextLevel != null) {
+      for (int i = 0; i < branchingFactor; ++i) {
+        builder.addFieldMessageList27(nextLevel.newMessage());
+      }
+    }
+
+    return builder.build();
+  }
+
+  private interface MapValueProvider<T> {
+    public T getValue();
+  }
+
+  private final MapValueProvider<Integer> integerProvider =
+      new MapValueProvider<Integer>() {
+        @Override
+        public Integer getValue() {
+          return data.getInt();
+        }
+      };
+  private final MapValueProvider<Long> longProvider =
+      new MapValueProvider<Long>() {
+        @Override
+        public Long getValue() {
+          return data.getLong();
+        }
+      };
+  private final MapValueProvider<String> stringProvider =
+      new MapValueProvider<String>() {
+        @Override
+        public String getValue() {
+          return data.getString();
+        }
+      };
+  private final MapValueProvider<ByteString> bytesProvider =
+      new MapValueProvider<ByteString>() {
+        @Override
+        public ByteString getValue() {
+          return data.getBytes();
+        }
+      };
+  private final MapValueProvider<Boolean> booleanProvider =
+      new MapValueProvider<Boolean>() {
+        @Override
+        public Boolean getValue() {
+          return data.getBool();
+        }
+      };
+  private final MapValueProvider<Float> floatProvider =
+      new MapValueProvider<Float>() {
+        @Override
+        public Float getValue() {
+          return data.getFloat();
+        }
+      };
+  private final MapValueProvider<Double> doubleProvider =
+      new MapValueProvider<Double>() {
+        @Override
+        public Double getValue() {
+          return data.getDouble();
+        }
+      };
+  private final MapValueProvider<Proto2MessageLite> messageProvider =
+      new MapValueProvider<Proto2MessageLite>() {
+        @Override
+        public Proto2MessageLite getValue() {
+          return newMessage();
+        }
+      };
+  private final MapValueProvider<Proto2MessageLite.TestEnum> enumProvider =
+      new MapValueProvider<Proto2MessageLite.TestEnum>() {
+        @Override
+        public Proto2MessageLite.TestEnum getValue() {
+          return Proto2MessageLite.TestEnum.forNumber(data.getEnum());
+        }
+      };
+
+  private <V> Map<Integer, V> populateIntegerMap(MapValueProvider<V> provider) {
+    Map<Integer, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getInt(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<Long, V> populateLongMap(MapValueProvider<V> provider) {
+    Map<Long, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getLong(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<String, V> populateStringMap(MapValueProvider<V> provider) {
+    Map<String, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getString(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<Boolean, V> populateBooleanMap(MapValueProvider<V> provider) {
+    Map<Boolean, V> map = new HashMap<>();
+    map.put(false, provider.getValue());
+    map.put(true, provider.getValue());
+    return map;
+  }
+
+  public Proto2MessageLiteWithMaps newMessageWithMaps() {
+    Proto2MessageLiteWithMaps.Builder builder = Proto2MessageLiteWithMaps.newBuilder();
+
+    builder.putAllFieldMapBoolBool1(populateBooleanMap(booleanProvider));
+    builder.putAllFieldMapBoolBytes2(populateBooleanMap(bytesProvider));
+    builder.putAllFieldMapBoolDouble3(populateBooleanMap(doubleProvider));
+    builder.putAllFieldMapBoolEnum4(populateBooleanMap(enumProvider));
+    builder.putAllFieldMapBoolFixed325(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolFixed646(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolFloat7(populateBooleanMap(floatProvider));
+    builder.putAllFieldMapBoolInt328(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolInt649(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolMessage10(populateBooleanMap(messageProvider));
+    builder.putAllFieldMapBoolSfixed3211(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolSfixed6412(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolSint3213(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolSint6414(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolString15(populateBooleanMap(stringProvider));
+    builder.putAllFieldMapBoolUint3216(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolUint6417(populateBooleanMap(longProvider));
+    builder.putAllFieldMapFixed32Bool18(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapFixed32Bytes19(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapFixed32Double20(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapFixed32Enum21(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapFixed32Fixed3222(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Fixed6423(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Float24(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapFixed32Int3225(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Int6426(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Message27(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapFixed32Sfixed3228(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Sfixed6429(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Sint3230(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Sint6431(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32String32(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapFixed32Uint3233(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Uint6434(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed64Bool35(populateLongMap(booleanProvider));
+    builder.putAllFieldMapFixed64Bytes36(populateLongMap(bytesProvider));
+    builder.putAllFieldMapFixed64Double37(populateLongMap(doubleProvider));
+    builder.putAllFieldMapFixed64Enum38(populateLongMap(enumProvider));
+    builder.putAllFieldMapFixed64Fixed3239(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Fixed6440(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Float41(populateLongMap(floatProvider));
+    builder.putAllFieldMapFixed64Int3242(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Int6443(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Message44(populateLongMap(messageProvider));
+    builder.putAllFieldMapFixed64Sfixed3245(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Sfixed6446(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Sint3247(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Sint6448(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64String49(populateLongMap(stringProvider));
+    builder.putAllFieldMapFixed64Uint3250(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Uint6451(populateLongMap(longProvider));
+    builder.putAllFieldMapInt32Bool52(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapInt32Bytes53(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapInt32Double54(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapInt32Enum55(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapInt32Fixed3256(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Fixed6457(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Float58(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapInt32Int3259(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Int6460(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Message61(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapInt32Sfixed3262(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Sfixed6463(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Sint3264(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Sint6465(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32String66(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapInt32Uint3267(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Uint6468(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt64Bool69(populateLongMap(booleanProvider));
+    builder.putAllFieldMapInt64Bytes70(populateLongMap(bytesProvider));
+    builder.putAllFieldMapInt64Double71(populateLongMap(doubleProvider));
+    builder.putAllFieldMapInt64Enum72(populateLongMap(enumProvider));
+    builder.putAllFieldMapInt64Fixed3273(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Fixed6474(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Float75(populateLongMap(floatProvider));
+    builder.putAllFieldMapInt64Int3276(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Int6477(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Message78(populateLongMap(messageProvider));
+    builder.putAllFieldMapInt64Sfixed3279(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Sfixed6480(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Sint3281(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Sint6482(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64String83(populateLongMap(stringProvider));
+    builder.putAllFieldMapInt64Uint3284(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Uint6485(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed32Bool86(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapSfixed32Bytes87(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapSfixed32Double88(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapSfixed32Enum89(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapSfixed32Fixed3290(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Fixed6491(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Float92(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapSfixed32Int3293(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Int6494(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Message95(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapSfixed32Sfixed3296(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Sfixed6497(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Sint3298(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Sint6499(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32String100(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapSfixed32Uint32101(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Uint64102(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed64Bool103(populateLongMap(booleanProvider));
+    builder.putAllFieldMapSfixed64Bytes104(populateLongMap(bytesProvider));
+    builder.putAllFieldMapSfixed64Double105(populateLongMap(doubleProvider));
+    builder.putAllFieldMapSfixed64Enum106(populateLongMap(enumProvider));
+    builder.putAllFieldMapSfixed64Fixed32107(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Fixed64108(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Float109(populateLongMap(floatProvider));
+    builder.putAllFieldMapSfixed64Int32110(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Int64111(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Message112(populateLongMap(messageProvider));
+    builder.putAllFieldMapSfixed64Sfixed32113(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Sfixed64114(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Sint32115(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Sint64116(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64String117(populateLongMap(stringProvider));
+    builder.putAllFieldMapSfixed64Uint32118(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Uint64119(populateLongMap(longProvider));
+    builder.putAllFieldMapSint32Bool120(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapSint32Bytes121(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapSint32Double122(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapSint32Enum123(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapSint32Fixed32124(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Fixed64125(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Float126(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapSint32Int32127(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Int64128(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Message129(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapSint32Sfixed32130(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Sfixed64131(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Sint32132(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Sint64133(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32String134(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapSint32Uint32135(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Uint64136(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint64Bool137(populateLongMap(booleanProvider));
+    builder.putAllFieldMapSint64Bytes138(populateLongMap(bytesProvider));
+    builder.putAllFieldMapSint64Double139(populateLongMap(doubleProvider));
+    builder.putAllFieldMapSint64Enum140(populateLongMap(enumProvider));
+    builder.putAllFieldMapSint64Fixed32141(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Fixed64142(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Float143(populateLongMap(floatProvider));
+    builder.putAllFieldMapSint64Int32144(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Int64145(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Message146(populateLongMap(messageProvider));
+    builder.putAllFieldMapSint64Sfixed32147(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Sfixed64148(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Sint32149(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Sint64150(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64String151(populateLongMap(stringProvider));
+    builder.putAllFieldMapSint64Uint32152(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Uint64153(populateLongMap(longProvider));
+    builder.putAllFieldMapStringBool154(populateStringMap(booleanProvider));
+    builder.putAllFieldMapStringBytes155(populateStringMap(bytesProvider));
+    builder.putAllFieldMapStringDouble156(populateStringMap(doubleProvider));
+    builder.putAllFieldMapStringEnum157(populateStringMap(enumProvider));
+    builder.putAllFieldMapStringFixed32158(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringFixed64159(populateStringMap(longProvider));
+    builder.putAllFieldMapStringFloat160(populateStringMap(floatProvider));
+    builder.putAllFieldMapStringInt32161(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringInt64162(populateStringMap(longProvider));
+    builder.putAllFieldMapStringMessage163(populateStringMap(messageProvider));
+    builder.putAllFieldMapStringSfixed32164(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringSfixed64165(populateStringMap(longProvider));
+    builder.putAllFieldMapStringSint32166(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringSint64167(populateStringMap(longProvider));
+    builder.putAllFieldMapStringString168(populateStringMap(stringProvider));
+    builder.putAllFieldMapStringUint32169(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringUint64170(populateStringMap(longProvider));
+    builder.putAllFieldMapUint32Bool171(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapUint32Bytes172(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapUint32Double173(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapUint32Enum174(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapUint32Fixed32175(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Fixed64176(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Float177(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapUint32Int32178(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Int64179(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Message180(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapUint32Sfixed32181(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Sfixed64182(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Sint32183(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Sint64184(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32String185(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapUint32Uint32186(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Uint64187(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint64Bool188(populateLongMap(booleanProvider));
+    builder.putAllFieldMapUint64Bytes189(populateLongMap(bytesProvider));
+    builder.putAllFieldMapUint64Double190(populateLongMap(doubleProvider));
+    builder.putAllFieldMapUint64Enum191(populateLongMap(enumProvider));
+    builder.putAllFieldMapUint64Fixed32192(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Fixed64193(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Float194(populateLongMap(floatProvider));
+    builder.putAllFieldMapUint64Int32195(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Int64196(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Message197(populateLongMap(messageProvider));
+    builder.putAllFieldMapUint64Sfixed32198(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Sfixed64199(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Sint32200(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Sint64201(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64String202(populateLongMap(stringProvider));
+    builder.putAllFieldMapUint64Uint32203(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Uint64204(populateLongMap(longProvider));
+
+    return builder.build();
+  }
+
+  public List<Proto2MessageLite> newMessagesMissingRequiredFields() {
+    List<Proto2MessageLite> results = new ArrayList<>();
+    for (int i = 71; i <= 88; ++i) {
+      Proto2MessageLite.Builder builder = Proto2MessageLite.newBuilder();
+      populateRequiredFields(builder, i);
+      results.add(builder.buildPartial());
+    }
+    {
+      // A nested optional message field is missing required fields.
+      Proto2MessageLite.Builder builder = Proto2MessageLite.newBuilder();
+      populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
+      builder.setFieldMessage10(Proto2MessageLite.getDefaultInstance());
+      results.add(builder.buildPartial());
+    }
+    {
+      // A nested repeated message field is missing required fields.
+      Proto2MessageLite.Builder builder = Proto2MessageLite.newBuilder();
+      populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
+      builder.addFieldMessageList27(Proto2MessageLite.getDefaultInstance());
+      results.add(builder.buildPartial());
+    }
+    {
+      // A nested oneof message field is missing required fields.
+      Proto2MessageLite.Builder builder = Proto2MessageLite.newBuilder();
+      populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
+      builder.setFieldMessage62(Proto2MessageLite.getDefaultInstance());
+      results.add(builder.buildPartial());
+    }
+    return results;
+  }
+
+  // 0 is not a valid field number so we use it to mean no fields are excluded.
+  private static final int INCLUDE_ALL_REQUIRED_FIELDS = 0;
+
+  private void populateRequiredFields(Proto2MessageLite.Builder builder, int excludedFieldNumber) {
+    if (excludedFieldNumber != 71) {
+      builder.setFieldRequiredDouble71(data.getDouble());
+    }
+    if (excludedFieldNumber != 72) {
+      builder.setFieldRequiredFloat72(data.getFloat());
+    }
+    if (excludedFieldNumber != 73) {
+      builder.setFieldRequiredInt6473(data.getLong());
+    }
+    if (excludedFieldNumber != 74) {
+      builder.setFieldRequiredUint6474(data.getLong());
+    }
+    if (excludedFieldNumber != 75) {
+      builder.setFieldRequiredInt3275(data.getInt());
+    }
+    if (excludedFieldNumber != 76) {
+      builder.setFieldRequiredFixed6476(data.getLong());
+    }
+    if (excludedFieldNumber != 77) {
+      builder.setFieldRequiredFixed3277(data.getInt());
+    }
+    if (excludedFieldNumber != 78) {
+      builder.setFieldRequiredBool78(data.getBool());
+    }
+    if (excludedFieldNumber != 79) {
+      builder.setFieldRequiredString79(data.getString());
+    }
+    if (excludedFieldNumber != 80) {
+      builder.setFieldRequiredMessage80(
+          Proto2MessageLite.RequiredNestedMessage.newBuilder().setValue(data.getInt()));
+    }
+    if (excludedFieldNumber != 81) {
+      builder.setFieldRequiredBytes81(data.getBytes());
+    }
+    if (excludedFieldNumber != 82) {
+      builder.setFieldRequiredUint3282(data.getInt());
+    }
+    if (excludedFieldNumber != 83) {
+      builder.setFieldRequiredEnum83(Proto2MessageLite.TestEnum.forNumber(data.getEnum()));
+    }
+    if (excludedFieldNumber != 84) {
+      builder.setFieldRequiredSfixed3284(data.getInt());
+    }
+    if (excludedFieldNumber != 85) {
+      builder.setFieldRequiredSfixed6485(data.getLong());
+    }
+    if (excludedFieldNumber != 86) {
+      builder.setFieldRequiredSint3286(data.getInt());
+    }
+    if (excludedFieldNumber != 87) {
+      builder.setFieldRequiredSint6487(data.getLong());
+    }
+    if (excludedFieldNumber != 88) {
+      builder.setFieldRequiredGroup88(
+          Proto2MessageLite.FieldRequiredGroup88.newBuilder().setFieldInt3289(data.getInt()));
+    }
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto2SchemaTest.java b/java/core/src/test/java/com/google/protobuf/Proto2SchemaTest.java
new file mode 100755
index 0000000..098e7fe
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto2SchemaTest.java
@@ -0,0 +1,49 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.testing.Proto2Testing.Proto2Message;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class Proto2SchemaTest extends AbstractProto2SchemaTest {
+
+  @Override
+  protected Schema<Proto2Message> schema() {
+    return TestSchemas.genericProto2Schema;
+  }
+
+  @Override
+  protected void registerSchemas() {
+    TestSchemas.registerGenericProto2Schemas();
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto2UnknownEnumValueTest.java b/java/core/src/test/java/com/google/protobuf/Proto2UnknownEnumValueTest.java
new file mode 100755
index 0000000..57ac069
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto2UnknownEnumValueTest.java
@@ -0,0 +1,111 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.Descriptors.FieldDescriptor;
+import protobuf_unittest.UnittestProto;
+import protobuf_unittest.UnittestProto.TestAllExtensions;
+import protobuf_unittest.UnittestProto.TestAllTypes;
+import junit.framework.TestCase;
+
+/** Unit tests for proto2 that treats unknown enum values as unknown fields. */
+public class Proto2UnknownEnumValueTest extends TestCase {
+  FieldDescriptor singularField =
+      TestAllTypes.getDescriptor().findFieldByName("optional_nested_enum");
+  FieldDescriptor repeatedField =
+      TestAllTypes.getDescriptor().findFieldByName("repeated_nested_enum");
+  byte[] payload = buildPayloadWithUnknownEnumValues();
+
+  private byte[] buildPayloadWithUnknownEnumValues() {
+    // Builds a payload with unknown enum values.
+    UnknownFieldSet.Builder builder = UnknownFieldSet.newBuilder();
+    builder.addField(
+        singularField.getNumber(),
+        UnknownFieldSet.Field.newBuilder()
+            .addVarint(TestAllTypes.NestedEnum.BAR.getNumber())
+            .addVarint(1901 /* unknown enum value */)
+            .build());
+    builder.addField(
+        repeatedField.getNumber(),
+        UnknownFieldSet.Field.newBuilder()
+            .addVarint(TestAllTypes.NestedEnum.FOO.getNumber())
+            .addVarint(1902 /* unknown enum value */)
+            .addVarint(TestAllTypes.NestedEnum.BAZ.getNumber())
+            .addVarint(1903 /* unknown enum value */)
+            .build());
+    return builder.build().toByteArray();
+  }
+
+  public void testUnknownEnumValues() throws Exception {
+    TestAllTypes message = TestAllTypes.parseFrom(payload);
+
+    // Known enum values should be preserved.
+    assertEquals(TestAllTypes.NestedEnum.BAR, message.getOptionalNestedEnum());
+    assertEquals(2, message.getRepeatedNestedEnumList().size());
+    assertEquals(TestAllTypes.NestedEnum.FOO, message.getRepeatedNestedEnum(0));
+    assertEquals(TestAllTypes.NestedEnum.BAZ, message.getRepeatedNestedEnum(1));
+
+    // Unknown enum values should be found in UnknownFieldSet.
+    UnknownFieldSet unknown = message.getUnknownFields();
+    assertEquals(
+        1901, unknown.getField(singularField.getNumber()).getVarintList().get(0).longValue());
+    assertEquals(
+        1902, unknown.getField(repeatedField.getNumber()).getVarintList().get(0).longValue());
+    assertEquals(
+        1903, unknown.getField(repeatedField.getNumber()).getVarintList().get(1).longValue());
+  }
+
+  public void testExtensionUnknownEnumValues() throws Exception {
+    ExtensionRegistry registry = ExtensionRegistry.newInstance();
+    UnittestProto.registerAllExtensions(registry);
+    TestAllExtensions message = TestAllExtensions.parseFrom(payload, registry);
+
+    assertEquals(
+        TestAllTypes.NestedEnum.BAR,
+        message.getExtension(UnittestProto.optionalNestedEnumExtension));
+    assertEquals(2, message.getExtension(UnittestProto.repeatedNestedEnumExtension).size());
+    assertEquals(
+        TestAllTypes.NestedEnum.FOO,
+        message.getExtension(UnittestProto.repeatedNestedEnumExtension, 0));
+    assertEquals(
+        TestAllTypes.NestedEnum.BAZ,
+        message.getExtension(UnittestProto.repeatedNestedEnumExtension, 1));
+
+    // Unknown enum values should be found in UnknownFieldSet.
+    UnknownFieldSet unknown = message.getUnknownFields();
+    assertEquals(
+        1901, unknown.getField(singularField.getNumber()).getVarintList().get(0).longValue());
+    assertEquals(
+        1902, unknown.getField(repeatedField.getNumber()).getVarintList().get(0).longValue());
+    assertEquals(
+        1903, unknown.getField(repeatedField.getNumber()).getVarintList().get(1).longValue());
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto3LiteSchemaTest.java b/java/core/src/test/java/com/google/protobuf/Proto3LiteSchemaTest.java
new file mode 100755
index 0000000..ac9d6df
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto3LiteSchemaTest.java
@@ -0,0 +1,49 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.testing.Proto3TestingLite.Proto3MessageLite;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class Proto3LiteSchemaTest extends AbstractProto3LiteSchemaTest {
+
+  @Override
+  protected Schema<Proto3MessageLite> schema() {
+    return TestSchemasLite.genericProto3LiteSchema;
+  }
+
+  @Override
+  protected void registerSchemas() {
+    TestSchemasLite.registerGenericProto3LiteSchemas();
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto3MessageFactory.java b/java/core/src/test/java/com/google/protobuf/Proto3MessageFactory.java
new file mode 100755
index 0000000..33d5fe0
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto3MessageFactory.java
@@ -0,0 +1,450 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.testing.Proto3Testing.Proto3Message;
+import com.google.protobuf.testing.Proto3Testing.Proto3MessageWithMaps;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Creates instances of {@link Proto3Message} based on the tree configuration. */
+public final class Proto3MessageFactory implements ExperimentalMessageFactory<Proto3Message> {
+  private final int numRepeatedFields;
+  private final int branchingFactor;
+  private final Proto3MessageFactory nextLevel;
+  private final ExperimentalTestDataProvider data;
+
+  public Proto3MessageFactory(
+      int numRepeatedFields, int stringLength, int branchingFactor, int treeDepth) {
+    this(
+        new ExperimentalTestDataProvider(stringLength),
+        numRepeatedFields,
+        branchingFactor,
+        treeDepth);
+  }
+
+  private Proto3MessageFactory(
+      ExperimentalTestDataProvider data,
+      int numRepeatedFields,
+      int branchingFactor,
+      int treeDepth) {
+    this.numRepeatedFields = numRepeatedFields;
+    this.branchingFactor = branchingFactor;
+    this.data = data;
+    if (treeDepth > 0) {
+      nextLevel = new Proto3MessageFactory(data, numRepeatedFields, branchingFactor, treeDepth - 1);
+    } else {
+      nextLevel = null;
+    }
+  }
+
+  @Override
+  public ExperimentalTestDataProvider dataProvider() {
+    return data;
+  }
+
+  @Override
+  public Proto3Message newMessage() {
+    Proto3Message.Builder builder = Proto3Message.newBuilder();
+    builder.setFieldDouble1(data.getDouble());
+    builder.setFieldFloat2(data.getFloat());
+    builder.setFieldInt643(data.getLong());
+    builder.setFieldUint644(data.getLong());
+    builder.setFieldInt325(data.getInt());
+    builder.setFieldFixed646(data.getLong());
+    builder.setFieldFixed327(data.getInt());
+    builder.setFieldBool8(data.getBool());
+    builder.setFieldString9(data.getString());
+    // We don't populate the message field. Instead we apply the branching factor to the
+    // repeated message field below.
+    builder.setFieldBytes11(data.getBytes());
+    builder.setFieldUint3212(data.getInt());
+    builder.setFieldEnum13Value(data.getEnum());
+    builder.setFieldSfixed3214(data.getInt());
+    builder.setFieldSfixed6415(data.getLong());
+    builder.setFieldSint3216(data.getInt());
+    builder.setFieldSint6417(data.getLong());
+
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      builder.addFieldDoubleList18(data.getDouble());
+      builder.addFieldFloatList19(data.getFloat());
+      builder.addFieldInt64List20(data.getLong());
+      builder.addFieldUint64List21(data.getLong());
+      builder.addFieldInt32List22(data.getInt());
+      builder.addFieldFixed64List23(data.getLong());
+      builder.addFieldFixed32List24(data.getInt());
+      builder.addFieldBoolList25(data.getBool());
+      builder.addFieldStringList26(data.getString());
+      // Repeated message field is controlled by the branching factor below.
+      builder.addFieldBytesList28(data.getBytes());
+      builder.addFieldUint32List29(data.getInt());
+      builder.addFieldEnumList30Value(data.getEnum());
+      builder.addFieldSfixed32List31(data.getInt());
+      builder.addFieldSfixed64List32(data.getLong());
+      builder.addFieldSint32List33(data.getInt());
+      builder.addFieldSint64List34(data.getLong());
+
+      builder.addFieldDoubleListPacked35(data.getDouble());
+      builder.addFieldFloatListPacked36(data.getFloat());
+      builder.addFieldInt64ListPacked37(data.getLong());
+      builder.addFieldUint64ListPacked38(data.getLong());
+      builder.addFieldInt32ListPacked39(data.getInt());
+      builder.addFieldFixed64ListPacked40(data.getLong());
+      builder.addFieldFixed32ListPacked41(data.getInt());
+      builder.addFieldBoolListPacked42(data.getBool());
+      builder.addFieldUint32ListPacked43(data.getInt());
+      builder.addFieldEnumListPacked44Value(data.getEnum());
+      builder.addFieldSfixed32ListPacked45(data.getInt());
+      builder.addFieldSfixed64ListPacked46(data.getLong());
+      builder.addFieldSint32ListPacked47(data.getInt());
+      builder.addFieldSint64ListPacked48(data.getLong());
+    }
+
+    // Handle the branching factor.
+    if (nextLevel != null) {
+      for (int i = 0; i < branchingFactor; ++i) {
+        builder.addFieldMessageList27(nextLevel.newMessage());
+      }
+    }
+
+    return builder.build();
+  }
+
+  private interface MapValueProvider<T> {
+    public T getValue();
+  }
+
+  private final MapValueProvider<Integer> integerProvider =
+      new MapValueProvider<Integer>() {
+        @Override
+        public Integer getValue() {
+          return data.getInt();
+        }
+      };
+  private final MapValueProvider<Long> longProvider =
+      new MapValueProvider<Long>() {
+        @Override
+        public Long getValue() {
+          return data.getLong();
+        }
+      };
+  private final MapValueProvider<String> stringProvider =
+      new MapValueProvider<String>() {
+        @Override
+        public String getValue() {
+          return data.getString();
+        }
+      };
+  private final MapValueProvider<ByteString> bytesProvider =
+      new MapValueProvider<ByteString>() {
+        @Override
+        public ByteString getValue() {
+          return data.getBytes();
+        }
+      };
+  private final MapValueProvider<Boolean> booleanProvider =
+      new MapValueProvider<Boolean>() {
+        @Override
+        public Boolean getValue() {
+          return data.getBool();
+        }
+      };
+  private final MapValueProvider<Float> floatProvider =
+      new MapValueProvider<Float>() {
+        @Override
+        public Float getValue() {
+          return data.getFloat();
+        }
+      };
+  private final MapValueProvider<Double> doubleProvider =
+      new MapValueProvider<Double>() {
+        @Override
+        public Double getValue() {
+          return data.getDouble();
+        }
+      };
+  private final MapValueProvider<Proto3Message> messageProvider =
+      new MapValueProvider<Proto3Message>() {
+        @Override
+        public Proto3Message getValue() {
+          return newMessage();
+        }
+      };
+  private final MapValueProvider<Proto3Message.TestEnum> enumProvider =
+      new MapValueProvider<Proto3Message.TestEnum>() {
+        @Override
+        public Proto3Message.TestEnum getValue() {
+          return Proto3Message.TestEnum.forNumber(data.getEnum());
+        }
+      };
+
+  private <V> Map<Integer, V> populateIntegerMap(MapValueProvider<V> provider) {
+    Map<Integer, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getInt(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<Long, V> populateLongMap(MapValueProvider<V> provider) {
+    Map<Long, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getLong(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<String, V> populateStringMap(MapValueProvider<V> provider) {
+    Map<String, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getString(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<Boolean, V> populateBooleanMap(MapValueProvider<V> provider) {
+    Map<Boolean, V> map = new HashMap<>();
+    map.put(false, provider.getValue());
+    map.put(true, provider.getValue());
+    return map;
+  }
+
+  public Proto3MessageWithMaps newMessageWithMaps() {
+    Proto3MessageWithMaps.Builder builder = Proto3MessageWithMaps.newBuilder();
+
+    builder.putAllFieldMapBoolBool1(populateBooleanMap(booleanProvider));
+    builder.putAllFieldMapBoolBytes2(populateBooleanMap(bytesProvider));
+    builder.putAllFieldMapBoolDouble3(populateBooleanMap(doubleProvider));
+    builder.putAllFieldMapBoolEnum4(populateBooleanMap(enumProvider));
+    builder.putAllFieldMapBoolFixed325(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolFixed646(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolFloat7(populateBooleanMap(floatProvider));
+    builder.putAllFieldMapBoolInt328(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolInt649(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolMessage10(populateBooleanMap(messageProvider));
+    builder.putAllFieldMapBoolSfixed3211(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolSfixed6412(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolSint3213(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolSint6414(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolString15(populateBooleanMap(stringProvider));
+    builder.putAllFieldMapBoolUint3216(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolUint6417(populateBooleanMap(longProvider));
+    builder.putAllFieldMapFixed32Bool18(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapFixed32Bytes19(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapFixed32Double20(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapFixed32Enum21(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapFixed32Fixed3222(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Fixed6423(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Float24(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapFixed32Int3225(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Int6426(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Message27(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapFixed32Sfixed3228(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Sfixed6429(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Sint3230(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Sint6431(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32String32(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapFixed32Uint3233(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Uint6434(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed64Bool35(populateLongMap(booleanProvider));
+    builder.putAllFieldMapFixed64Bytes36(populateLongMap(bytesProvider));
+    builder.putAllFieldMapFixed64Double37(populateLongMap(doubleProvider));
+    builder.putAllFieldMapFixed64Enum38(populateLongMap(enumProvider));
+    builder.putAllFieldMapFixed64Fixed3239(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Fixed6440(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Float41(populateLongMap(floatProvider));
+    builder.putAllFieldMapFixed64Int3242(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Int6443(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Message44(populateLongMap(messageProvider));
+    builder.putAllFieldMapFixed64Sfixed3245(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Sfixed6446(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Sint3247(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Sint6448(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64String49(populateLongMap(stringProvider));
+    builder.putAllFieldMapFixed64Uint3250(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Uint6451(populateLongMap(longProvider));
+    builder.putAllFieldMapInt32Bool52(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapInt32Bytes53(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapInt32Double54(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapInt32Enum55(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapInt32Fixed3256(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Fixed6457(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Float58(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapInt32Int3259(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Int6460(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Message61(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapInt32Sfixed3262(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Sfixed6463(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Sint3264(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Sint6465(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32String66(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapInt32Uint3267(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Uint6468(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt64Bool69(populateLongMap(booleanProvider));
+    builder.putAllFieldMapInt64Bytes70(populateLongMap(bytesProvider));
+    builder.putAllFieldMapInt64Double71(populateLongMap(doubleProvider));
+    builder.putAllFieldMapInt64Enum72(populateLongMap(enumProvider));
+    builder.putAllFieldMapInt64Fixed3273(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Fixed6474(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Float75(populateLongMap(floatProvider));
+    builder.putAllFieldMapInt64Int3276(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Int6477(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Message78(populateLongMap(messageProvider));
+    builder.putAllFieldMapInt64Sfixed3279(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Sfixed6480(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Sint3281(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Sint6482(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64String83(populateLongMap(stringProvider));
+    builder.putAllFieldMapInt64Uint3284(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Uint6485(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed32Bool86(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapSfixed32Bytes87(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapSfixed32Double88(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapSfixed32Enum89(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapSfixed32Fixed3290(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Fixed6491(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Float92(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapSfixed32Int3293(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Int6494(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Message95(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapSfixed32Sfixed3296(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Sfixed6497(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Sint3298(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Sint6499(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32String100(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapSfixed32Uint32101(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Uint64102(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed64Bool103(populateLongMap(booleanProvider));
+    builder.putAllFieldMapSfixed64Bytes104(populateLongMap(bytesProvider));
+    builder.putAllFieldMapSfixed64Double105(populateLongMap(doubleProvider));
+    builder.putAllFieldMapSfixed64Enum106(populateLongMap(enumProvider));
+    builder.putAllFieldMapSfixed64Fixed32107(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Fixed64108(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Float109(populateLongMap(floatProvider));
+    builder.putAllFieldMapSfixed64Int32110(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Int64111(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Message112(populateLongMap(messageProvider));
+    builder.putAllFieldMapSfixed64Sfixed32113(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Sfixed64114(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Sint32115(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Sint64116(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64String117(populateLongMap(stringProvider));
+    builder.putAllFieldMapSfixed64Uint32118(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Uint64119(populateLongMap(longProvider));
+    builder.putAllFieldMapSint32Bool120(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapSint32Bytes121(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapSint32Double122(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapSint32Enum123(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapSint32Fixed32124(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Fixed64125(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Float126(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapSint32Int32127(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Int64128(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Message129(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapSint32Sfixed32130(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Sfixed64131(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Sint32132(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Sint64133(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32String134(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapSint32Uint32135(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Uint64136(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint64Bool137(populateLongMap(booleanProvider));
+    builder.putAllFieldMapSint64Bytes138(populateLongMap(bytesProvider));
+    builder.putAllFieldMapSint64Double139(populateLongMap(doubleProvider));
+    builder.putAllFieldMapSint64Enum140(populateLongMap(enumProvider));
+    builder.putAllFieldMapSint64Fixed32141(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Fixed64142(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Float143(populateLongMap(floatProvider));
+    builder.putAllFieldMapSint64Int32144(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Int64145(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Message146(populateLongMap(messageProvider));
+    builder.putAllFieldMapSint64Sfixed32147(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Sfixed64148(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Sint32149(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Sint64150(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64String151(populateLongMap(stringProvider));
+    builder.putAllFieldMapSint64Uint32152(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Uint64153(populateLongMap(longProvider));
+    builder.putAllFieldMapStringBool154(populateStringMap(booleanProvider));
+    builder.putAllFieldMapStringBytes155(populateStringMap(bytesProvider));
+    builder.putAllFieldMapStringDouble156(populateStringMap(doubleProvider));
+    builder.putAllFieldMapStringEnum157(populateStringMap(enumProvider));
+    builder.putAllFieldMapStringFixed32158(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringFixed64159(populateStringMap(longProvider));
+    builder.putAllFieldMapStringFloat160(populateStringMap(floatProvider));
+    builder.putAllFieldMapStringInt32161(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringInt64162(populateStringMap(longProvider));
+    builder.putAllFieldMapStringMessage163(populateStringMap(messageProvider));
+    builder.putAllFieldMapStringSfixed32164(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringSfixed64165(populateStringMap(longProvider));
+    builder.putAllFieldMapStringSint32166(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringSint64167(populateStringMap(longProvider));
+    builder.putAllFieldMapStringString168(populateStringMap(stringProvider));
+    builder.putAllFieldMapStringUint32169(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringUint64170(populateStringMap(longProvider));
+    builder.putAllFieldMapUint32Bool171(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapUint32Bytes172(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapUint32Double173(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapUint32Enum174(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapUint32Fixed32175(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Fixed64176(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Float177(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapUint32Int32178(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Int64179(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Message180(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapUint32Sfixed32181(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Sfixed64182(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Sint32183(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Sint64184(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32String185(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapUint32Uint32186(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Uint64187(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint64Bool188(populateLongMap(booleanProvider));
+    builder.putAllFieldMapUint64Bytes189(populateLongMap(bytesProvider));
+    builder.putAllFieldMapUint64Double190(populateLongMap(doubleProvider));
+    builder.putAllFieldMapUint64Enum191(populateLongMap(enumProvider));
+    builder.putAllFieldMapUint64Fixed32192(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Fixed64193(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Float194(populateLongMap(floatProvider));
+    builder.putAllFieldMapUint64Int32195(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Int64196(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Message197(populateLongMap(messageProvider));
+    builder.putAllFieldMapUint64Sfixed32198(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Sfixed64199(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Sint32200(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Sint64201(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64String202(populateLongMap(stringProvider));
+    builder.putAllFieldMapUint64Uint32203(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Uint64204(populateLongMap(longProvider));
+
+    return builder.build();
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto3MessageInfoFactory.java b/java/core/src/test/java/com/google/protobuf/Proto3MessageInfoFactory.java
new file mode 100755
index 0000000..364071b
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto3MessageInfoFactory.java
@@ -0,0 +1,506 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.FieldInfo.forField;
+import static com.google.protobuf.FieldInfo.forMapField;
+import static com.google.protobuf.FieldInfo.forOneofMemberField;
+import static com.google.protobuf.FieldInfo.forRepeatedMessageField;
+
+import com.google.protobuf.testing.Proto2Testing.Proto2MessageWithMaps;
+import com.google.protobuf.testing.Proto3Testing.Proto3Empty;
+import com.google.protobuf.testing.Proto3Testing.Proto3Message;
+import com.google.protobuf.testing.Proto3Testing.Proto3MessageWithMaps;
+import java.lang.reflect.Field;
+
+/** A factory that generates a hard-coded info for {@link Proto3Message}. */
+public final class Proto3MessageInfoFactory implements MessageInfoFactory {
+  private static final Proto3MessageInfoFactory INSTANCE = new Proto3MessageInfoFactory();
+
+  private Proto3MessageInfoFactory() {}
+
+  public static Proto3MessageInfoFactory getInstance() {
+    return INSTANCE;
+  }
+
+  @Override
+  public boolean isSupported(Class<?> clazz) {
+    return true;
+  }
+
+  @Override
+  public MessageInfo messageInfoFor(Class<?> clazz) {
+    if (Proto3Message.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto3Message();
+    } else if (Proto3Empty.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto3Empty();
+    } else if (Proto3MessageWithMaps.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto3MessageWithMaps();
+    } else {
+      throw new IllegalArgumentException("Unsupported class: " + clazz.getName());
+    }
+  }
+
+  /**
+   * Creates a new hard-coded info for {@link Proto3Message}. Each time this is called, we manually
+   * go through the entire process of what a message would do if it self-registered its own info,
+   * including looking up each field by name. This is done for benchmarking purposes, so that we get
+   * a more accurate representation of the time it takes to perform this process.
+   */
+  private static StructuralMessageInfo newMessageInfoForProto3Message() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(48);
+    lookupFieldsByName(builder);
+    return builder.build();
+  }
+
+  private static void lookupFieldsByName(StructuralMessageInfo.Builder builder) {
+    builder.withDefaultInstance(Proto3Message.getDefaultInstance());
+    builder.withSyntax(ProtoSyntax.PROTO3);
+    builder.withField(forField(field("fieldDouble1_"), 1, FieldType.DOUBLE, true));
+    builder.withField(forField(field("fieldFloat2_"), 2, FieldType.FLOAT, true));
+    builder.withField(forField(field("fieldInt643_"), 3, FieldType.INT64, true));
+    builder.withField(forField(field("fieldUint644_"), 4, FieldType.UINT64, true));
+    builder.withField(forField(field("fieldInt325_"), 5, FieldType.INT32, true));
+    builder.withField(forField(field("fieldFixed646_"), 6, FieldType.FIXED64, true));
+    builder.withField(forField(field("fieldFixed327_"), 7, FieldType.FIXED32, true));
+    builder.withField(forField(field("fieldBool8_"), 8, FieldType.BOOL, true));
+    builder.withField(forField(field("fieldString9_"), 9, FieldType.STRING, true));
+    builder.withField(forField(field("fieldMessage10_"), 10, FieldType.MESSAGE, true));
+    builder.withField(forField(field("fieldBytes11_"), 11, FieldType.BYTES, true));
+    builder.withField(forField(field("fieldUint3212_"), 12, FieldType.UINT32, true));
+    builder.withField(forField(field("fieldEnum13_"), 13, FieldType.ENUM, true));
+    builder.withField(forField(field("fieldSfixed3214_"), 14, FieldType.SFIXED32, true));
+    builder.withField(forField(field("fieldSfixed6415_"), 15, FieldType.SFIXED64, true));
+    builder.withField(forField(field("fieldSint3216_"), 16, FieldType.SINT32, true));
+    builder.withField(forField(field("fieldSint6417_"), 17, FieldType.SINT64, true));
+    builder.withField(forField(field("fieldDoubleList18_"), 18, FieldType.DOUBLE_LIST, true));
+    builder.withField(forField(field("fieldFloatList19_"), 19, FieldType.FLOAT_LIST, true));
+    builder.withField(forField(field("fieldInt64List20_"), 20, FieldType.INT64_LIST, true));
+    builder.withField(forField(field("fieldUint64List21_"), 21, FieldType.UINT64_LIST, true));
+    builder.withField(forField(field("fieldInt32List22_"), 22, FieldType.INT32_LIST, true));
+    builder.withField(forField(field("fieldFixed64List23_"), 23, FieldType.FIXED64_LIST, true));
+    builder.withField(forField(field("fieldFixed32List24_"), 24, FieldType.FIXED32_LIST, true));
+    builder.withField(forField(field("fieldBoolList25_"), 25, FieldType.BOOL_LIST, true));
+    builder.withField(forField(field("fieldStringList26_"), 26, FieldType.STRING_LIST, true));
+    builder.withField(
+        forRepeatedMessageField(
+            field("fieldMessageList27_"), 27, FieldType.MESSAGE_LIST, Proto3Message.class));
+    builder.withField(forField(field("fieldBytesList28_"), 28, FieldType.BYTES_LIST, true));
+    builder.withField(forField(field("fieldUint32List29_"), 29, FieldType.UINT32_LIST, true));
+    builder.withField(forField(field("fieldEnumList30_"), 30, FieldType.ENUM_LIST, true));
+    builder.withField(forField(field("fieldSfixed32List31_"), 31, FieldType.SFIXED32_LIST, true));
+    builder.withField(forField(field("fieldSfixed64List32_"), 32, FieldType.SFIXED64_LIST, true));
+    builder.withField(forField(field("fieldSint32List33_"), 33, FieldType.SINT32_LIST, true));
+    builder.withField(forField(field("fieldSint64List34_"), 34, FieldType.SINT64_LIST, true));
+    builder.withField(
+        forField(field("fieldDoubleListPacked35_"), 35, FieldType.DOUBLE_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldFloatListPacked36_"), 36, FieldType.FLOAT_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldInt64ListPacked37_"), 37, FieldType.INT64_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldUint64ListPacked38_"), 38, FieldType.UINT64_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldInt32ListPacked39_"), 39, FieldType.INT32_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldFixed64ListPacked40_"), 40, FieldType.FIXED64_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldFixed32ListPacked41_"), 41, FieldType.FIXED32_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldBoolListPacked42_"), 42, FieldType.BOOL_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldUint32ListPacked43_"), 43, FieldType.UINT32_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldEnumListPacked44_"), 44, FieldType.ENUM_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldSfixed32ListPacked45_"), 45, FieldType.SFIXED32_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldSfixed64ListPacked46_"), 46, FieldType.SFIXED64_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldSint32ListPacked47_"), 47, FieldType.SINT32_LIST_PACKED, true));
+    builder.withField(
+        forField(field("fieldSint64ListPacked48_"), 48, FieldType.SINT64_LIST_PACKED, true));
+
+    OneofInfo oneof = new OneofInfo(0, field("testOneofCase_"), field("testOneof_"));
+    builder.withField(forOneofMemberField(53, FieldType.DOUBLE, oneof, Double.class, true, null));
+    builder.withField(forOneofMemberField(54, FieldType.FLOAT, oneof, Float.class, true, null));
+    builder.withField(forOneofMemberField(55, FieldType.INT64, oneof, Long.class, true, null));
+    builder.withField(forOneofMemberField(56, FieldType.UINT64, oneof, Long.class, true, null));
+    builder.withField(forOneofMemberField(57, FieldType.INT32, oneof, Integer.class, true, null));
+    builder.withField(forOneofMemberField(58, FieldType.FIXED64, oneof, Long.class, true, null));
+    builder.withField(forOneofMemberField(59, FieldType.FIXED32, oneof, Integer.class, true, null));
+    builder.withField(forOneofMemberField(60, FieldType.BOOL, oneof, Boolean.class, true, null));
+    builder.withField(forOneofMemberField(61, FieldType.STRING, oneof, String.class, true, null));
+    builder.withField(
+        forOneofMemberField(62, FieldType.MESSAGE, oneof, Proto3Message.class, true, null));
+    builder.withField(
+        forOneofMemberField(63, FieldType.BYTES, oneof, ByteString.class, true, null));
+    builder.withField(forOneofMemberField(64, FieldType.UINT32, oneof, Integer.class, true, null));
+    builder.withField(
+        forOneofMemberField(65, FieldType.SFIXED32, oneof, Integer.class, true, null));
+    builder.withField(forOneofMemberField(66, FieldType.SFIXED64, oneof, Long.class, true, null));
+    builder.withField(forOneofMemberField(67, FieldType.SINT32, oneof, Integer.class, true, null));
+    builder.withField(forOneofMemberField(68, FieldType.SINT64, oneof, Long.class, true, null));
+  }
+
+  private StructuralMessageInfo newMessageInfoForProto3Empty() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO3);
+    return builder.build();
+  }
+
+  private StructuralMessageInfo newMessageInfoForProto3MessageWithMaps() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder();
+    builder.withSyntax(ProtoSyntax.PROTO3);
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_bool_1", 1));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_bytes_2", 2));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_double_3", 3));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_enum_4", 4));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_fixed32_5", 5));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_fixed64_6", 6));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_float_7", 7));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_int32_8", 8));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_int64_9", 9));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_message_10", 10));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_sfixed32_11", 11));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_sfixed64_12", 12));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_sint32_13", 13));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_sint64_14", 14));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_string_15", 15));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_uint32_16", 16));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_bool_uint64_17", 17));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_bool_18", 18));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_bytes_19", 19));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_double_20", 20));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_enum_21", 21));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_fixed32_22", 22));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_fixed64_23", 23));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_float_24", 24));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_int32_25", 25));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_int64_26", 26));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_message_27", 27));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_sfixed32_28", 28));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_sfixed64_29", 29));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_sint32_30", 30));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_sint64_31", 31));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_string_32", 32));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_uint32_33", 33));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed32_uint64_34", 34));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_bool_35", 35));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_bytes_36", 36));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_double_37", 37));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_enum_38", 38));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_fixed32_39", 39));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_fixed64_40", 40));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_float_41", 41));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_int32_42", 42));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_int64_43", 43));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_message_44", 44));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_sfixed32_45", 45));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_sfixed64_46", 46));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_sint32_47", 47));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_sint64_48", 48));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_string_49", 49));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_uint32_50", 50));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_fixed64_uint64_51", 51));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_bool_52", 52));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_bytes_53", 53));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_double_54", 54));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_enum_55", 55));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_fixed32_56", 56));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_fixed64_57", 57));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_float_58", 58));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_int32_59", 59));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_int64_60", 60));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_message_61", 61));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_sfixed32_62", 62));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_sfixed64_63", 63));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_sint32_64", 64));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_sint64_65", 65));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_string_66", 66));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_uint32_67", 67));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int32_uint64_68", 68));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_bool_69", 69));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_bytes_70", 70));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_double_71", 71));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_enum_72", 72));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_fixed32_73", 73));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_fixed64_74", 74));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_float_75", 75));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_int32_76", 76));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_int64_77", 77));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_message_78", 78));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_sfixed32_79", 79));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_sfixed64_80", 80));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_sint32_81", 81));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_sint64_82", 82));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_string_83", 83));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_uint32_84", 84));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_int64_uint64_85", 85));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_bool_86", 86));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_bytes_87", 87));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_double_88", 88));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_enum_89", 89));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_fixed32_90", 90));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_fixed64_91", 91));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_float_92", 92));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_int32_93", 93));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_int64_94", 94));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_message_95", 95));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_sfixed32_96", 96));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_sfixed64_97", 97));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_sint32_98", 98));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_sint64_99", 99));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_string_100", 100));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_uint32_101", 101));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed32_uint64_102", 102));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_bool_103", 103));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_bytes_104", 104));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_double_105", 105));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_enum_106", 106));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_fixed32_107", 107));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_fixed64_108", 108));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_float_109", 109));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_int32_110", 110));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_int64_111", 111));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_message_112", 112));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_sfixed32_113", 113));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_sfixed64_114", 114));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_sint32_115", 115));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_sint64_116", 116));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_string_117", 117));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_uint32_118", 118));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sfixed64_uint64_119", 119));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_bool_120", 120));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_bytes_121", 121));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_double_122", 122));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_enum_123", 123));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_fixed32_124", 124));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_fixed64_125", 125));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_float_126", 126));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_int32_127", 127));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_int64_128", 128));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_message_129", 129));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_sfixed32_130", 130));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_sfixed64_131", 131));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_sint32_132", 132));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_sint64_133", 133));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_string_134", 134));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_uint32_135", 135));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint32_uint64_136", 136));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_bool_137", 137));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_bytes_138", 138));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_double_139", 139));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_enum_140", 140));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_fixed32_141", 141));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_fixed64_142", 142));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_float_143", 143));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_int32_144", 144));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_int64_145", 145));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_message_146", 146));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_sfixed32_147", 147));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_sfixed64_148", 148));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_sint32_149", 149));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_sint64_150", 150));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_string_151", 151));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_uint32_152", 152));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_sint64_uint64_153", 153));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_bool_154", 154));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_bytes_155", 155));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_double_156", 156));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_enum_157", 157));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_fixed32_158", 158));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_fixed64_159", 159));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_float_160", 160));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_int32_161", 161));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_int64_162", 162));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_message_163", 163));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_sfixed32_164", 164));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_sfixed64_165", 165));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_sint32_166", 166));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_sint64_167", 167));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_string_168", 168));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_uint32_169", 169));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_string_uint64_170", 170));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_bool_171", 171));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_bytes_172", 172));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_double_173", 173));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_enum_174", 174));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_fixed32_175", 175));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_fixed64_176", 176));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_float_177", 177));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_int32_178", 178));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_int64_179", 179));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_message_180", 180));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_sfixed32_181", 181));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_sfixed64_182", 182));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_sint32_183", 183));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_sint64_184", 184));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_string_185", 185));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_uint32_186", 186));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint32_uint64_187", 187));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_bool_188", 188));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_bytes_189", 189));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_double_190", 190));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_enum_191", 191));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_fixed32_192", 192));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_fixed64_193", 193));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_float_194", 194));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_int32_195", 195));
+    builder.withField(mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_int64_196", 196));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_message_197", 197));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_sfixed32_198", 198));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_sfixed64_199", 199));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_sint32_200", 200));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_sint64_201", 201));
+    builder.withField(
+        mapFieldInfo(Proto3MessageWithMaps.class, "field_map_uint64_string_202", 202));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_uint32_203", 203));
+    builder.withField(
+        mapFieldInfo(Proto2MessageWithMaps.class, "field_map_uint64_uint64_204", 204));
+    return builder.build();
+  }
+
+  private static Field field(String name) {
+    return field(Proto3Message.class, name);
+  }
+
+  private static Field field(Class<?> clazz, String name) {
+    try {
+      return clazz.getDeclaredField(name);
+    } catch (NoSuchFieldException | SecurityException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private static FieldInfo mapFieldInfo(Class<?> clazz, String fieldName, int fieldNumber) {
+    try {
+      return forMapField(
+          field(clazz, SchemaUtil.toCamelCase(fieldName, false) + "_"),
+          fieldNumber,
+          SchemaUtil.getMapDefaultEntry(clazz, fieldName),
+          null);
+    } catch (Throwable t) {
+      throw new RuntimeException(t);
+    }
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto3MessageLiteFactory.java b/java/core/src/test/java/com/google/protobuf/Proto3MessageLiteFactory.java
new file mode 100755
index 0000000..2f6947d
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto3MessageLiteFactory.java
@@ -0,0 +1,452 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.testing.Proto3TestingLite.Proto3MessageLite;
+import com.google.protobuf.testing.Proto3TestingLite.Proto3MessageLiteWithMaps;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Creates instances of {@link Proto3MessageLite} based on the tree configuration. */
+public final class Proto3MessageLiteFactory
+    implements ExperimentalMessageFactory<Proto3MessageLite> {
+  private final int numRepeatedFields;
+  private final int branchingFactor;
+  private final Proto3MessageLiteFactory nextLevel;
+  private final ExperimentalTestDataProvider data;
+
+  public Proto3MessageLiteFactory(
+      int numRepeatedFields, int stringLength, int branchingFactor, int treeDepth) {
+    this(
+        new ExperimentalTestDataProvider(stringLength),
+        numRepeatedFields,
+        branchingFactor,
+        treeDepth);
+  }
+
+  private Proto3MessageLiteFactory(
+      ExperimentalTestDataProvider data,
+      int numRepeatedFields,
+      int branchingFactor,
+      int treeDepth) {
+    this.numRepeatedFields = numRepeatedFields;
+    this.branchingFactor = branchingFactor;
+    this.data = data;
+    if (treeDepth > 0) {
+      nextLevel =
+          new Proto3MessageLiteFactory(data, numRepeatedFields, branchingFactor, treeDepth - 1);
+    } else {
+      nextLevel = null;
+    }
+  }
+
+  @Override
+  public ExperimentalTestDataProvider dataProvider() {
+    return data;
+  }
+
+  @Override
+  public Proto3MessageLite newMessage() {
+    Proto3MessageLite.Builder builder = Proto3MessageLite.newBuilder();
+    builder.setFieldDouble1(data.getDouble());
+    builder.setFieldFloat2(data.getFloat());
+    builder.setFieldInt643(data.getLong());
+    builder.setFieldUint644(data.getLong());
+    builder.setFieldInt325(data.getInt());
+    builder.setFieldFixed646(data.getLong());
+    builder.setFieldFixed327(data.getInt());
+    builder.setFieldBool8(data.getBool());
+    builder.setFieldString9(data.getString());
+    // We don't populate the message field. Instead we apply the branching factor to the
+    // repeated message field below.
+    builder.setFieldBytes11(data.getBytes());
+    builder.setFieldUint3212(data.getInt());
+    builder.setFieldEnum13Value(data.getEnum());
+    builder.setFieldSfixed3214(data.getInt());
+    builder.setFieldSfixed6415(data.getLong());
+    builder.setFieldSint3216(data.getInt());
+    builder.setFieldSint6417(data.getLong());
+
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      builder.addFieldDoubleList18(data.getDouble());
+      builder.addFieldFloatList19(data.getFloat());
+      builder.addFieldInt64List20(data.getLong());
+      builder.addFieldUint64List21(data.getLong());
+      builder.addFieldInt32List22(data.getInt());
+      builder.addFieldFixed64List23(data.getLong());
+      builder.addFieldFixed32List24(data.getInt());
+      builder.addFieldBoolList25(data.getBool());
+      builder.addFieldStringList26(data.getString());
+      // Repeated message field is controlled by the branching factor below.
+      builder.addFieldBytesList28(data.getBytes());
+      builder.addFieldUint32List29(data.getInt());
+      builder.addFieldEnumList30Value(data.getEnum());
+      builder.addFieldSfixed32List31(data.getInt());
+      builder.addFieldSfixed64List32(data.getLong());
+      builder.addFieldSint32List33(data.getInt());
+      builder.addFieldSint64List34(data.getLong());
+
+      builder.addFieldDoubleListPacked35(data.getDouble());
+      builder.addFieldFloatListPacked36(data.getFloat());
+      builder.addFieldInt64ListPacked37(data.getLong());
+      builder.addFieldUint64ListPacked38(data.getLong());
+      builder.addFieldInt32ListPacked39(data.getInt());
+      builder.addFieldFixed64ListPacked40(data.getLong());
+      builder.addFieldFixed32ListPacked41(data.getInt());
+      builder.addFieldBoolListPacked42(data.getBool());
+      builder.addFieldUint32ListPacked43(data.getInt());
+      builder.addFieldEnumListPacked44Value(data.getEnum());
+      builder.addFieldSfixed32ListPacked45(data.getInt());
+      builder.addFieldSfixed64ListPacked46(data.getLong());
+      builder.addFieldSint32ListPacked47(data.getInt());
+      builder.addFieldSint64ListPacked48(data.getLong());
+    }
+
+    // Handle the branching factor.
+    if (nextLevel != null) {
+      for (int i = 0; i < branchingFactor; ++i) {
+        builder.addFieldMessageList27(nextLevel.newMessage());
+      }
+    }
+
+    return builder.build();
+  }
+
+  private interface MapValueProvider<T> {
+    public T getValue();
+  }
+
+  private final MapValueProvider<Integer> integerProvider =
+      new MapValueProvider<Integer>() {
+        @Override
+        public Integer getValue() {
+          return data.getInt();
+        }
+      };
+  private final MapValueProvider<Long> longProvider =
+      new MapValueProvider<Long>() {
+        @Override
+        public Long getValue() {
+          return data.getLong();
+        }
+      };
+  private final MapValueProvider<String> stringProvider =
+      new MapValueProvider<String>() {
+        @Override
+        public String getValue() {
+          return data.getString();
+        }
+      };
+  private final MapValueProvider<ByteString> bytesProvider =
+      new MapValueProvider<ByteString>() {
+        @Override
+        public ByteString getValue() {
+          return data.getBytes();
+        }
+      };
+  private final MapValueProvider<Boolean> booleanProvider =
+      new MapValueProvider<Boolean>() {
+        @Override
+        public Boolean getValue() {
+          return data.getBool();
+        }
+      };
+  private final MapValueProvider<Float> floatProvider =
+      new MapValueProvider<Float>() {
+        @Override
+        public Float getValue() {
+          return data.getFloat();
+        }
+      };
+  private final MapValueProvider<Double> doubleProvider =
+      new MapValueProvider<Double>() {
+        @Override
+        public Double getValue() {
+          return data.getDouble();
+        }
+      };
+  private final MapValueProvider<Proto3MessageLite> messageProvider =
+      new MapValueProvider<Proto3MessageLite>() {
+        @Override
+        public Proto3MessageLite getValue() {
+          return newMessage();
+        }
+      };
+  private final MapValueProvider<Proto3MessageLite.TestEnum> enumProvider =
+      new MapValueProvider<Proto3MessageLite.TestEnum>() {
+        @Override
+        public Proto3MessageLite.TestEnum getValue() {
+          return Proto3MessageLite.TestEnum.forNumber(data.getEnum());
+        }
+      };
+
+  private <V> Map<Integer, V> populateIntegerMap(MapValueProvider<V> provider) {
+    Map<Integer, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getInt(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<Long, V> populateLongMap(MapValueProvider<V> provider) {
+    Map<Long, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getLong(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<String, V> populateStringMap(MapValueProvider<V> provider) {
+    Map<String, V> map = new HashMap<>();
+    for (int i = 0; i < numRepeatedFields; ++i) {
+      map.put(data.getString(), provider.getValue());
+    }
+    return map;
+  }
+
+  private <V> Map<Boolean, V> populateBooleanMap(MapValueProvider<V> provider) {
+    Map<Boolean, V> map = new HashMap<>();
+    map.put(false, provider.getValue());
+    map.put(true, provider.getValue());
+    return map;
+  }
+
+  public Proto3MessageLiteWithMaps newMessageWithMaps() {
+    Proto3MessageLiteWithMaps.Builder builder = Proto3MessageLiteWithMaps.newBuilder();
+
+    builder.putAllFieldMapBoolBool1(populateBooleanMap(booleanProvider));
+    builder.putAllFieldMapBoolBytes2(populateBooleanMap(bytesProvider));
+    builder.putAllFieldMapBoolDouble3(populateBooleanMap(doubleProvider));
+    builder.putAllFieldMapBoolEnum4(populateBooleanMap(enumProvider));
+    builder.putAllFieldMapBoolFixed325(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolFixed646(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolFloat7(populateBooleanMap(floatProvider));
+    builder.putAllFieldMapBoolInt328(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolInt649(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolMessage10(populateBooleanMap(messageProvider));
+    builder.putAllFieldMapBoolSfixed3211(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolSfixed6412(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolSint3213(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolSint6414(populateBooleanMap(longProvider));
+    builder.putAllFieldMapBoolString15(populateBooleanMap(stringProvider));
+    builder.putAllFieldMapBoolUint3216(populateBooleanMap(integerProvider));
+    builder.putAllFieldMapBoolUint6417(populateBooleanMap(longProvider));
+    builder.putAllFieldMapFixed32Bool18(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapFixed32Bytes19(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapFixed32Double20(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapFixed32Enum21(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapFixed32Fixed3222(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Fixed6423(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Float24(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapFixed32Int3225(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Int6426(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Message27(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapFixed32Sfixed3228(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Sfixed6429(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32Sint3230(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Sint6431(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed32String32(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapFixed32Uint3233(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapFixed32Uint6434(populateIntegerMap(longProvider));
+    builder.putAllFieldMapFixed64Bool35(populateLongMap(booleanProvider));
+    builder.putAllFieldMapFixed64Bytes36(populateLongMap(bytesProvider));
+    builder.putAllFieldMapFixed64Double37(populateLongMap(doubleProvider));
+    builder.putAllFieldMapFixed64Enum38(populateLongMap(enumProvider));
+    builder.putAllFieldMapFixed64Fixed3239(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Fixed6440(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Float41(populateLongMap(floatProvider));
+    builder.putAllFieldMapFixed64Int3242(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Int6443(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Message44(populateLongMap(messageProvider));
+    builder.putAllFieldMapFixed64Sfixed3245(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Sfixed6446(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64Sint3247(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Sint6448(populateLongMap(longProvider));
+    builder.putAllFieldMapFixed64String49(populateLongMap(stringProvider));
+    builder.putAllFieldMapFixed64Uint3250(populateLongMap(integerProvider));
+    builder.putAllFieldMapFixed64Uint6451(populateLongMap(longProvider));
+    builder.putAllFieldMapInt32Bool52(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapInt32Bytes53(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapInt32Double54(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapInt32Enum55(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapInt32Fixed3256(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Fixed6457(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Float58(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapInt32Int3259(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Int6460(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Message61(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapInt32Sfixed3262(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Sfixed6463(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32Sint3264(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Sint6465(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt32String66(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapInt32Uint3267(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapInt32Uint6468(populateIntegerMap(longProvider));
+    builder.putAllFieldMapInt64Bool69(populateLongMap(booleanProvider));
+    builder.putAllFieldMapInt64Bytes70(populateLongMap(bytesProvider));
+    builder.putAllFieldMapInt64Double71(populateLongMap(doubleProvider));
+    builder.putAllFieldMapInt64Enum72(populateLongMap(enumProvider));
+    builder.putAllFieldMapInt64Fixed3273(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Fixed6474(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Float75(populateLongMap(floatProvider));
+    builder.putAllFieldMapInt64Int3276(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Int6477(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Message78(populateLongMap(messageProvider));
+    builder.putAllFieldMapInt64Sfixed3279(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Sfixed6480(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64Sint3281(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Sint6482(populateLongMap(longProvider));
+    builder.putAllFieldMapInt64String83(populateLongMap(stringProvider));
+    builder.putAllFieldMapInt64Uint3284(populateLongMap(integerProvider));
+    builder.putAllFieldMapInt64Uint6485(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed32Bool86(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapSfixed32Bytes87(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapSfixed32Double88(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapSfixed32Enum89(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapSfixed32Fixed3290(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Fixed6491(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Float92(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapSfixed32Int3293(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Int6494(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Message95(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapSfixed32Sfixed3296(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Sfixed6497(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32Sint3298(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Sint6499(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed32String100(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapSfixed32Uint32101(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSfixed32Uint64102(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSfixed64Bool103(populateLongMap(booleanProvider));
+    builder.putAllFieldMapSfixed64Bytes104(populateLongMap(bytesProvider));
+    builder.putAllFieldMapSfixed64Double105(populateLongMap(doubleProvider));
+    builder.putAllFieldMapSfixed64Enum106(populateLongMap(enumProvider));
+    builder.putAllFieldMapSfixed64Fixed32107(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Fixed64108(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Float109(populateLongMap(floatProvider));
+    builder.putAllFieldMapSfixed64Int32110(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Int64111(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Message112(populateLongMap(messageProvider));
+    builder.putAllFieldMapSfixed64Sfixed32113(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Sfixed64114(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64Sint32115(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Sint64116(populateLongMap(longProvider));
+    builder.putAllFieldMapSfixed64String117(populateLongMap(stringProvider));
+    builder.putAllFieldMapSfixed64Uint32118(populateLongMap(integerProvider));
+    builder.putAllFieldMapSfixed64Uint64119(populateLongMap(longProvider));
+    builder.putAllFieldMapSint32Bool120(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapSint32Bytes121(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapSint32Double122(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapSint32Enum123(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapSint32Fixed32124(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Fixed64125(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Float126(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapSint32Int32127(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Int64128(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Message129(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapSint32Sfixed32130(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Sfixed64131(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32Sint32132(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Sint64133(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint32String134(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapSint32Uint32135(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapSint32Uint64136(populateIntegerMap(longProvider));
+    builder.putAllFieldMapSint64Bool137(populateLongMap(booleanProvider));
+    builder.putAllFieldMapSint64Bytes138(populateLongMap(bytesProvider));
+    builder.putAllFieldMapSint64Double139(populateLongMap(doubleProvider));
+    builder.putAllFieldMapSint64Enum140(populateLongMap(enumProvider));
+    builder.putAllFieldMapSint64Fixed32141(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Fixed64142(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Float143(populateLongMap(floatProvider));
+    builder.putAllFieldMapSint64Int32144(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Int64145(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Message146(populateLongMap(messageProvider));
+    builder.putAllFieldMapSint64Sfixed32147(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Sfixed64148(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64Sint32149(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Sint64150(populateLongMap(longProvider));
+    builder.putAllFieldMapSint64String151(populateLongMap(stringProvider));
+    builder.putAllFieldMapSint64Uint32152(populateLongMap(integerProvider));
+    builder.putAllFieldMapSint64Uint64153(populateLongMap(longProvider));
+    builder.putAllFieldMapStringBool154(populateStringMap(booleanProvider));
+    builder.putAllFieldMapStringBytes155(populateStringMap(bytesProvider));
+    builder.putAllFieldMapStringDouble156(populateStringMap(doubleProvider));
+    builder.putAllFieldMapStringEnum157(populateStringMap(enumProvider));
+    builder.putAllFieldMapStringFixed32158(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringFixed64159(populateStringMap(longProvider));
+    builder.putAllFieldMapStringFloat160(populateStringMap(floatProvider));
+    builder.putAllFieldMapStringInt32161(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringInt64162(populateStringMap(longProvider));
+    builder.putAllFieldMapStringMessage163(populateStringMap(messageProvider));
+    builder.putAllFieldMapStringSfixed32164(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringSfixed64165(populateStringMap(longProvider));
+    builder.putAllFieldMapStringSint32166(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringSint64167(populateStringMap(longProvider));
+    builder.putAllFieldMapStringString168(populateStringMap(stringProvider));
+    builder.putAllFieldMapStringUint32169(populateStringMap(integerProvider));
+    builder.putAllFieldMapStringUint64170(populateStringMap(longProvider));
+    builder.putAllFieldMapUint32Bool171(populateIntegerMap(booleanProvider));
+    builder.putAllFieldMapUint32Bytes172(populateIntegerMap(bytesProvider));
+    builder.putAllFieldMapUint32Double173(populateIntegerMap(doubleProvider));
+    builder.putAllFieldMapUint32Enum174(populateIntegerMap(enumProvider));
+    builder.putAllFieldMapUint32Fixed32175(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Fixed64176(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Float177(populateIntegerMap(floatProvider));
+    builder.putAllFieldMapUint32Int32178(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Int64179(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Message180(populateIntegerMap(messageProvider));
+    builder.putAllFieldMapUint32Sfixed32181(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Sfixed64182(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32Sint32183(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Sint64184(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint32String185(populateIntegerMap(stringProvider));
+    builder.putAllFieldMapUint32Uint32186(populateIntegerMap(integerProvider));
+    builder.putAllFieldMapUint32Uint64187(populateIntegerMap(longProvider));
+    builder.putAllFieldMapUint64Bool188(populateLongMap(booleanProvider));
+    builder.putAllFieldMapUint64Bytes189(populateLongMap(bytesProvider));
+    builder.putAllFieldMapUint64Double190(populateLongMap(doubleProvider));
+    builder.putAllFieldMapUint64Enum191(populateLongMap(enumProvider));
+    builder.putAllFieldMapUint64Fixed32192(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Fixed64193(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Float194(populateLongMap(floatProvider));
+    builder.putAllFieldMapUint64Int32195(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Int64196(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Message197(populateLongMap(messageProvider));
+    builder.putAllFieldMapUint64Sfixed32198(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Sfixed64199(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64Sint32200(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Sint64201(populateLongMap(longProvider));
+    builder.putAllFieldMapUint64String202(populateLongMap(stringProvider));
+    builder.putAllFieldMapUint64Uint32203(populateLongMap(integerProvider));
+    builder.putAllFieldMapUint64Uint64204(populateLongMap(longProvider));
+
+    return builder.build();
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto3MessageLiteInfoFactory.java b/java/core/src/test/java/com/google/protobuf/Proto3MessageLiteInfoFactory.java
new file mode 100755
index 0000000..66e406a
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto3MessageLiteInfoFactory.java
@@ -0,0 +1,816 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.FieldInfo.forField;
+import static com.google.protobuf.FieldInfo.forMapField;
+import static com.google.protobuf.FieldInfo.forOneofMemberField;
+import static com.google.protobuf.FieldInfo.forRepeatedMessageField;
+
+import com.google.protobuf.testing.Proto3TestingLite.Proto3EmptyLite;
+import com.google.protobuf.testing.Proto3TestingLite.Proto3MessageLite;
+import com.google.protobuf.testing.Proto3TestingLite.Proto3MessageLiteWithMaps;
+import java.lang.reflect.Field;
+
+/** A factory that generates a hard-coded info for {@link Proto3MessageLite}. */
+public final class Proto3MessageLiteInfoFactory implements MessageInfoFactory {
+  private static final Proto3MessageLiteInfoFactory instanceForRawMessageInfo =
+      new Proto3MessageLiteInfoFactory(true);
+  private static final Proto3MessageLiteInfoFactory instanceForStructuralMessageInfo =
+      new Proto3MessageLiteInfoFactory(false);
+
+  public static Proto3MessageLiteInfoFactory getInstanceForRawMessageInfo() {
+    return instanceForRawMessageInfo;
+  }
+
+  public static Proto3MessageLiteInfoFactory getInstanceForStructuralMessageInfo() {
+    return instanceForStructuralMessageInfo;
+  }
+
+  private final boolean produceRawMessageInfo;
+
+  private Proto3MessageLiteInfoFactory(boolean produceRawMessageInfo) {
+    this.produceRawMessageInfo = produceRawMessageInfo;
+  }
+
+  @Override
+  public boolean isSupported(Class<?> clazz) {
+    return true;
+  }
+
+  @Override
+  public MessageInfo messageInfoFor(Class<?> clazz) {
+    return produceRawMessageInfo ? rawMessageInfoFor(clazz) : structuralMessageInfoFor(clazz);
+  }
+
+  private MessageInfo rawMessageInfoFor(Class<?> clazz) {
+    if (Proto3MessageLite.class.isAssignableFrom(clazz)) {
+      return newRawMessageInfoForProto3MessageLite();
+    } else {
+      throw new IllegalArgumentException("Unsupported class: " + clazz.getName());
+    }
+  }
+
+  private MessageInfo newRawMessageInfoForProto3MessageLite() {
+    java.lang.Object[] objects =
+        new java.lang.Object[] {
+          "testOneof_",
+          "testOneofCase_",
+          "fieldDouble1_",
+          "fieldFloat2_",
+          "fieldInt643_",
+          "fieldUint644_",
+          "fieldInt325_",
+          "fieldFixed646_",
+          "fieldFixed327_",
+          "fieldBool8_",
+          "fieldString9_",
+          "fieldMessage10_",
+          "fieldBytes11_",
+          "fieldUint3212_",
+          "fieldEnum13_",
+          "fieldSfixed3214_",
+          "fieldSfixed6415_",
+          "fieldSint3216_",
+          "fieldSint6417_",
+          "fieldDoubleList18_",
+          "fieldFloatList19_",
+          "fieldInt64List20_",
+          "fieldUint64List21_",
+          "fieldInt32List22_",
+          "fieldFixed64List23_",
+          "fieldFixed32List24_",
+          "fieldBoolList25_",
+          "fieldStringList26_",
+          "fieldMessageList27_",
+          Proto3MessageLite.class,
+          "fieldBytesList28_",
+          "fieldUint32List29_",
+          "fieldEnumList30_",
+          "fieldSfixed32List31_",
+          "fieldSfixed64List32_",
+          "fieldSint32List33_",
+          "fieldSint64List34_",
+          "fieldDoubleListPacked35_",
+          "fieldFloatListPacked36_",
+          "fieldInt64ListPacked37_",
+          "fieldUint64ListPacked38_",
+          "fieldInt32ListPacked39_",
+          "fieldFixed64ListPacked40_",
+          "fieldFixed32ListPacked41_",
+          "fieldBoolListPacked42_",
+          "fieldUint32ListPacked43_",
+          "fieldEnumListPacked44_",
+          "fieldSfixed32ListPacked45_",
+          "fieldSfixed64ListPacked46_",
+          "fieldSint32ListPacked47_",
+          "fieldSint64ListPacked48_",
+          Proto3MessageLite.class,
+        };
+    // To update this after a proto change, run protoc on proto3_message_lite.proto and copy over
+    // the content of the generated buildMessageInfo() method here.
+    java.lang.String info =
+        "\u0000@\u0001\u0000\u0001D@\u0000\u001f\u0000\u0001\u0000\u0002\u0001\u0003\u0002"
+            + "\u0004\u0003\u0005\u0004\u0006\u0005\u0007\u0006\b\u0007\t\u0208\n\t\u000b\n\f\u000b"
+            + "\r\f\u000e\r\u000f\u000e\u0010\u000f\u0011\u0010\u0012\u0012\u0013\u0013\u0014\u0014"
+            + "\u0015\u0015\u0016\u0016\u0017\u0017\u0018\u0018\u0019\u0019\u001a\u021a\u001b\u001b"
+            + "\u001c\u001c\u001d\u001d\u001e\u001e\u001f\u001f  !!\"\"##$$%%&&\'\'(())**++,,--"
+            + "..//0053\u000064\u000075\u000086\u000097\u0000:8\u0000;9\u0000<:\u0000=\u023b\u0000"
+            + "><\u0000?=\u0000@>\u0000A@\u0000BA\u0000CB\u0000DC\u0000";
+    return new RawMessageInfo(Proto3MessageLite.getDefaultInstance(), info, objects);
+  }
+
+  private MessageInfo structuralMessageInfoFor(Class<?> clazz) {
+    if (Proto3MessageLite.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto3MessageLite();
+    } else if (Proto3EmptyLite.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto3EmptyLite();
+    } else if (Proto3MessageLiteWithMaps.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto3MessageLiteWithMaps();
+    } else {
+      throw new IllegalArgumentException("Unsupported class: " + clazz.getName());
+    }
+  }
+
+  /**
+   * Creates a new hard-coded info for {@link Proto3MessageLite}. Each time this is called, we
+   * manually go through the entire process of what a message would do if it self-registered its own
+   * info, including looking up each field by name. This is done for benchmarking purposes, so that
+   * we get a more accurate representation of the time it takes to perform this process.
+   */
+  private static StructuralMessageInfo newMessageInfoForProto3MessageLite() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(48);
+    lookupFieldsByName(builder);
+    return builder.build();
+  }
+
+  private static void lookupFieldsByName(StructuralMessageInfo.Builder builder) {
+    builder.withDefaultInstance(Proto3MessageLite.getDefaultInstance());
+    builder.withSyntax(ProtoSyntax.PROTO3);
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldDouble1_"), 1, FieldType.DOUBLE, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldFloat2_"), 2, FieldType.FLOAT, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldInt643_"), 3, FieldType.INT64, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldUint644_"), 4, FieldType.UINT64, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldInt325_"), 5, FieldType.INT32, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldFixed646_"), 6, FieldType.FIXED64, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldFixed327_"), 7, FieldType.FIXED32, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldBool8_"), 8, FieldType.BOOL, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldString9_"), 9, FieldType.STRING, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldMessage10_"), 10, FieldType.MESSAGE, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldBytes11_"), 11, FieldType.BYTES, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldUint3212_"), 12, FieldType.UINT32, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldEnum13_"), 13, FieldType.ENUM, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldSfixed3214_"), 14, FieldType.SFIXED32, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldSfixed6415_"), 15, FieldType.SFIXED64, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldSint3216_"), 16, FieldType.SINT32, true));
+    builder.withField(
+        forField(field(Proto3MessageLite.class, "fieldSint6417_"), 17, FieldType.SINT64, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldDoubleList18_"), 18, FieldType.DOUBLE_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldFloatList19_"), 19, FieldType.FLOAT_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldInt64List20_"), 20, FieldType.INT64_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldUint64List21_"), 21, FieldType.UINT64_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldInt32List22_"), 22, FieldType.INT32_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldFixed64List23_"),
+            23,
+            FieldType.FIXED64_LIST,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldFixed32List24_"),
+            24,
+            FieldType.FIXED32_LIST,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldBoolList25_"), 25, FieldType.BOOL_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldStringList26_"), 26, FieldType.STRING_LIST, true));
+    builder.withField(
+        forRepeatedMessageField(
+            field(Proto3MessageLite.class, "fieldMessageList27_"),
+            27,
+            FieldType.MESSAGE_LIST,
+            Proto3MessageLite.class));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldBytesList28_"), 28, FieldType.BYTES_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldUint32List29_"), 29, FieldType.UINT32_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldEnumList30_"), 30, FieldType.ENUM_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldSfixed32List31_"),
+            31,
+            FieldType.SFIXED32_LIST,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldSfixed64List32_"),
+            32,
+            FieldType.SFIXED64_LIST,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldSint32List33_"), 33, FieldType.SINT32_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldSint64List34_"), 34, FieldType.SINT64_LIST, true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldDoubleListPacked35_"),
+            35,
+            FieldType.DOUBLE_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldFloatListPacked36_"),
+            36,
+            FieldType.FLOAT_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldInt64ListPacked37_"),
+            37,
+            FieldType.INT64_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldUint64ListPacked38_"),
+            38,
+            FieldType.UINT64_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldInt32ListPacked39_"),
+            39,
+            FieldType.INT32_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldFixed64ListPacked40_"),
+            40,
+            FieldType.FIXED64_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldFixed32ListPacked41_"),
+            41,
+            FieldType.FIXED32_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldBoolListPacked42_"),
+            42,
+            FieldType.BOOL_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldUint32ListPacked43_"),
+            43,
+            FieldType.UINT32_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldEnumListPacked44_"),
+            44,
+            FieldType.ENUM_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldSfixed32ListPacked45_"),
+            45,
+            FieldType.SFIXED32_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldSfixed64ListPacked46_"),
+            46,
+            FieldType.SFIXED64_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldSint32ListPacked47_"),
+            47,
+            FieldType.SINT32_LIST_PACKED,
+            true));
+    builder.withField(
+        forField(
+            field(Proto3MessageLite.class, "fieldSint64ListPacked48_"),
+            48,
+            FieldType.SINT64_LIST_PACKED,
+            true));
+
+    OneofInfo oneof =
+        new OneofInfo(
+            0,
+            field(Proto3MessageLite.class, "testOneofCase_"),
+            field(Proto3MessageLite.class, "testOneof_"));
+    builder.withField(forOneofMemberField(53, FieldType.DOUBLE, oneof, Double.class, true, null));
+    builder.withField(forOneofMemberField(54, FieldType.FLOAT, oneof, Float.class, true, null));
+    builder.withField(forOneofMemberField(55, FieldType.INT64, oneof, Long.class, true, null));
+    builder.withField(forOneofMemberField(56, FieldType.UINT64, oneof, Long.class, true, null));
+    builder.withField(forOneofMemberField(57, FieldType.INT32, oneof, Integer.class, true, null));
+    builder.withField(forOneofMemberField(58, FieldType.FIXED64, oneof, Long.class, true, null));
+    builder.withField(forOneofMemberField(59, FieldType.FIXED32, oneof, Integer.class, true, null));
+    builder.withField(forOneofMemberField(60, FieldType.BOOL, oneof, Boolean.class, true, null));
+    builder.withField(forOneofMemberField(61, FieldType.STRING, oneof, String.class, true, null));
+    builder.withField(
+        forOneofMemberField(62, FieldType.MESSAGE, oneof, Proto3MessageLite.class, true, null));
+    builder.withField(
+        forOneofMemberField(63, FieldType.BYTES, oneof, ByteString.class, true, null));
+    builder.withField(forOneofMemberField(64, FieldType.UINT32, oneof, Integer.class, true, null));
+    builder.withField(
+        forOneofMemberField(65, FieldType.SFIXED32, oneof, Integer.class, true, null));
+    builder.withField(forOneofMemberField(66, FieldType.SFIXED64, oneof, Long.class, true, null));
+    builder.withField(forOneofMemberField(67, FieldType.SINT32, oneof, Integer.class, true, null));
+    builder.withField(forOneofMemberField(68, FieldType.SINT64, oneof, Long.class, true, null));
+  }
+
+  private StructuralMessageInfo newMessageInfoForProto3EmptyLite() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO3);
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForProto3MessageLiteWithMaps() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder();
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_bool_1", 1));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_bytes_2", 2));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_double_3", 3));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_enum_4", 4));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_fixed32_5", 5));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_fixed64_6", 6));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_float_7", 7));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_int32_8", 8));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_int64_9", 9));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_message_10", 10));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_sfixed32_11", 11));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_sfixed64_12", 12));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_sint32_13", 13));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_sint64_14", 14));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_string_15", 15));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_uint32_16", 16));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_bool_uint64_17", 17));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_bool_18", 18));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_bytes_19", 19));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_double_20", 20));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_enum_21", 21));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_fixed32_22", 22));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_fixed64_23", 23));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_float_24", 24));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_int32_25", 25));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_int64_26", 26));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_message_27", 27));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_sfixed32_28", 28));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_sfixed64_29", 29));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_sint32_30", 30));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_sint64_31", 31));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_string_32", 32));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_uint32_33", 33));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed32_uint64_34", 34));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_bool_35", 35));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_bytes_36", 36));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_double_37", 37));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_enum_38", 38));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_fixed32_39", 39));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_fixed64_40", 40));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_float_41", 41));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_int32_42", 42));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_int64_43", 43));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_message_44", 44));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_sfixed32_45", 45));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_sfixed64_46", 46));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_sint32_47", 47));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_sint64_48", 48));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_string_49", 49));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_uint32_50", 50));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_fixed64_uint64_51", 51));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_bool_52", 52));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_bytes_53", 53));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_double_54", 54));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_enum_55", 55));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_fixed32_56", 56));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_fixed64_57", 57));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_float_58", 58));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_int32_59", 59));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_int64_60", 60));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_message_61", 61));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_sfixed32_62", 62));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_sfixed64_63", 63));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_sint32_64", 64));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_sint64_65", 65));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_string_66", 66));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_uint32_67", 67));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int32_uint64_68", 68));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_bool_69", 69));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_bytes_70", 70));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_double_71", 71));
+    builder.withField(mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_enum_72", 72));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_fixed32_73", 73));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_fixed64_74", 74));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_float_75", 75));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_int32_76", 76));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_int64_77", 77));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_message_78", 78));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_sfixed32_79", 79));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_sfixed64_80", 80));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_sint32_81", 81));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_sint64_82", 82));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_string_83", 83));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_uint32_84", 84));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_int64_uint64_85", 85));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_bool_86", 86));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_bytes_87", 87));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_double_88", 88));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_enum_89", 89));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_fixed32_90", 90));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_fixed64_91", 91));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_float_92", 92));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_int32_93", 93));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_int64_94", 94));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_message_95", 95));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_sfixed32_96", 96));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_sfixed64_97", 97));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_sint32_98", 98));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_sint64_99", 99));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_string_100", 100));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_uint32_101", 101));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed32_uint64_102", 102));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_bool_103", 103));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_bytes_104", 104));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_double_105", 105));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_enum_106", 106));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_fixed32_107", 107));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_fixed64_108", 108));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_float_109", 109));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_int32_110", 110));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_int64_111", 111));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_message_112", 112));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_sfixed32_113", 113));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_sfixed64_114", 114));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_sint32_115", 115));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_sint64_116", 116));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_string_117", 117));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_uint32_118", 118));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sfixed64_uint64_119", 119));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_bool_120", 120));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_bytes_121", 121));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_double_122", 122));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_enum_123", 123));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_fixed32_124", 124));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_fixed64_125", 125));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_float_126", 126));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_int32_127", 127));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_int64_128", 128));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_message_129", 129));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_sfixed32_130", 130));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_sfixed64_131", 131));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_sint32_132", 132));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_sint64_133", 133));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_string_134", 134));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_uint32_135", 135));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint32_uint64_136", 136));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_bool_137", 137));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_bytes_138", 138));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_double_139", 139));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_enum_140", 140));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_fixed32_141", 141));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_fixed64_142", 142));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_float_143", 143));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_int32_144", 144));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_int64_145", 145));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_message_146", 146));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_sfixed32_147", 147));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_sfixed64_148", 148));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_sint32_149", 149));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_sint64_150", 150));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_string_151", 151));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_uint32_152", 152));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_sint64_uint64_153", 153));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_bool_154", 154));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_bytes_155", 155));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_double_156", 156));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_enum_157", 157));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_fixed32_158", 158));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_fixed64_159", 159));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_float_160", 160));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_int32_161", 161));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_int64_162", 162));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_message_163", 163));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_sfixed32_164", 164));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_sfixed64_165", 165));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_sint32_166", 166));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_sint64_167", 167));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_string_168", 168));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_uint32_169", 169));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_string_uint64_170", 170));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_bool_171", 171));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_bytes_172", 172));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_double_173", 173));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_enum_174", 174));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_fixed32_175", 175));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_fixed64_176", 176));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_float_177", 177));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_int32_178", 178));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_int64_179", 179));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_message_180", 180));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_sfixed32_181", 181));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_sfixed64_182", 182));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_sint32_183", 183));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_sint64_184", 184));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_string_185", 185));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_uint32_186", 186));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint32_uint64_187", 187));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_bool_188", 188));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_bytes_189", 189));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_double_190", 190));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_enum_191", 191));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_fixed32_192", 192));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_fixed64_193", 193));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_float_194", 194));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_int32_195", 195));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_int64_196", 196));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_message_197", 197));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_sfixed32_198", 198));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_sfixed64_199", 199));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_sint32_200", 200));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_sint64_201", 201));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_string_202", 202));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_uint32_203", 203));
+    builder.withField(
+        mapFieldInfo(Proto3MessageLiteWithMaps.class, "field_map_uint64_uint64_204", 204));
+
+    return builder.build();
+  }
+
+  private static Field field(Class<?> clazz, String name) {
+    try {
+      return clazz.getDeclaredField(name);
+    } catch (NoSuchFieldException | SecurityException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private static FieldInfo mapFieldInfo(Class<?> clazz, String fieldName, int fieldNumber) {
+    try {
+      return forMapField(
+          field(clazz, SchemaUtil.toCamelCase(fieldName, false) + "_"),
+          fieldNumber,
+          SchemaUtil.getMapDefaultEntry(clazz, fieldName),
+          null);
+    } catch (Throwable t) {
+      throw new RuntimeException(t);
+    }
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Proto3SchemaTest.java b/java/core/src/test/java/com/google/protobuf/Proto3SchemaTest.java
new file mode 100755
index 0000000..5cd145b
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Proto3SchemaTest.java
@@ -0,0 +1,48 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.testing.Proto3Testing.Proto3Message;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class Proto3SchemaTest extends AbstractProto3SchemaTest {
+  @Override
+  protected void registerSchemas() {
+    TestSchemas.registerGenericProto3Schemas();
+  }
+
+  @Override
+  protected Schema<Proto3Message> schema() {
+    return TestSchemas.genericProto3Schema;
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/TestSchemas.java b/java/core/src/test/java/com/google/protobuf/TestSchemas.java
new file mode 100755
index 0000000..ab0ced4
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/TestSchemas.java
@@ -0,0 +1,94 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.testing.Proto2Testing;
+import com.google.protobuf.testing.Proto2Testing.Proto2Empty;
+import com.google.protobuf.testing.Proto2Testing.Proto2Message;
+import com.google.protobuf.testing.Proto2Testing.Proto2MessageWithExtensions;
+import com.google.protobuf.testing.Proto2Testing.Proto2MessageWithMaps;
+import com.google.protobuf.testing.Proto3Testing.Proto3Empty;
+import com.google.protobuf.testing.Proto3Testing.Proto3Message;
+import com.google.protobuf.testing.Proto3Testing.Proto3MessageWithMaps;
+
+/** Schemas to support testing. */
+public class TestSchemas {
+  public static final Schema<Proto2Message> genericProto2Schema =
+      new ManifestSchemaFactory().createSchema(Proto2Message.class);
+  public static final Schema<Proto3Message> genericProto3Schema =
+      new ManifestSchemaFactory().createSchema(Proto3Message.class);
+
+  public static void registerGenericProto2Schemas() {
+    registerProto2Schemas();
+  }
+
+  public static void registerGenericProto3Schemas() {
+    registerProto3Schemas();
+  }
+
+  private static void registerProto2Schemas() {
+    Protobuf protobuf = Protobuf.getInstance();
+    ManifestSchemaFactory factory = new ManifestSchemaFactory();
+    protobuf.registerSchemaOverride(Proto2Message.class, factory.createSchema(Proto2Message.class));
+    protobuf.registerSchemaOverride(
+        Proto2Message.FieldGroup49.class, factory.createSchema(Proto2Message.FieldGroup49.class));
+    protobuf.registerSchemaOverride(
+        Proto2Message.FieldGroupList51.class,
+        factory.createSchema(Proto2Message.FieldGroupList51.class));
+    protobuf.registerSchemaOverride(
+        Proto2Message.FieldGroup69.class, factory.createSchema(Proto2Message.FieldGroup69.class));
+    protobuf.registerSchemaOverride(
+        Proto2Message.RequiredNestedMessage.class,
+        factory.createSchema(Proto2Message.RequiredNestedMessage.class));
+    protobuf.registerSchemaOverride(
+        Proto2Message.FieldRequiredGroup88.class,
+        factory.createSchema(Proto2Message.FieldRequiredGroup88.class));
+    protobuf.registerSchemaOverride(Proto2Empty.class, factory.createSchema(Proto2Empty.class));
+    protobuf.registerSchemaOverride(
+        Proto2MessageWithExtensions.class, factory.createSchema(Proto2MessageWithExtensions.class));
+    protobuf.registerSchemaOverride(
+        Proto2Testing.FieldGroup49.class, factory.createSchema(Proto2Testing.FieldGroup49.class));
+    protobuf.registerSchemaOverride(
+        Proto2Testing.FieldGroupList51.class,
+        factory.createSchema(Proto2Testing.FieldGroupList51.class));
+    protobuf.registerSchemaOverride(
+        Proto2MessageWithMaps.class, factory.createSchema(Proto2MessageWithMaps.class));
+  }
+
+  private static void registerProto3Schemas() {
+    Protobuf protobuf = Protobuf.getInstance();
+    ManifestSchemaFactory factory = new ManifestSchemaFactory();
+    protobuf.registerSchemaOverride(Proto3Message.class, factory.createSchema(Proto3Message.class));
+    protobuf.registerSchemaOverride(Proto3Empty.class, factory.createSchema(Proto3Empty.class));
+    protobuf.registerSchemaOverride(
+        Proto3MessageWithMaps.class, factory.createSchema(Proto3MessageWithMaps.class));
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/TestSchemasLite.java b/java/core/src/test/java/com/google/protobuf/TestSchemasLite.java
new file mode 100755
index 0000000..28a89d7
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/TestSchemasLite.java
@@ -0,0 +1,103 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.testing.Proto2TestingLite;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2EmptyLite;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLiteWithExtensions;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLiteWithMaps;
+import com.google.protobuf.testing.Proto3TestingLite.Proto3EmptyLite;
+import com.google.protobuf.testing.Proto3TestingLite.Proto3MessageLite;
+import com.google.protobuf.testing.Proto3TestingLite.Proto3MessageLiteWithMaps;
+
+/** Schemas to support testing. */
+public final class TestSchemasLite {
+
+  public static final Schema<Proto2MessageLite> genericProto2LiteSchema =
+      new ManifestSchemaFactory().createSchema(Proto2MessageLite.class);
+  public static final Schema<Proto3MessageLite> genericProto3LiteSchema =
+      new ManifestSchemaFactory().createSchema(Proto3MessageLite.class);
+
+  public static void registerGenericProto2LiteSchemas() {
+    registerProto2LiteSchemas();
+  }
+
+  public static void registerGenericProto3LiteSchemas() {
+    registerProto3LiteSchemas();
+  }
+
+  private static void registerProto2LiteSchemas() {
+    Protobuf protobuf = Protobuf.getInstance();
+    ManifestSchemaFactory factory = new ManifestSchemaFactory();
+    protobuf.registerSchemaOverride(
+        Proto2MessageLite.class, factory.createSchema(Proto2MessageLite.class));
+    protobuf.registerSchemaOverride(
+        Proto2MessageLite.FieldGroup49.class,
+        factory.createSchema(Proto2MessageLite.FieldGroup49.class));
+    protobuf.registerSchemaOverride(
+        Proto2MessageLite.FieldGroupList51.class,
+        factory.createSchema(Proto2MessageLite.FieldGroupList51.class));
+    protobuf.registerSchemaOverride(
+        Proto2MessageLite.FieldGroup69.class,
+        factory.createSchema(Proto2MessageLite.FieldGroup69.class));
+    protobuf.registerSchemaOverride(
+        Proto2MessageLite.RequiredNestedMessage.class,
+        factory.createSchema(Proto2MessageLite.RequiredNestedMessage.class));
+    protobuf.registerSchemaOverride(
+        Proto2MessageLite.FieldRequiredGroup88.class,
+        factory.createSchema(Proto2MessageLite.FieldRequiredGroup88.class));
+    protobuf.registerSchemaOverride(
+        Proto2EmptyLite.class, factory.createSchema(Proto2EmptyLite.class));
+    protobuf.registerSchemaOverride(
+        Proto2MessageLiteWithExtensions.class,
+        factory.createSchema(Proto2MessageLiteWithExtensions.class));
+    protobuf.registerSchemaOverride(
+        Proto2TestingLite.FieldGroup49.class,
+        factory.createSchema(Proto2TestingLite.FieldGroup49.class));
+    protobuf.registerSchemaOverride(
+        Proto2TestingLite.FieldGroupList51.class,
+        factory.createSchema(Proto2TestingLite.FieldGroupList51.class));
+    protobuf.registerSchemaOverride(
+        Proto2MessageLiteWithMaps.class, factory.createSchema(Proto2MessageLiteWithMaps.class));
+  }
+
+  private static void registerProto3LiteSchemas() {
+    Protobuf protobuf = Protobuf.getInstance();
+    ManifestSchemaFactory factory = new ManifestSchemaFactory();
+    protobuf.registerSchemaOverride(
+        Proto3MessageLite.class, factory.createSchema(Proto3MessageLite.class));
+    protobuf.registerSchemaOverride(
+        Proto3EmptyLite.class, factory.createSchema(Proto3EmptyLite.class));
+    protobuf.registerSchemaOverride(
+        Proto3MessageLiteWithMaps.class, factory.createSchema(Proto3MessageLiteWithMaps.class));
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/TextFormatTest.java b/java/core/src/test/java/com/google/protobuf/TextFormatTest.java
index 2fad0b9..3ed1243 100644
--- a/java/core/src/test/java/com/google/protobuf/TextFormatTest.java
+++ b/java/core/src/test/java/com/google/protobuf/TextFormatTest.java
@@ -132,6 +132,9 @@
           + "  i: 456\n"
           + "}\n";
 
+  private final TextFormat.Parser parserAllowingUnknownFields =
+      TextFormat.Parser.newBuilder().setAllowUnknownFields(true).build();
+
   private final TextFormat.Parser parserAllowingUnknownExtensions =
       TextFormat.Parser.newBuilder().setAllowUnknownExtensions(true).build();
 
@@ -502,6 +505,7 @@
     assertEquals(2, builder.getOptionalInt64());
   }
 
+
   private void assertParseError(String error, String text) {
     // Test merge().
     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
@@ -521,6 +525,22 @@
     }
   }
 
+  private void assertParseErrorWithUnknownFields(String error, String text) {
+    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
+    try {
+      parserAllowingUnknownFields.merge(text, TestUtil.getFullExtensionRegistry(), builder);
+      fail("Expected parse exception.");
+    } catch (TextFormat.ParseException e) {
+      assertEquals(error, e.getMessage());
+    }
+  }
+
+  private TestAllTypes assertParseSuccessWithUnknownFields(String text)
+      throws TextFormat.ParseException {
+    TestAllTypes.Builder builder = TestAllTypes.newBuilder();
+    parserAllowingUnknownFields.merge(text, TestUtil.getFullExtensionRegistry(), builder);
+    return builder.build();
+  }
 
   private void assertParseErrorWithUnknownExtensions(String error, String text) {
     TestAllTypes.Builder builder = TestAllTypes.newBuilder();
@@ -1223,6 +1243,7 @@
     // Set to allow unknown fields
     TextFormat.Parser parser =
         TextFormat.Parser.newBuilder()
+            .setAllowUnknownFields(true)
             .setParseInfoTreeBuilder(treeBuilder)
             .build();
 
diff --git a/java/core/src/test/java/com/google/protobuf/UnknownFieldSetLiteTest.java b/java/core/src/test/java/com/google/protobuf/UnknownFieldSetLiteTest.java
deleted file mode 100644
index a947d27..0000000
--- a/java/core/src/test/java/com/google/protobuf/UnknownFieldSetLiteTest.java
+++ /dev/null
@@ -1,601 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-package com.google.protobuf;
-
-import static junit.framework.TestCase.assertEquals;
-
-import com.google.protobuf.UnittestLite.TestAllExtensionsLite;
-import com.google.protobuf.UnittestLite.TestAllTypesLite;
-import protobuf_unittest.UnittestProto;
-import protobuf_unittest.UnittestProto.ForeignEnum;
-import protobuf_unittest.UnittestProto.TestAllExtensions;
-import protobuf_unittest.UnittestProto.TestAllTypes;
-import protobuf_unittest.UnittestProto.TestEmptyMessage;
-import protobuf_unittest.UnittestProto.TestPackedExtensions;
-import protobuf_unittest.UnittestProto.TestPackedTypes;
-import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash;
-import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.Bar;
-import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.Foo;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Map;
-import junit.framework.TestCase;
-
-/**
- * Tests for {@link UnknownFieldSetLite}.
- *
- * @author dweis@google.com (Daniel Weis)
- */
-public class UnknownFieldSetLiteTest extends TestCase {
-  @Override
-  public void setUp() throws Exception {
-    allFields = TestUtil.getAllSet();
-    allFieldsData = allFields.toByteString();
-    emptyMessage = TestEmptyMessage.parseFrom(allFieldsData);
-    unknownFields = emptyMessage.getUnknownFields();
-  }
-
-  TestAllTypes allFields;
-  ByteString allFieldsData;
-
-  // Constructs a protocol buffer which contains fields with all the same
-  // numbers as allFieldsData except that each field is some other wire
-  // type.
-  private ByteString getBizarroData() throws Exception {
-    UnknownFieldSet.Builder bizarroFields = UnknownFieldSet.newBuilder();
-
-    UnknownFieldSet.Field varintField = UnknownFieldSet.Field.newBuilder().addVarint(1).build();
-    UnknownFieldSet.Field fixed32Field = UnknownFieldSet.Field.newBuilder().addFixed32(1).build();
-
-    for (Map.Entry<Integer, UnknownFieldSet.Field> entry : unknownFields.asMap().entrySet()) {
-      if (entry.getValue().getVarintList().isEmpty()) {
-        // Original field is not a varint, so use a varint.
-        bizarroFields.addField(entry.getKey(), varintField);
-      } else {
-        // Original field *is* a varint, so use something else.
-        bizarroFields.addField(entry.getKey(), fixed32Field);
-      }
-    }
-
-    return bizarroFields.build().toByteString();
-  }
-
-  // An empty message that has been parsed from allFieldsData.  So, it has
-  // unknown fields of every type.
-  TestEmptyMessage emptyMessage;
-  UnknownFieldSet unknownFields;
-
-  public void testDefaultInstance() {
-    UnknownFieldSetLite unknownFields = UnknownFieldSetLite.getDefaultInstance();
-
-    assertEquals(0, unknownFields.getSerializedSize());
-    assertEquals(ByteString.EMPTY, toByteString(unknownFields));
-  }
-
-  public void testEmptyInstance() {
-    UnknownFieldSetLite instance = UnknownFieldSetLite.newInstance();
-
-    assertEquals(0, instance.getSerializedSize());
-    assertEquals(ByteString.EMPTY, toByteString(instance));
-    assertEquals(UnknownFieldSetLite.getDefaultInstance(), instance);
-  }
-
-  public void testMergeFieldFrom() throws IOException {
-    Foo foo = Foo.newBuilder().setValue(2).build();
-
-    CodedInputStream input = CodedInputStream.newInstance(foo.toByteArray());
-
-    UnknownFieldSetLite instance = UnknownFieldSetLite.newInstance();
-    instance.mergeFieldFrom(input.readTag(), input);
-
-    assertEquals(foo.toByteString(), toByteString(instance));
-  }
-
-  public void testSerializedSize() throws IOException {
-    Foo foo = Foo.newBuilder().setValue(2).build();
-
-    CodedInputStream input = CodedInputStream.newInstance(foo.toByteArray());
-
-    UnknownFieldSetLite instance = UnknownFieldSetLite.newInstance();
-    instance.mergeFieldFrom(input.readTag(), input);
-
-    assertEquals(foo.toByteString().size(), instance.getSerializedSize());
-  }
-
-  public void testHashCodeAfterDeserialization() throws IOException {
-    Foo foo = Foo.newBuilder().setValue(2).build();
-
-    Foo fooDeserialized = Foo.parseFrom(foo.toByteArray());
-
-    assertEquals(fooDeserialized, foo);
-    assertEquals(foo.hashCode(), fooDeserialized.hashCode());
-  }
-
-  public void testNewInstanceHashCode() {
-    UnknownFieldSetLite emptyFieldSet = UnknownFieldSetLite.getDefaultInstance();
-    UnknownFieldSetLite paddedFieldSet = UnknownFieldSetLite.newInstance();
-
-    assertEquals(emptyFieldSet, paddedFieldSet);
-    assertEquals(emptyFieldSet.hashCode(), paddedFieldSet.hashCode());
-  }
-
-  public void testMergeVarintField() throws IOException {
-    UnknownFieldSetLite unknownFields = UnknownFieldSetLite.newInstance();
-    unknownFields.mergeVarintField(10, 2);
-
-    CodedInputStream input =
-        CodedInputStream.newInstance(toByteString(unknownFields).toByteArray());
-
-    int tag = input.readTag();
-    assertEquals(10, WireFormat.getTagFieldNumber(tag));
-    assertEquals(WireFormat.WIRETYPE_VARINT, WireFormat.getTagWireType(tag));
-    assertEquals(2, input.readUInt64());
-    assertTrue(input.isAtEnd());
-  }
-
-  public void testMergeVarintField_negative() throws IOException {
-    UnknownFieldSetLite builder = UnknownFieldSetLite.newInstance();
-    builder.mergeVarintField(10, -6);
-
-    CodedInputStream input = CodedInputStream.newInstance(toByteString(builder).toByteArray());
-
-    int tag = input.readTag();
-    assertEquals(10, WireFormat.getTagFieldNumber(tag));
-    assertEquals(WireFormat.WIRETYPE_VARINT, WireFormat.getTagWireType(tag));
-    assertEquals(-6, input.readUInt64());
-    assertTrue(input.isAtEnd());
-  }
-
-  public void testEqualsAndHashCode() {
-    UnknownFieldSetLite unknownFields1 = UnknownFieldSetLite.newInstance();
-    unknownFields1.mergeVarintField(10, 2);
-
-    UnknownFieldSetLite unknownFields2 = UnknownFieldSetLite.newInstance();
-    unknownFields2.mergeVarintField(10, 2);
-
-    assertEquals(unknownFields1, unknownFields2);
-    assertEquals(unknownFields1.hashCode(), unknownFields2.hashCode());
-    assertFalse(unknownFields1.equals(UnknownFieldSetLite.getDefaultInstance()));
-    assertFalse(unknownFields1.hashCode() == UnknownFieldSetLite.getDefaultInstance().hashCode());
-  }
-
-  public void testMutableCopyOf() throws IOException {
-    UnknownFieldSetLite unknownFields = UnknownFieldSetLite.newInstance();
-    unknownFields.mergeVarintField(10, 2);
-    unknownFields = UnknownFieldSetLite.mutableCopyOf(unknownFields, unknownFields);
-    unknownFields.checkMutable();
-
-    CodedInputStream input =
-        CodedInputStream.newInstance(toByteString(unknownFields).toByteArray());
-
-    int tag = input.readTag();
-    assertEquals(10, WireFormat.getTagFieldNumber(tag));
-    assertEquals(WireFormat.WIRETYPE_VARINT, WireFormat.getTagWireType(tag));
-    assertEquals(2, input.readUInt64());
-    assertFalse(input.isAtEnd());
-    input.readTag();
-    assertEquals(10, WireFormat.getTagFieldNumber(tag));
-    assertEquals(WireFormat.WIRETYPE_VARINT, WireFormat.getTagWireType(tag));
-    assertEquals(2, input.readUInt64());
-    assertTrue(input.isAtEnd());
-  }
-
-  public void testMutableCopyOf_empty() {
-    UnknownFieldSetLite unknownFields =
-        UnknownFieldSetLite.mutableCopyOf(
-            UnknownFieldSetLite.getDefaultInstance(), UnknownFieldSetLite.getDefaultInstance());
-    unknownFields.checkMutable();
-
-    assertEquals(0, unknownFields.getSerializedSize());
-    assertEquals(ByteString.EMPTY, toByteString(unknownFields));
-  }
-
-  public void testRoundTrips() throws InvalidProtocolBufferException {
-    Foo foo =
-        Foo.newBuilder()
-            .setValue(1)
-            .setExtension(Bar.fooExt, Bar.newBuilder().setName("name").build())
-            .setExtension(LiteEqualsAndHash.varint, 22)
-            .setExtension(LiteEqualsAndHash.fixed32, 44)
-            .setExtension(LiteEqualsAndHash.fixed64, 66L)
-            .setExtension(
-                LiteEqualsAndHash.myGroup,
-                LiteEqualsAndHash.MyGroup.newBuilder().setGroupValue("value").build())
-            .build();
-
-    Foo copy = Foo.parseFrom(foo.toByteArray());
-
-    assertEquals(foo.getSerializedSize(), copy.getSerializedSize());
-    assertFalse(foo.equals(copy));
-
-    Foo secondCopy = Foo.parseFrom(foo.toByteArray());
-    assertEquals(copy, secondCopy);
-
-    ExtensionRegistryLite extensionRegistry = ExtensionRegistryLite.newInstance();
-    LiteEqualsAndHash.registerAllExtensions(extensionRegistry);
-    Foo copyOfCopy = Foo.parseFrom(copy.toByteArray(), extensionRegistry);
-
-    assertEquals(foo, copyOfCopy);
-  }
-
-  public void testMalformedBytes() throws Exception {
-    try {
-      Foo.parseFrom("this is a malformed protocol buffer".getBytes(Internal.UTF_8));
-      fail();
-    } catch (InvalidProtocolBufferException e) {
-      // Expected.
-    }
-  }
-
-  public void testMissingStartGroupTag() throws IOException {
-    ByteString.Output byteStringOutput = ByteString.newOutput();
-    CodedOutputStream output = CodedOutputStream.newInstance(byteStringOutput);
-    output.writeGroupNoTag(Foo.newBuilder().setValue(11).build());
-    output.writeTag(100, WireFormat.WIRETYPE_END_GROUP);
-    output.flush();
-
-    try {
-      Foo.parseFrom(byteStringOutput.toByteString());
-      fail();
-    } catch (InvalidProtocolBufferException e) {
-      // Expected.
-    }
-  }
-
-  public void testMissingEndGroupTag() throws IOException {
-    ByteString.Output byteStringOutput = ByteString.newOutput();
-    CodedOutputStream output = CodedOutputStream.newInstance(byteStringOutput);
-    output.writeTag(100, WireFormat.WIRETYPE_START_GROUP);
-    output.writeGroupNoTag(Foo.newBuilder().setValue(11).build());
-    output.flush();
-
-    try {
-      Foo.parseFrom(byteStringOutput.toByteString());
-      fail();
-    } catch (InvalidProtocolBufferException e) {
-      // Expected.
-    }
-  }
-
-  public void testMismatchingGroupTags() throws IOException {
-    ByteString.Output byteStringOutput = ByteString.newOutput();
-    CodedOutputStream output = CodedOutputStream.newInstance(byteStringOutput);
-    output.writeTag(100, WireFormat.WIRETYPE_START_GROUP);
-    output.writeGroupNoTag(Foo.newBuilder().setValue(11).build());
-    output.writeTag(101, WireFormat.WIRETYPE_END_GROUP);
-    output.flush();
-
-    try {
-      Foo.parseFrom(byteStringOutput.toByteString());
-      fail();
-    } catch (InvalidProtocolBufferException e) {
-      // Expected.
-    }
-  }
-
-  public void testTruncatedInput() {
-    Foo foo =
-        Foo.newBuilder()
-            .setValue(1)
-            .setExtension(Bar.fooExt, Bar.newBuilder().setName("name").build())
-            .setExtension(LiteEqualsAndHash.varint, 22)
-            .setExtension(
-                LiteEqualsAndHash.myGroup,
-                LiteEqualsAndHash.MyGroup.newBuilder().setGroupValue("value").build())
-            .build();
-
-    try {
-      Foo.parseFrom(foo.toByteString().substring(0, foo.toByteString().size() - 10));
-      fail();
-    } catch (InvalidProtocolBufferException e) {
-      // Expected.
-    }
-  }
-
-  public void testMakeImmutable() throws Exception {
-    UnknownFieldSetLite unknownFields = UnknownFieldSetLite.newInstance();
-    unknownFields.makeImmutable();
-
-    try {
-      unknownFields.mergeVarintField(1, 1);
-      fail();
-    } catch (UnsupportedOperationException expected) {
-    }
-
-    try {
-      unknownFields.mergeLengthDelimitedField(2, ByteString.copyFromUtf8("hello"));
-      fail();
-    } catch (UnsupportedOperationException expected) {
-    }
-
-    try {
-      unknownFields.mergeFieldFrom(1, CodedInputStream.newInstance(new byte[0]));
-      fail();
-    } catch (UnsupportedOperationException expected) {
-    }
-  }
-
-  public void testEndToEnd() throws Exception {
-    TestAllTypesLite testAllTypes = TestAllTypesLite.getDefaultInstance();
-    try {
-      testAllTypes.unknownFields.checkMutable();
-      fail();
-    } catch (UnsupportedOperationException expected) {
-    }
-
-    testAllTypes = TestAllTypesLite.parseFrom(new byte[0]);
-    try {
-      testAllTypes.unknownFields.checkMutable();
-      fail();
-    } catch (UnsupportedOperationException expected) {
-    }
-
-    testAllTypes = TestAllTypesLite.newBuilder().build();
-    try {
-      testAllTypes.unknownFields.checkMutable();
-      fail();
-    } catch (UnsupportedOperationException expected) {
-    }
-
-    testAllTypes = TestAllTypesLite.newBuilder().setDefaultBool(true).build();
-    try {
-      testAllTypes.unknownFields.checkMutable();
-      fail();
-    } catch (UnsupportedOperationException expected) {
-    }
-
-    TestAllExtensionsLite testAllExtensions =
-        TestAllExtensionsLite.newBuilder()
-            .mergeFrom(
-                TestAllExtensionsLite.newBuilder()
-                    .setExtension(UnittestLite.optionalInt32ExtensionLite, 2)
-                    .build()
-                    .toByteArray())
-            .build();
-    try {
-      testAllExtensions.unknownFields.checkMutable();
-      fail();
-    } catch (UnsupportedOperationException expected) {
-    }
-  }
-
-  private ByteString toByteString(UnknownFieldSetLite unknownFields) {
-    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-    CodedOutputStream output = CodedOutputStream.newInstance(byteArrayOutputStream);
-    try {
-      unknownFields.writeTo(output);
-      output.flush();
-    } catch (IOException e) {
-      throw new RuntimeException(e);
-    }
-    return ByteString.copyFrom(byteArrayOutputStream.toByteArray());
-  }
-
-  public void testSerializeLite() throws Exception {
-    UnittestLite.TestEmptyMessageLite emptyMessageLite =
-        UnittestLite.TestEmptyMessageLite.parseFrom(allFieldsData);
-    assertEquals(allFieldsData.size(), emptyMessageLite.getSerializedSize());
-    ByteString data = emptyMessageLite.toByteString();
-    TestAllTypes message = TestAllTypes.parseFrom(data);
-    TestUtil.assertAllFieldsSet(message);
-    assertEquals(allFieldsData, data);
-  }
-
-  public void testAllExtensionsLite() throws Exception {
-    TestAllExtensions allExtensions = TestUtil.getAllExtensionsSet();
-    ByteString allExtensionsData = allExtensions.toByteString();
-    UnittestLite.TestEmptyMessageLite emptyMessageLite =
-        UnittestLite.TestEmptyMessageLite.parser().parseFrom(allExtensionsData);
-    ByteString data = emptyMessageLite.toByteString();
-    TestAllExtensions message = TestAllExtensions.parseFrom(data, TestUtil.getExtensionRegistry());
-    TestUtil.assertAllExtensionsSet(message);
-    assertEquals(allExtensionsData, data);
-  }
-
-  public void testAllPackedFieldsLite() throws Exception {
-    TestPackedTypes allPackedFields = TestUtil.getPackedSet();
-    ByteString allPackedData = allPackedFields.toByteString();
-    UnittestLite.TestEmptyMessageLite emptyMessageLite =
-        UnittestLite.TestEmptyMessageLite.parseFrom(allPackedData);
-    ByteString data = emptyMessageLite.toByteString();
-    TestPackedTypes message = TestPackedTypes.parseFrom(data, TestUtil.getExtensionRegistry());
-    TestUtil.assertPackedFieldsSet(message);
-    assertEquals(allPackedData, data);
-  }
-
-  public void testAllPackedExtensionsLite() throws Exception {
-    TestPackedExtensions allPackedExtensions = TestUtil.getPackedExtensionsSet();
-    ByteString allPackedExtensionsData = allPackedExtensions.toByteString();
-    UnittestLite.TestEmptyMessageLite emptyMessageLite =
-        UnittestLite.TestEmptyMessageLite.parseFrom(allPackedExtensionsData);
-    ByteString data = emptyMessageLite.toByteString();
-    TestPackedExtensions message =
-        TestPackedExtensions.parseFrom(data, TestUtil.getExtensionRegistry());
-    TestUtil.assertPackedExtensionsSet(message);
-    assertEquals(allPackedExtensionsData, data);
-  }
-
-  public void testCopyFromLite() throws Exception {
-    UnittestLite.TestEmptyMessageLite emptyMessageLite =
-        UnittestLite.TestEmptyMessageLite.parseFrom(allFieldsData);
-    UnittestLite.TestEmptyMessageLite emptyMessageLite2 =
-        UnittestLite.TestEmptyMessageLite.newBuilder().mergeFrom(emptyMessageLite).build();
-    assertEquals(emptyMessageLite.toByteString(), emptyMessageLite2.toByteString());
-  }
-
-  public void testMergeFromLite() throws Exception {
-    TestAllTypes message1 =
-        TestAllTypes.newBuilder()
-            .setOptionalInt32(1)
-            .setOptionalString("foo")
-            .addRepeatedString("bar")
-            .setOptionalNestedEnum(TestAllTypes.NestedEnum.BAZ)
-            .build();
-
-    TestAllTypes message2 =
-        TestAllTypes.newBuilder()
-            .setOptionalInt64(2)
-            .setOptionalString("baz")
-            .addRepeatedString("qux")
-            .setOptionalForeignEnum(ForeignEnum.FOREIGN_BAZ)
-            .build();
-
-    ByteString data1 = message1.toByteString();
-    UnittestLite.TestEmptyMessageLite emptyMessageLite1 =
-        UnittestLite.TestEmptyMessageLite.parseFrom(data1);
-    ByteString data2 = message2.toByteString();
-    UnittestLite.TestEmptyMessageLite emptyMessageLite2 =
-        UnittestLite.TestEmptyMessageLite.parseFrom(data2);
-
-    message1 = TestAllTypes.newBuilder(message1).mergeFrom(message2).build();
-    emptyMessageLite1 =
-        UnittestLite.TestEmptyMessageLite.newBuilder(emptyMessageLite1)
-            .mergeFrom(emptyMessageLite2)
-            .build();
-
-    data1 = emptyMessageLite1.toByteString();
-    message2 = TestAllTypes.parseFrom(data1);
-
-    assertEquals(message1, message2);
-  }
-
-  public void testWrongTypeTreatedAsUnknownLite() throws Exception {
-    // Test that fields of the wrong wire type are treated like unknown fields
-    // when parsing.
-
-    ByteString bizarroData = getBizarroData();
-    TestAllTypes allTypesMessage = TestAllTypes.parseFrom(bizarroData);
-    UnittestLite.TestEmptyMessageLite emptyMessageLite =
-        UnittestLite.TestEmptyMessageLite.parseFrom(bizarroData);
-    ByteString data = emptyMessageLite.toByteString();
-    TestAllTypes allTypesMessage2 = TestAllTypes.parseFrom(data);
-
-    assertEquals(allTypesMessage.toString(), allTypesMessage2.toString());
-  }
-
-  public void testUnknownExtensionsLite() throws Exception {
-    // Make sure fields are properly parsed to the UnknownFieldSet even when
-    // they are declared as extension numbers.
-
-    UnittestLite.TestEmptyMessageWithExtensionsLite message =
-        UnittestLite.TestEmptyMessageWithExtensionsLite.parseFrom(allFieldsData);
-
-    assertEquals(allFieldsData, message.toByteString());
-  }
-
-  public void testWrongExtensionTypeTreatedAsUnknownLite() throws Exception {
-    // Test that fields of the wrong wire type are treated like unknown fields
-    // when parsing extensions.
-
-    ByteString bizarroData = getBizarroData();
-    TestAllExtensions allExtensionsMessage = TestAllExtensions.parseFrom(bizarroData);
-    UnittestLite.TestEmptyMessageLite emptyMessageLite =
-        UnittestLite.TestEmptyMessageLite.parseFrom(bizarroData);
-
-    // All fields should have been interpreted as unknown, so the byte strings
-    // should be the same.
-    assertEquals(emptyMessageLite.toByteString(), allExtensionsMessage.toByteString());
-  }
-
-  public void testParseUnknownEnumValueLite() throws Exception {
-    Descriptors.FieldDescriptor singularField =
-        TestAllTypes.getDescriptor().findFieldByName("optional_nested_enum");
-    Descriptors.FieldDescriptor repeatedField =
-        TestAllTypes.getDescriptor().findFieldByName("repeated_nested_enum");
-    assertNotNull(singularField);
-    assertNotNull(repeatedField);
-
-    ByteString data =
-        UnknownFieldSet.newBuilder()
-            .addField(
-                singularField.getNumber(),
-                UnknownFieldSet.Field.newBuilder()
-                    .addVarint(TestAllTypes.NestedEnum.BAR.getNumber())
-                    .addVarint(5) // not valid
-                    .build())
-            .addField(
-                repeatedField.getNumber(),
-                UnknownFieldSet.Field.newBuilder()
-                    .addVarint(TestAllTypes.NestedEnum.FOO.getNumber())
-                    .addVarint(4) // not valid
-                    .addVarint(TestAllTypes.NestedEnum.BAZ.getNumber())
-                    .addVarint(6) // not valid
-                    .build())
-            .build()
-            .toByteString();
-
-    UnittestLite.TestEmptyMessageLite emptyMessageLite =
-        UnittestLite.TestEmptyMessageLite.parseFrom(data);
-    data = emptyMessageLite.toByteString();
-
-    {
-      TestAllTypes message = TestAllTypes.parseFrom(data);
-      assertEquals(TestAllTypes.NestedEnum.BAR, message.getOptionalNestedEnum());
-      assertEquals(
-          Arrays.asList(TestAllTypes.NestedEnum.FOO, TestAllTypes.NestedEnum.BAZ),
-          message.getRepeatedNestedEnumList());
-      assertEquals(
-          Arrays.asList(5L),
-          message.getUnknownFields().getField(singularField.getNumber()).getVarintList());
-      assertEquals(
-          Arrays.asList(4L, 6L),
-          message.getUnknownFields().getField(repeatedField.getNumber()).getVarintList());
-    }
-
-    {
-      TestAllExtensions message =
-          TestAllExtensions.parseFrom(data, TestUtil.getExtensionRegistry());
-      assertEquals(
-          TestAllTypes.NestedEnum.BAR,
-          message.getExtension(UnittestProto.optionalNestedEnumExtension));
-      assertEquals(
-          Arrays.asList(TestAllTypes.NestedEnum.FOO, TestAllTypes.NestedEnum.BAZ),
-          message.getExtension(UnittestProto.repeatedNestedEnumExtension));
-      assertEquals(
-          Arrays.asList(5L),
-          message.getUnknownFields().getField(singularField.getNumber()).getVarintList());
-      assertEquals(
-          Arrays.asList(4L, 6L),
-          message.getUnknownFields().getField(repeatedField.getNumber()).getVarintList());
-    }
-  }
-
-  public void testClearLite() throws Exception {
-    UnittestLite.TestEmptyMessageLite emptyMessageLite1 =
-        UnittestLite.TestEmptyMessageLite.parseFrom(allFieldsData);
-    UnittestLite.TestEmptyMessageLite emptyMessageLite2 =
-        UnittestLite.TestEmptyMessageLite.newBuilder().mergeFrom(emptyMessageLite1).clear().build();
-    assertEquals(0, emptyMessageLite2.getSerializedSize());
-    ByteString data = emptyMessageLite2.toByteString();
-    assertEquals(0, data.size());
-  }
-}
diff --git a/java/core/src/test/java/com/google/protobuf/Utf8Test.java b/java/core/src/test/java/com/google/protobuf/Utf8Test.java
new file mode 100755
index 0000000..bc3c985
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Utf8Test.java
@@ -0,0 +1,232 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Random;
+import java.util.regex.Pattern;
+import junit.framework.TestCase;
+
+/** Unit tests for {@link Utf8}. */
+public class Utf8Test extends TestCase {
+  private static final int NUM_CHARS = 16384;
+
+  private static final Utf8.Processor safeProcessor = new Utf8.SafeProcessor();
+  private static final Utf8.Processor unsafeProcessor = new Utf8.UnsafeProcessor();
+
+  public void testEncode() {
+    assertEncoding(randomString(0x80));
+    assertEncoding(randomString(0x90));
+    assertEncoding(randomString(0x800));
+    assertEncoding(randomString(0x10000));
+    assertEncoding(randomString(0x10ffff));
+  }
+
+  public void testEncode_insufficientSpace() {
+    assertEncoding_insufficientSpace(randomString(0x80));
+    assertEncoding_insufficientSpace(randomString(0x90));
+    assertEncoding_insufficientSpace(randomString(0x800));
+    assertEncoding_insufficientSpace(randomString(0x10000));
+    assertEncoding_insufficientSpace(randomString(0x10ffff));
+  }
+
+  public void testValid() {
+    assertIsValid(new byte[] {(byte) 0xE0, (byte) 0xB9, (byte) 0x96}, true);
+    assertIsValid(new byte[] {(byte) 0xF0, (byte) 0xB2, (byte) 0x83, (byte) 0xBC}, true);
+  }
+
+  public void testOverlongIsInvalid() {
+    assertIsValid(new byte[] {(byte) 0xC0, (byte) 0x81}, false);
+    assertIsValid(new byte[] {(byte) 0xE0, (byte) 0x81, (byte) 0x81}, false);
+    assertIsValid(new byte[] {(byte) 0xF0, (byte) 0x81, (byte) 0x81, (byte) 0x81}, false);
+  }
+
+  public void testMaxCodepointExceeded() {
+    // byte1 > 0xF4
+    assertIsValid(new byte[] {(byte) 0xF5, (byte) 0x81, (byte) 0x81, (byte) 0x81}, false);
+  }
+
+  public void testInvalidSurrogateCodepoint() {
+    assertIsValid(new byte[] {(byte) 0xED, (byte) 0xA1, (byte) 0x81}, false);
+
+    // byte1 == 0xF0 && byte2 < 0x90
+    assertIsValid(new byte[] {(byte) 0xF0, (byte) 0x81, (byte) 0x81, (byte) 0x81}, false);
+    // byte1 == 0xF4 && byte2 > 0x8F
+    assertIsValid(new byte[] {(byte) 0xF4, (byte) 0x90, (byte) 0x81, (byte) 0x81}, false);
+  }
+
+  private static String randomString(int maxCodePoint) {
+    final long seed = 99;
+    final Random rnd = new Random(seed);
+    StringBuilder sb = new StringBuilder();
+    for (int j = 0; j < NUM_CHARS; j++) {
+      int codePoint;
+      do {
+        codePoint = rnd.nextInt(maxCodePoint);
+      } while (Utf8Utils.isSurrogate(codePoint));
+      sb.appendCodePoint(codePoint);
+    }
+    return sb.toString();
+  }
+
+  private static void assertIsValid(byte[] data, boolean valid) {
+    assertEquals("isValidUtf8[ARRAY]", valid, safeProcessor.isValidUtf8(data, 0, data.length));
+    assertEquals(
+        "isValidUtf8[ARRAY_UNSAFE]", valid, unsafeProcessor.isValidUtf8(data, 0, data.length));
+
+    ByteBuffer buffer = ByteBuffer.wrap(data);
+    assertEquals(
+        "isValidUtf8[NIO_HEAP]",
+        valid,
+        safeProcessor.isValidUtf8(buffer, buffer.position(), buffer.remaining()));
+
+    // Direct buffers.
+    buffer = ByteBuffer.allocateDirect(data.length);
+    buffer.put(data);
+    buffer.flip();
+    assertEquals(
+        "isValidUtf8[NIO_DEFAULT]",
+        valid,
+        safeProcessor.isValidUtf8(buffer, buffer.position(), buffer.remaining()));
+    assertEquals(
+        "isValidUtf8[NIO_UNSAFE]",
+        valid,
+        unsafeProcessor.isValidUtf8(buffer, buffer.position(), buffer.remaining()));
+  }
+
+  private static void assertEncoding(String message) {
+    byte[] expected = message.getBytes(Internal.UTF_8);
+    byte[] output = encodeToByteArray(message, expected.length, safeProcessor);
+    assertTrue("encodeUtf8[ARRAY]", Arrays.equals(expected, output));
+
+    output = encodeToByteArray(message, expected.length, unsafeProcessor);
+    assertTrue("encodeUtf8[ARRAY_UNSAFE]", Arrays.equals(expected, output));
+
+    output = encodeToByteBuffer(message, expected.length, false, safeProcessor);
+    assertTrue("encodeUtf8[NIO_HEAP]", Arrays.equals(expected, output));
+
+    output = encodeToByteBuffer(message, expected.length, true, safeProcessor);
+    assertTrue("encodeUtf8[NIO_DEFAULT]", Arrays.equals(expected, output));
+
+    output = encodeToByteBuffer(message, expected.length, true, unsafeProcessor);
+    assertTrue("encodeUtf8[NIO_UNSAFE]", Arrays.equals(expected, output));
+  }
+
+  private void assertEncoding_insufficientSpace(String message) {
+    final int length = message.length() - 1;
+    Class<ArrayIndexOutOfBoundsException> clazz = ArrayIndexOutOfBoundsException.class;
+
+    try {
+      encodeToByteArray(message, length, safeProcessor);
+      fail("Expected " + clazz.getSimpleName());
+    } catch (Throwable t) {
+      // Expected
+      assertExceptionType(t, clazz);
+      // byte[] + safeProcessor will not exit early. We can't match the message since we don't
+      // know which char/index due to random input.
+    }
+
+    try {
+      encodeToByteArray(message, length, unsafeProcessor);
+      fail("Expected " + clazz.getSimpleName());
+    } catch (Throwable t) {
+      assertExceptionType(t, clazz);
+      // byte[] + unsafeProcessor will exit early, so we have can match the message.
+      assertExceptionMessage(t, length);
+    }
+
+    try {
+      encodeToByteBuffer(message, length, false, safeProcessor);
+      fail("Expected " + clazz.getSimpleName());
+    } catch (Throwable t) {
+      // Expected
+      assertExceptionType(t, clazz);
+      // ByteBuffer + safeProcessor will not exit early. We can't match the message since we don't
+      // know which char/index due to random input.
+    }
+
+    try {
+      encodeToByteBuffer(message, length, true, safeProcessor);
+      fail("Expected " + clazz.getSimpleName());
+    } catch (Throwable t) {
+      // Expected
+      assertExceptionType(t, clazz);
+      // ByteBuffer + safeProcessor will not exit early. We can't match the message since we don't
+      // know which char/index due to random input.
+    }
+
+    try {
+      encodeToByteBuffer(message, length, true, unsafeProcessor);
+      fail("Expected " + clazz.getSimpleName());
+    } catch (Throwable t) {
+      // Expected
+      assertExceptionType(t, clazz);
+      // Direct ByteBuffer + unsafeProcessor will exit early if it's not on Android, so we can
+      // match the message. On Android, a direct ByteBuffer will have hasArray() being true and
+      // it will take a different code path and produces a different message.
+      if (!Android.isOnAndroidDevice()) {
+        assertExceptionMessage(t, length);
+      }
+    }
+  }
+
+  private static byte[] encodeToByteArray(String message, int length, Utf8.Processor processor) {
+    byte[] output = new byte[length];
+    processor.encodeUtf8(message, output, 0, output.length);
+    return output;
+  }
+
+  private static byte[] encodeToByteBuffer(
+      String message, int length, boolean direct, Utf8.Processor processor) {
+    ByteBuffer buffer = direct ? ByteBuffer.allocateDirect(length) : ByteBuffer.allocate(length);
+
+    processor.encodeUtf8(message, buffer);
+    buffer.flip();
+
+    byte[] output = new byte[buffer.remaining()];
+    buffer.get(output);
+    return output;
+  }
+
+  private <T extends Throwable> void assertExceptionType(Throwable t, Class<T> expected) {
+    if (!expected.isAssignableFrom(t.getClass())) {
+      fail("Expected " + expected.getSimpleName() + ", but found " + t.getClass().getSimpleName());
+    }
+  }
+
+  private void assertExceptionMessage(Throwable t, int index) {
+    String pattern = "Failed writing (.) at index " + index;
+    assertTrue(
+        t.getMessage() + " does not match pattern " + pattern,
+        Pattern.matches(pattern, t.getMessage()));
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/Utf8Utils.java b/java/core/src/test/java/com/google/protobuf/Utf8Utils.java
new file mode 100755
index 0000000..dbd3d39
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/Utf8Utils.java
@@ -0,0 +1,193 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static java.lang.Character.MIN_HIGH_SURROGATE;
+import static java.lang.Character.MIN_LOW_SURROGATE;
+import static java.lang.Character.MIN_SURROGATE;
+
+import java.util.Random;
+
+/** Utilities for benchmarking UTF-8. */
+final class Utf8Utils {
+  private Utf8Utils() {}
+
+  static class MaxCodePoint {
+    final int value;
+
+    /**
+     * Convert the input string to a code point. Accepts regular decimal numerals, hex strings, and
+     * some symbolic names meaningful to humans.
+     */
+    private static int decode(String userFriendly) {
+      try {
+        return Integer.decode(userFriendly);
+      } catch (NumberFormatException ignored) {
+        if (userFriendly.matches("(?i)(?:American|English|ASCII)")) {
+          // 1-byte UTF-8 sequences - "American" ASCII text
+          return 0x80;
+        } else if (userFriendly.matches("(?i)(?:Danish|Latin|Western.*European)")) {
+          // Mostly 1-byte UTF-8 sequences, mixed with occasional 2-byte
+          // sequences - "Western European" text
+          return 0x90;
+        } else if (userFriendly.matches("(?i)(?:Greek|Cyrillic|European|ISO.?8859)")) {
+          // Mostly 2-byte UTF-8 sequences - "European" text
+          return 0x800;
+        } else if (userFriendly.matches("(?i)(?:Chinese|Han|Asian|BMP)")) {
+          // Mostly 3-byte UTF-8 sequences - "Asian" text
+          return Character.MIN_SUPPLEMENTARY_CODE_POINT;
+        } else if (userFriendly.matches("(?i)(?:Cuneiform|rare|exotic|supplementary.*)")) {
+          // Mostly 4-byte UTF-8 sequences - "rare exotic" text
+          return Character.MAX_CODE_POINT;
+        } else {
+          throw new IllegalArgumentException("Can't decode codepoint " + userFriendly);
+        }
+      }
+    }
+
+    public static MaxCodePoint valueOf(String userFriendly) {
+      return new MaxCodePoint(userFriendly);
+    }
+
+    public MaxCodePoint(String userFriendly) {
+      value = decode(userFriendly);
+    }
+  }
+
+  /**
+   * The Utf8 distribution of real data. The distribution is an array with length 4.
+   * "distribution[i]" means the total number of characters who are encoded with (i + 1) bytes.
+   *
+   * <p>GMM_UTF8_DISTRIBUTION is the distribution of gmm data set. GSR_UTF8_DISTRIBUTION is the
+   * distribution of gsreq/gsresp data set
+   */
+  public enum Utf8Distribution {
+    GMM_UTF8_DISTRIBUTION {
+      @Override
+      public int[] getDistribution() {
+        return new int[] {53059, 104, 0, 0};
+      }
+    },
+    GSR_UTF8_DISTRIBUTION {
+      @Override
+      public int[] getDistribution() {
+        return new int[] {119458, 74, 2706, 0};
+      }
+    };
+
+    public abstract int[] getDistribution();
+  }
+
+  /**
+   * Creates an array of random strings.
+   *
+   * @param stringCount the number of strings to be created.
+   * @param charCount the number of characters per string.
+   * @param maxCodePoint the maximum code point for the characters in the strings.
+   * @return an array of random strings.
+   */
+  static String[] randomStrings(int stringCount, int charCount, MaxCodePoint maxCodePoint) {
+    final long seed = 99;
+    final Random rnd = new Random(seed);
+    String[] strings = new String[stringCount];
+    for (int i = 0; i < stringCount; i++) {
+      strings[i] = randomString(rnd, charCount, maxCodePoint);
+    }
+    return strings;
+  }
+
+  /**
+   * Creates a random string
+   *
+   * @param rnd the random generator.
+   * @param charCount the number of characters per string.
+   * @param maxCodePoint the maximum code point for the characters in the strings.
+   */
+  static String randomString(Random rnd, int charCount, MaxCodePoint maxCodePoint) {
+    StringBuilder sb = new StringBuilder();
+    for (int i = 0; i < charCount; i++) {
+      int codePoint;
+      do {
+        codePoint = rnd.nextInt(maxCodePoint.value);
+      } while (Utf8Utils.isSurrogate(codePoint));
+      sb.appendCodePoint(codePoint);
+    }
+    return sb.toString();
+  }
+
+  /** Character.isSurrogate was added in Java SE 7. */
+  static boolean isSurrogate(int c) {
+    return Character.MIN_HIGH_SURROGATE <= c && c <= Character.MAX_LOW_SURROGATE;
+  }
+
+  /**
+   * Creates an array of random strings according to UTF8 distribution.
+   *
+   * @param stringCount the number of strings to be created.
+   * @param charCount the number of characters per string.
+   */
+  static String[] randomStringsWithDistribution(
+      int stringCount, int charCount, Utf8Distribution utf8Distribution) {
+    final int[] distribution = utf8Distribution.getDistribution();
+    for (int i = 0; i < 3; i++) {
+      distribution[i + 1] += distribution[i];
+    }
+    final long seed = 99;
+    final Random rnd = new Random(seed);
+    String[] strings = new String[stringCount];
+    for (int i = 0; i < stringCount; i++) {
+      StringBuilder sb = new StringBuilder();
+      for (int j = 0; j < charCount; j++) {
+        int codePoint;
+        do {
+          codePoint = rnd.nextInt(distribution[3]);
+          if (codePoint < distribution[0]) {
+            // 1 bytes
+            sb.append(0x7F);
+          } else if (codePoint < distribution[1]) {
+            // 2 bytes
+            sb.append(0x7FF);
+          } else if (codePoint < distribution[2]) {
+            // 3 bytes
+            sb.append(MIN_SURROGATE - 1);
+          } else {
+            // 4 bytes
+            sb.append(MIN_HIGH_SURROGATE);
+            sb.append(MIN_LOW_SURROGATE);
+          }
+        } while (Utf8Utils.isSurrogate(codePoint));
+        sb.appendCodePoint(codePoint);
+      }
+      strings[i] = sb.toString();
+    }
+    return strings;
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/WireFormatLiteTest.java b/java/core/src/test/java/com/google/protobuf/WireFormatLiteTest.java
new file mode 100755
index 0000000..a725d41
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/WireFormatLiteTest.java
@@ -0,0 +1,1023 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.UnittestLite.optionalForeignEnumExtensionLite;
+
+import com.google.protobuf.UnittestLite.ForeignEnumLite;
+import com.google.protobuf.UnittestLite.TestAllExtensionsLite;
+import com.google.protobuf.UnittestLite.TestPackedExtensionsLite;
+import map_test.MapForProto2TestProto;
+import map_test.MapTestProto.TestMap;
+import protobuf_unittest.UnittestMset.RawMessageSet;
+import protobuf_unittest.UnittestMset.TestMessageSetExtension1;
+import protobuf_unittest.UnittestMset.TestMessageSetExtension2;
+import protobuf_unittest.UnittestProto;
+import protobuf_unittest.UnittestProto.TestAllExtensions;
+import protobuf_unittest.UnittestProto.TestAllTypes;
+import protobuf_unittest.UnittestProto.TestExtensionInsideTable;
+import protobuf_unittest.UnittestProto.TestFieldOrderings;
+import protobuf_unittest.UnittestProto.TestOneof2;
+import protobuf_unittest.UnittestProto.TestOneofBackwardsCompatible;
+import protobuf_unittest.UnittestProto.TestPackedExtensions;
+import protobuf_unittest.UnittestProto.TestPackedTypes;
+import proto2_wireformat_unittest.UnittestMsetWireFormat.TestMessageSet;
+import proto3_unittest.UnittestProto3;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+import junit.framework.TestCase;
+
+public class WireFormatLiteTest extends TestCase {
+  public void testSerializeExtensionsLite() throws Exception {
+    // TestAllTypes and TestAllExtensions should have compatible wire formats,
+    // so if we serialize a TestAllExtensions then parse it as TestAllTypes
+    // it should work.
+
+    TestAllExtensionsLite message = TestUtilLite.getAllLiteExtensionsSet();
+    ByteString rawBytes = message.toByteString();
+    assertEquals(rawBytes.size(), message.getSerializedSize());
+
+    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
+
+    TestUtil.assertAllFieldsSet(message2);
+  }
+
+  public void testSerializePackedExtensionsLite() throws Exception {
+    // TestPackedTypes and TestPackedExtensions should have compatible wire
+    // formats; check that they serialize to the same string.
+    TestPackedExtensionsLite message = TestUtilLite.getLitePackedExtensionsSet();
+    ByteString rawBytes = message.toByteString();
+
+    TestPackedTypes message2 = TestUtil.getPackedSet();
+    ByteString rawBytes2 = message2.toByteString();
+
+    assertEquals(rawBytes, rawBytes2);
+  }
+
+  public void testParseExtensionsLite() throws Exception {
+    // TestAllTypes and TestAllExtensions should have compatible wire formats,
+    // so if we serialize a TestAllTypes then parse it as TestAllExtensions
+    // it should work.
+
+    TestAllTypes message = TestUtil.getAllSet();
+    ByteString rawBytes = message.toByteString();
+
+    ExtensionRegistryLite registryLite = TestUtilLite.getExtensionRegistryLite();
+
+    TestAllExtensionsLite message2 = TestAllExtensionsLite.parseFrom(rawBytes, registryLite);
+    TestUtil.assertAllExtensionsSet(message2);
+    message2 = TestAllExtensionsLite.parseFrom(message.toByteArray(), registryLite);
+    TestUtil.assertAllExtensionsSet(message2);
+  }
+
+  public void testParsePackedExtensionsLite() throws Exception {
+    // Ensure that packed extensions can be properly parsed.
+    TestPackedExtensionsLite message = TestUtilLite.getLitePackedExtensionsSet();
+    ByteString rawBytes = message.toByteString();
+
+    ExtensionRegistryLite registry = TestUtilLite.getExtensionRegistryLite();
+
+    TestPackedExtensionsLite message2 = TestPackedExtensionsLite.parseFrom(rawBytes, registry);
+    TestUtil.assertPackedExtensionsSet(message2);
+    message2 = TestPackedExtensionsLite.parseFrom(message.toByteArray(), registry);
+    TestUtil.assertPackedExtensionsSet(message2);
+  }
+
+  public void testSerialization() throws Exception {
+    TestAllTypes message = TestUtil.getAllSet();
+
+    ByteString rawBytes = message.toByteString();
+    assertEquals(rawBytes.size(), message.getSerializedSize());
+
+    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
+
+    TestUtil.assertAllFieldsSet(message2);
+  }
+
+  public void testSerializationPacked() throws Exception {
+    TestPackedTypes message = TestUtil.getPackedSet();
+
+    ByteString rawBytes = message.toByteString();
+    assertEquals(rawBytes.size(), message.getSerializedSize());
+
+    TestPackedTypes message2 = TestPackedTypes.parseFrom(rawBytes);
+
+    TestUtil.assertPackedFieldsSet(message2);
+  }
+
+  public void testSerializeExtensions() throws Exception {
+    // TestAllTypes and TestAllExtensions should have compatible wire formats,
+    // so if we serialize a TestAllExtensions then parse it as TestAllTypes
+    // it should work.
+
+    TestAllExtensions message = TestUtil.getAllExtensionsSet();
+    ByteString rawBytes = message.toByteString();
+    assertEquals(rawBytes.size(), message.getSerializedSize());
+
+    TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes);
+
+    TestUtil.assertAllFieldsSet(message2);
+  }
+
+  public void testSerializePackedExtensions() throws Exception {
+    // TestPackedTypes and TestPackedExtensions should have compatible wire
+    // formats; check that they serialize to the same string.
+    TestPackedExtensions message = TestUtil.getPackedExtensionsSet();
+    ByteString rawBytes = message.toByteString();
+
+    TestPackedTypes message2 = TestUtil.getPackedSet();
+    ByteString rawBytes2 = message2.toByteString();
+
+    assertEquals(rawBytes, rawBytes2);
+  }
+
+  public void testSerializationPackedWithoutGetSerializedSize() throws Exception {
+    // Write directly to an OutputStream, without invoking getSerializedSize()
+    // This used to be a bug where the size of a packed field was incorrect,
+    // since getSerializedSize() was never invoked.
+    TestPackedTypes message = TestUtil.getPackedSet();
+
+    // Directly construct a CodedOutputStream around the actual OutputStream,
+    // in case writeTo(OutputStream output) invokes getSerializedSize();
+    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+    CodedOutputStream codedOutput = CodedOutputStream.newInstance(outputStream);
+
+    message.writeTo(codedOutput);
+
+    codedOutput.flush();
+
+    TestPackedTypes message2 = TestPackedTypes.parseFrom(outputStream.toByteArray());
+
+    TestUtil.assertPackedFieldsSet(message2);
+  }
+
+  public void testParseExtensions() throws Exception {
+    // TestAllTypes and TestAllExtensions should have compatible wire formats,
+    // so if we serialize a TestAllTypes then parse it as TestAllExtensions
+    // it should work.
+
+    TestAllTypes message = TestUtil.getAllSet();
+    ByteString rawBytes = message.toByteString();
+
+    ExtensionRegistryLite registry = TestUtil.getExtensionRegistry();
+
+    TestAllExtensions message2 = TestAllExtensions.parseFrom(rawBytes, registry);
+
+    TestUtil.assertAllExtensionsSet(message2);
+  }
+
+  public void testParsePackedExtensions() throws Exception {
+    // Ensure that packed extensions can be properly parsed.
+    TestPackedExtensions message = TestUtil.getPackedExtensionsSet();
+    ByteString rawBytes = message.toByteString();
+
+    ExtensionRegistryLite registry = TestUtil.getExtensionRegistry();
+
+    TestPackedExtensions message2 = TestPackedExtensions.parseFrom(rawBytes, registry);
+
+    TestUtil.assertPackedExtensionsSet(message2);
+  }
+
+  public void testSerializeDelimited() throws Exception {
+    ByteArrayOutputStream output = new ByteArrayOutputStream();
+    TestUtil.getAllSet().writeDelimitedTo(output);
+    output.write(12);
+    TestUtil.getPackedSet().writeDelimitedTo(output);
+    output.write(34);
+
+    ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
+
+    TestUtil.assertAllFieldsSet(TestAllTypes.parseDelimitedFrom(input));
+    assertEquals(12, input.read());
+    TestUtil.assertPackedFieldsSet(TestPackedTypes.parseDelimitedFrom(input));
+    assertEquals(34, input.read());
+    assertEquals(-1, input.read());
+
+    // We're at EOF, so parsing again should return null.
+    assertNull(TestAllTypes.parseDelimitedFrom(input));
+  }
+
+  private ExtensionRegistryLite getTestFieldOrderingsRegistry() {
+    ExtensionRegistryLite result = ExtensionRegistryLite.newInstance();
+    result.add(UnittestProto.myExtensionInt);
+    result.add(UnittestProto.myExtensionString);
+    return result;
+  }
+
+  public void testParseMultipleExtensionRanges() throws Exception {
+    // Make sure we can parse a message that contains multiple extensions
+    // ranges.
+    TestFieldOrderings source =
+        TestFieldOrderings.newBuilder()
+            .setMyInt(1)
+            .setMyString("foo")
+            .setMyFloat(1.0F)
+            .setExtension(UnittestProto.myExtensionInt, 23)
+            .setExtension(UnittestProto.myExtensionString, "bar")
+            .build();
+    TestFieldOrderings dest =
+        TestFieldOrderings.parseFrom(source.toByteString(), getTestFieldOrderingsRegistry());
+    assertEquals(source, dest);
+  }
+
+  private static ExtensionRegistryLite getTestExtensionInsideTableRegistry() {
+    ExtensionRegistryLite result = ExtensionRegistryLite.newInstance();
+    result.add(UnittestProto.testExtensionInsideTableExtension);
+    return result;
+  }
+
+  public void testExtensionInsideTable() throws Exception {
+    // Make sure the extension within the range of table is parsed correctly in experimental
+    // runtime.
+    TestExtensionInsideTable source =
+        TestExtensionInsideTable.newBuilder()
+            .setField1(1)
+            .setExtension(UnittestProto.testExtensionInsideTableExtension, 23)
+            .build();
+    TestExtensionInsideTable dest =
+        TestExtensionInsideTable.parseFrom(
+            source.toByteString(), getTestExtensionInsideTableRegistry());
+    assertEquals(source, dest);
+  }
+
+  private static final int UNKNOWN_TYPE_ID = 1550055;
+  private static final int TYPE_ID_1 = 1545008;
+  private static final int TYPE_ID_2 = 1547769;
+
+  public void testSerializeMessageSetEagerly() throws Exception {
+    testSerializeMessageSetWithFlag(true);
+  }
+
+  public void testSerializeMessageSetNotEagerly() throws Exception {
+    testSerializeMessageSetWithFlag(false);
+  }
+
+  private void testSerializeMessageSetWithFlag(boolean eagerParsing) throws Exception {
+    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+    CodedOutputStream output = CodedOutputStream.newInstance(byteArrayOutputStream);
+    output.writeRawMessageSetExtension(UNKNOWN_TYPE_ID, ByteString.copyFromUtf8("bar"));
+    output.flush();
+    byte[] messageSetBytes = byteArrayOutputStream.toByteArray();
+
+    ExtensionRegistryLite.setEagerlyParseMessageSets(eagerParsing);
+    // Set up a TestMessageSet with two known messages and an unknown one.
+    TestMessageSet messageSet =
+        TestMessageSet.newBuilder()
+            .setExtension(
+                TestMessageSetExtension1.messageSetExtension,
+                TestMessageSetExtension1.newBuilder().setI(123).build())
+            .setExtension(
+                TestMessageSetExtension2.messageSetExtension,
+                TestMessageSetExtension2.newBuilder().setStr("foo").build())
+            .mergeFrom(messageSetBytes)
+            .build();
+
+    ByteString data = messageSet.toByteString();
+
+    // Parse back using RawMessageSet and check the contents.
+    RawMessageSet raw = RawMessageSet.parseFrom(data);
+
+    assertEquals(3, raw.getItemCount());
+    assertEquals(TYPE_ID_1, raw.getItem(0).getTypeId());
+    assertEquals(TYPE_ID_2, raw.getItem(1).getTypeId());
+    assertEquals(UNKNOWN_TYPE_ID, raw.getItem(2).getTypeId());
+
+    TestMessageSetExtension1 message1 =
+        TestMessageSetExtension1.parseFrom(raw.getItem(0).getMessage());
+    assertEquals(123, message1.getI());
+
+    TestMessageSetExtension2 message2 =
+        TestMessageSetExtension2.parseFrom(raw.getItem(1).getMessage());
+    assertEquals("foo", message2.getStr());
+
+    assertEquals("bar", raw.getItem(2).getMessage().toStringUtf8());
+  }
+
+  public void testParseMessageSetEagerly() throws Exception {
+    testParseMessageSetWithFlag(true);
+  }
+
+  public void testParseMessageSetNotEagerly() throws Exception {
+    testParseMessageSetWithFlag(false);
+  }
+
+  private void testParseMessageSetWithFlag(boolean eagerParsing) throws Exception {
+    ExtensionRegistryLite.setEagerlyParseMessageSets(eagerParsing);
+    ExtensionRegistryLite extensionRegistry = ExtensionRegistryLite.newInstance();
+    extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);
+    extensionRegistry.add(TestMessageSetExtension2.messageSetExtension);
+
+    // Set up a RawMessageSet with two known messages and an unknown one.
+    RawMessageSet raw =
+        RawMessageSet.newBuilder()
+            .addItem(
+                RawMessageSet.Item.newBuilder()
+                    .setTypeId(TYPE_ID_1)
+                    .setMessage(
+                        TestMessageSetExtension1.newBuilder().setI(123).build().toByteString())
+                    .build())
+            .addItem(
+                RawMessageSet.Item.newBuilder()
+                    .setTypeId(TYPE_ID_2)
+                    .setMessage(
+                        TestMessageSetExtension2.newBuilder().setStr("foo").build().toByteString())
+                    .build())
+            .addItem(
+                RawMessageSet.Item.newBuilder()
+                    .setTypeId(UNKNOWN_TYPE_ID)
+                    .setMessage(ByteString.copyFromUtf8("bar"))
+                    .build())
+            .build();
+
+    ByteString data = raw.toByteString();
+
+    // Parse as a TestMessageSet and check the contents.
+    TestMessageSet messageSet = TestMessageSet.parseFrom(data, extensionRegistry);
+
+    assertEquals(123, messageSet.getExtension(TestMessageSetExtension1.messageSetExtension).getI());
+    assertEquals(
+        "foo", messageSet.getExtension(TestMessageSetExtension2.messageSetExtension).getStr());
+  }
+
+  public void testParseMessageSetExtensionEagerly() throws Exception {
+    testParseMessageSetExtensionWithFlag(true);
+  }
+
+  public void testParseMessageSetExtensionNotEagerly() throws Exception {
+    testParseMessageSetExtensionWithFlag(false);
+  }
+
+  private void testParseMessageSetExtensionWithFlag(boolean eagerParsing) throws Exception {
+    ExtensionRegistryLite.setEagerlyParseMessageSets(eagerParsing);
+    ExtensionRegistryLite extensionRegistry = ExtensionRegistryLite.newInstance();
+    extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);
+
+    // Set up a RawMessageSet with a known messages.
+    int typeId1 = 1545008;
+    RawMessageSet raw =
+        RawMessageSet.newBuilder()
+            .addItem(
+                RawMessageSet.Item.newBuilder()
+                    .setTypeId(typeId1)
+                    .setMessage(
+                        TestMessageSetExtension1.newBuilder().setI(123).build().toByteString())
+                    .build())
+            .build();
+
+    ByteString data = raw.toByteString();
+
+    // Parse as a TestMessageSet and check the contents.
+    TestMessageSet messageSet = TestMessageSet.parseFrom(data, extensionRegistry);
+    assertEquals(123, messageSet.getExtension(TestMessageSetExtension1.messageSetExtension).getI());
+  }
+
+  public void testMergeLazyMessageSetExtensionEagerly() throws Exception {
+    testMergeLazyMessageSetExtensionWithFlag(true);
+  }
+
+  public void testMergeLazyMessageSetExtensionNotEagerly() throws Exception {
+    testMergeLazyMessageSetExtensionWithFlag(false);
+  }
+
+  private void testMergeLazyMessageSetExtensionWithFlag(boolean eagerParsing) throws Exception {
+    ExtensionRegistryLite.setEagerlyParseMessageSets(eagerParsing);
+    ExtensionRegistryLite extensionRegistry = ExtensionRegistryLite.newInstance();
+    extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);
+
+    // Set up a RawMessageSet with a known messages.
+    int typeId1 = 1545008;
+    RawMessageSet raw =
+        RawMessageSet.newBuilder()
+            .addItem(
+                RawMessageSet.Item.newBuilder()
+                    .setTypeId(typeId1)
+                    .setMessage(
+                        TestMessageSetExtension1.newBuilder().setI(123).build().toByteString())
+                    .build())
+            .build();
+
+    ByteString data = raw.toByteString();
+
+    // Parse as a TestMessageSet and store value into lazy field
+    TestMessageSet messageSet = TestMessageSet.parseFrom(data, extensionRegistry);
+    // Merge lazy field check the contents.
+    messageSet = messageSet.toBuilder().mergeFrom(data, extensionRegistry).build();
+    assertEquals(123, messageSet.getExtension(TestMessageSetExtension1.messageSetExtension).getI());
+  }
+
+  public void testMergeMessageSetExtensionEagerly() throws Exception {
+    testMergeMessageSetExtensionWithFlag(true);
+  }
+
+  public void testMergeMessageSetExtensionNotEagerly() throws Exception {
+    testMergeMessageSetExtensionWithFlag(false);
+  }
+
+  private void testMergeMessageSetExtensionWithFlag(boolean eagerParsing) throws Exception {
+    ExtensionRegistryLite.setEagerlyParseMessageSets(eagerParsing);
+    ExtensionRegistryLite extensionRegistry = ExtensionRegistryLite.newInstance();
+    extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);
+
+    // Set up a RawMessageSet with a known messages.
+    int typeId1 = 1545008;
+    RawMessageSet raw =
+        RawMessageSet.newBuilder()
+            .addItem(
+                RawMessageSet.Item.newBuilder()
+                    .setTypeId(typeId1)
+                    .setMessage(
+                        TestMessageSetExtension1.newBuilder().setI(123).build().toByteString())
+                    .build())
+            .build();
+
+    // Serialize RawMessageSet unnormally (message value before type id)
+    ByteString.CodedBuilder out = ByteString.newCodedBuilder(raw.getSerializedSize());
+    CodedOutputStream output = out.getCodedOutput();
+    List<RawMessageSet.Item> items = raw.getItemList();
+    for (RawMessageSet.Item item : items) {
+      output.writeTag(1, WireFormat.WIRETYPE_START_GROUP);
+      output.writeBytes(3, item.getMessage());
+      output.writeInt32(2, item.getTypeId());
+      output.writeTag(1, WireFormat.WIRETYPE_END_GROUP);
+    }
+    ByteString data = out.build();
+
+    // Merge bytes into TestMessageSet and check the contents.
+    TestMessageSet messageSet =
+        TestMessageSet.newBuilder().mergeFrom(data, extensionRegistry).build();
+    assertEquals(123, messageSet.getExtension(TestMessageSetExtension1.messageSetExtension).getI());
+  }
+
+  // ================================================================
+  // oneof
+  public void testOneofWireFormat() throws Exception {
+    TestOneof2.Builder builder = TestOneof2.newBuilder();
+    TestUtil.setOneof(builder);
+    TestOneof2 message = builder.build();
+    ByteString rawBytes = message.toByteString();
+
+    assertEquals(rawBytes.size(), message.getSerializedSize());
+
+    TestOneof2 message2 = TestOneof2.parseFrom(rawBytes);
+    TestUtil.assertOneofSet(message2);
+  }
+
+  public void testOneofOnlyLastSet() throws Exception {
+    TestOneofBackwardsCompatible source =
+        TestOneofBackwardsCompatible.newBuilder().setFooInt(100).setFooString("101").build();
+
+    ByteString rawBytes = source.toByteString();
+    TestOneof2 message = TestOneof2.parseFrom(rawBytes);
+    assertFalse(message.hasFooInt());
+    assertTrue(message.hasFooString());
+  }
+
+  private void assertInvalidWireFormat(
+      MessageLite defaultInstance, byte[] data, int offset, int length) {
+    // Test all combinations: (builder vs parser) x (byte[] vs. InputStream).
+    try {
+      defaultInstance.newBuilderForType().mergeFrom(data, offset, length);
+      fail("Expected exception");
+    } catch (InvalidProtocolBufferException e) {
+      // Pass.
+    }
+    try {
+      defaultInstance.getParserForType().parseFrom(data, offset, length);
+      fail("Expected exception");
+    } catch (InvalidProtocolBufferException e) {
+      // Pass.
+    }
+    try {
+      InputStream input = new ByteArrayInputStream(data, offset, length);
+      defaultInstance.newBuilderForType().mergeFrom(input);
+      fail("Expected exception");
+    } catch (IOException e) {
+      // Pass.
+    }
+    try {
+      InputStream input = new ByteArrayInputStream(data, offset, length);
+      defaultInstance.getParserForType().parseFrom(input);
+      fail("Expected exception");
+    } catch (IOException e) {
+      // Pass.
+    }
+  }
+
+  private void assertInvalidWireFormat(MessageLite defaultInstance, byte[] data) {
+    assertInvalidWireFormat(defaultInstance, data, 0, data.length);
+  }
+
+  private void assertInvalidWireFormat(byte[] data) {
+    assertInvalidWireFormat(TestAllTypes.getDefaultInstance(), data);
+    assertInvalidWireFormat(UnittestProto3.TestAllTypes.getDefaultInstance(), data);
+  }
+
+  public void testParserRejectInvalidTag() throws Exception {
+    byte[] invalidTags =
+        new byte[] {
+          // Zero tag is not allowed.
+          0,
+          // Invalid wire types.
+          (byte) WireFormat.makeTag(1, 6),
+          (byte) WireFormat.makeTag(1, 7),
+          // Field number 0 is not allowed.
+          (byte) WireFormat.makeTag(0, WireFormat.WIRETYPE_VARINT),
+        };
+    for (byte invalidTag : invalidTags) {
+      // Add a trailing 0 to make sure the parsing actually fails on the tag.
+      byte[] data = new byte[] {invalidTag, 0};
+      assertInvalidWireFormat(data);
+
+      // Invalid tag in an unknown group field.
+      data =
+          new byte[] {
+            (byte) WireFormat.makeTag(1, WireFormat.WIRETYPE_START_GROUP),
+            invalidTag,
+            0,
+            (byte) WireFormat.makeTag(1, WireFormat.WIRETYPE_END_GROUP),
+          };
+      assertInvalidWireFormat(data);
+
+      // Invalid tag in a MessageSet item.
+      data =
+          new byte[] {
+            (byte) WireFormat.MESSAGE_SET_ITEM_TAG,
+            (byte) WireFormat.MESSAGE_SET_TYPE_ID_TAG,
+            100, // TYPE_ID = 100
+            (byte) WireFormat.MESSAGE_SET_MESSAGE_TAG,
+            0, // empty payload
+            invalidTag,
+            0,
+            (byte) WireFormat.MESSAGE_SET_ITEM_END_TAG,
+          };
+      assertInvalidWireFormat(TestMessageSet.getDefaultInstance(), data);
+
+      // Invalid tag inside a MessageSet item's unknown group.
+      data =
+          new byte[] {
+            (byte) WireFormat.MESSAGE_SET_ITEM_TAG,
+            (byte) WireFormat.MESSAGE_SET_TYPE_ID_TAG,
+            100, // TYPE_ID = 100
+            (byte) WireFormat.MESSAGE_SET_MESSAGE_TAG,
+            0, // empty payload
+            (byte) WireFormat.makeTag(4, WireFormat.WIRETYPE_START_GROUP),
+            invalidTag,
+            0,
+            (byte) WireFormat.makeTag(4, WireFormat.WIRETYPE_END_GROUP),
+            (byte) WireFormat.MESSAGE_SET_ITEM_END_TAG,
+          };
+      assertInvalidWireFormat(TestMessageSet.getDefaultInstance(), data);
+
+      // Invalid tag inside a map field.
+      data =
+          new byte[] {
+            (byte) WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED), 2, invalidTag, 0,
+          };
+      assertInvalidWireFormat(TestMap.getDefaultInstance(), data);
+    }
+  }
+
+  public void testUnmatchedGroupTag() throws Exception {
+    int startTag = WireFormat.makeTag(16, WireFormat.WIRETYPE_START_GROUP);
+    byte[] data =
+        new byte[] {
+          (byte) ((startTag & 0x7F) | 0x80), (byte) ((startTag >>> 7) & 0x7F),
+        };
+    assertInvalidWireFormat(data);
+
+    // Unmatched group tags inside a MessageSet item.
+    data =
+        new byte[] {
+          (byte) WireFormat.MESSAGE_SET_ITEM_TAG,
+          (byte) WireFormat.MESSAGE_SET_TYPE_ID_TAG,
+          100, // TYPE_ID = 100
+          (byte) WireFormat.MESSAGE_SET_MESSAGE_TAG,
+          0, // empty payload
+          (byte) WireFormat.makeTag(4, WireFormat.WIRETYPE_START_GROUP),
+        };
+    assertInvalidWireFormat(TestMessageSet.getDefaultInstance(), data);
+  }
+
+  private void assertAccepted(MessageLite defaultInstance, byte[] data) throws Exception {
+    MessageLite message1 = defaultInstance.newBuilderForType().mergeFrom(data).build();
+    MessageLite message2 = defaultInstance.getParserForType().parseFrom(data);
+    MessageLite message3 =
+        defaultInstance.newBuilderForType().mergeFrom(new ByteArrayInputStream(data)).build();
+    MessageLite message4 =
+        defaultInstance.getParserForType().parseFrom(new ByteArrayInputStream(data));
+    assertEquals(message1, message2);
+    assertEquals(message2, message3);
+    assertEquals(message3, message4);
+  }
+
+  public void testUnmatchedWireType() throws Exception {
+    // Build a payload with all fields from 1 to 128 being varints. Parsing it into TestAllTypes
+    // or other message types should succeed even though the wire type doesn't match for some
+    // fields.
+    ByteArrayOutputStream output = new ByteArrayOutputStream();
+    CodedOutputStream codedOutput = CodedOutputStream.newInstance(output);
+    for (int i = 1; i <= 128; i++) {
+      codedOutput.writeInt32(i, 0);
+    }
+    codedOutput.flush();
+    byte[] data = output.toByteArray();
+    // It can be parsed into any message type that doesn't have required fields.
+    assertAccepted(TestAllTypes.getDefaultInstance(), data);
+    assertAccepted(UnittestProto3.TestAllTypes.getDefaultInstance(), data);
+    assertAccepted(TestMap.getDefaultInstance(), data);
+    assertAccepted(MapForProto2TestProto.TestMap.getDefaultInstance(), data);
+  }
+
+  public void testParseTruncatedPackedFields() throws Exception {
+    TestPackedTypes all = TestUtil.getPackedSet();
+    TestPackedTypes[] messages =
+        new TestPackedTypes[] {
+          TestPackedTypes.newBuilder().addAllPackedInt32(all.getPackedInt32List()).build(),
+          TestPackedTypes.newBuilder().addAllPackedInt64(all.getPackedInt64List()).build(),
+          TestPackedTypes.newBuilder().addAllPackedUint32(all.getPackedUint32List()).build(),
+          TestPackedTypes.newBuilder().addAllPackedUint64(all.getPackedUint64List()).build(),
+          TestPackedTypes.newBuilder().addAllPackedSint32(all.getPackedSint32List()).build(),
+          TestPackedTypes.newBuilder().addAllPackedSint64(all.getPackedSint64List()).build(),
+          TestPackedTypes.newBuilder().addAllPackedFixed32(all.getPackedFixed32List()).build(),
+          TestPackedTypes.newBuilder().addAllPackedFixed64(all.getPackedFixed64List()).build(),
+          TestPackedTypes.newBuilder().addAllPackedSfixed32(all.getPackedSfixed32List()).build(),
+          TestPackedTypes.newBuilder().addAllPackedSfixed64(all.getPackedSfixed64List()).build(),
+          TestPackedTypes.newBuilder().addAllPackedFloat(all.getPackedFloatList()).build(),
+          TestPackedTypes.newBuilder().addAllPackedDouble(all.getPackedDoubleList()).build(),
+          TestPackedTypes.newBuilder().addAllPackedEnum(all.getPackedEnumList()).build(),
+        };
+    for (TestPackedTypes message : messages) {
+      byte[] data = message.toByteArray();
+      // Parsing truncated payload should fail.
+      for (int i = 1; i < data.length; i++) {
+        assertInvalidWireFormat(TestPackedTypes.getDefaultInstance(), data, 0, i);
+      }
+    }
+  }
+
+  public void testParsePackedFieldsWithIncorrectLength() throws Exception {
+    // Set the length-prefix to 1 with a 4-bytes payload to test what happens when reading a packed
+    // element moves the reading position past the given length limit. It should result in an
+    // InvalidProtocolBufferException but an implementation may forget to check it especially for
+    // packed varint fields.
+    byte[] data =
+        new byte[] {
+          0,
+          0, // first two bytes is reserved for the tag.
+          1, // length is 1
+          (byte) 0x80,
+          (byte) 0x80,
+          (byte) 0x80,
+          (byte) 0x01, // a 4-bytes varint
+        };
+    // All fields that can read a 4-bytes varint (all varint fields and fixed 32-bit fields).
+    int[] fieldNumbers =
+        new int[] {
+          TestPackedTypes.PACKED_INT32_FIELD_NUMBER,
+          TestPackedTypes.PACKED_INT64_FIELD_NUMBER,
+          TestPackedTypes.PACKED_UINT32_FIELD_NUMBER,
+          TestPackedTypes.PACKED_UINT64_FIELD_NUMBER,
+          TestPackedTypes.PACKED_SINT32_FIELD_NUMBER,
+          TestPackedTypes.PACKED_SINT64_FIELD_NUMBER,
+          TestPackedTypes.PACKED_FIXED32_FIELD_NUMBER,
+          TestPackedTypes.PACKED_SFIXED32_FIELD_NUMBER,
+          TestPackedTypes.PACKED_FLOAT_FIELD_NUMBER,
+          TestPackedTypes.PACKED_BOOL_FIELD_NUMBER,
+          TestPackedTypes.PACKED_ENUM_FIELD_NUMBER,
+        };
+    for (int number : fieldNumbers) {
+      // Set the tag.
+      data[0] =
+          (byte) ((WireFormat.makeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED) & 0x7F) | 0x80);
+      data[1] =
+          (byte) ((WireFormat.makeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED) >>> 7) & 0x7F);
+      assertInvalidWireFormat(TestPackedTypes.getDefaultInstance(), data);
+    }
+
+    // Data with 8-bytes payload to test some fixed 64-bit fields.
+    byte[] data8Bytes =
+        new byte[] {
+          0,
+          0, // first two bytes is reserved for the tag.
+          1, // length is 1
+          (byte) 0x80,
+          (byte) 0x80,
+          (byte) 0x80,
+          (byte) 0x80,
+          (byte) 0x80,
+          (byte) 0x80,
+          (byte) 0x80,
+          (byte) 0x01, // a 8-bytes varint
+        };
+    // All fields that can only read 8-bytes data.
+    int[] fieldNumbers8Bytes =
+        new int[] {
+          TestPackedTypes.PACKED_FIXED64_FIELD_NUMBER,
+          TestPackedTypes.PACKED_SFIXED64_FIELD_NUMBER,
+          TestPackedTypes.PACKED_DOUBLE_FIELD_NUMBER,
+        };
+    for (int number : fieldNumbers8Bytes) {
+      // Set the tag.
+      data8Bytes[0] =
+          (byte) ((WireFormat.makeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED) & 0x7F) | 0x80);
+      data8Bytes[1] =
+          (byte) ((WireFormat.makeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED) >>> 7) & 0x7F);
+      assertInvalidWireFormat(TestPackedTypes.getDefaultInstance(), data8Bytes);
+    }
+  }
+
+  public void testParseVarintMinMax() throws Exception {
+    TestAllTypes message =
+        TestAllTypes.newBuilder()
+            .setOptionalInt32(Integer.MIN_VALUE)
+            .addRepeatedInt32(Integer.MAX_VALUE)
+            .setOptionalInt64(Long.MIN_VALUE)
+            .addRepeatedInt64(Long.MAX_VALUE)
+            .build();
+    TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteArray());
+    assertEquals(Integer.MIN_VALUE, parsed.getOptionalInt32());
+    assertEquals(Integer.MAX_VALUE, parsed.getRepeatedInt32(0));
+    assertEquals(Long.MIN_VALUE, parsed.getOptionalInt64());
+    assertEquals(Long.MAX_VALUE, parsed.getRepeatedInt64(0));
+  }
+
+  public void testParseAllVarintBits() throws Exception {
+    for (int i = 0; i < 32; i++) {
+      final int value = 1 << i;
+      TestAllTypes message = TestAllTypes.newBuilder().setOptionalInt32(value).build();
+      TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteArray());
+      assertEquals(value, parsed.getOptionalInt32());
+    }
+    for (int i = 0; i < 64; i++) {
+      final long value = 1L << i;
+      TestAllTypes message = TestAllTypes.newBuilder().setOptionalInt64(value).build();
+      TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteArray());
+      assertEquals(value, parsed.getOptionalInt64());
+    }
+  }
+
+  public void testParseEmptyUnknownLengthDelimitedField() throws Exception {
+    byte[] data =
+        new byte[] {(byte) WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED), 0};
+    TestAllTypes parsed = TestAllTypes.parseFrom(data);
+    assertTrue(Arrays.equals(data, parsed.toByteArray()));
+  }
+
+  public void testParseEmptyString() throws Exception {
+    TestAllTypes message = TestAllTypes.newBuilder().setOptionalString("").build();
+    TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteArray());
+    assertEquals("", parsed.getOptionalString());
+  }
+
+  public void testParseEmptyStringProto3() throws Exception {
+    TestAllTypes message = TestAllTypes.newBuilder().setOptionalString("").build();
+    // Note that we are parsing from a proto2 proto to a proto3 proto because empty string field is
+    // not serialized in proto3.
+    UnittestProto3.TestAllTypes parsed =
+        UnittestProto3.TestAllTypes.parseFrom(message.toByteArray());
+    assertEquals("", parsed.getOptionalString());
+  }
+
+  public void testParseEmptyBytes() throws Exception {
+    TestAllTypes message = TestAllTypes.newBuilder().setOptionalBytes(ByteString.EMPTY).build();
+    TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteArray());
+    assertEquals(ByteString.EMPTY, parsed.getOptionalBytes());
+  }
+
+  public void testParseEmptyRepeatedStringField() throws Exception {
+    TestAllTypes message =
+        TestAllTypes.newBuilder()
+            .addRepeatedString("")
+            .addRepeatedString("")
+            .addRepeatedString("0")
+            .build();
+    TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteArray());
+    assertEquals(3, parsed.getRepeatedStringCount());
+    assertEquals("", parsed.getRepeatedString(0));
+    assertEquals("", parsed.getRepeatedString(1));
+    assertEquals("0", parsed.getRepeatedString(2));
+  }
+
+  public void testParseEmptyRepeatedStringFieldProto3() throws Exception {
+    TestAllTypes message =
+        TestAllTypes.newBuilder()
+            .addRepeatedString("")
+            .addRepeatedString("")
+            .addRepeatedString("0")
+            .addRepeatedBytes(ByteString.EMPTY)
+            .build();
+    UnittestProto3.TestAllTypes parsed =
+        UnittestProto3.TestAllTypes.parseFrom(message.toByteArray());
+    assertEquals(3, parsed.getRepeatedStringCount());
+    assertEquals("", parsed.getRepeatedString(0));
+    assertEquals("", parsed.getRepeatedString(1));
+    assertEquals("0", parsed.getRepeatedString(2));
+  }
+
+  public void testParseEmptyRepeatedBytesField() throws Exception {
+    ByteString oneByte = ByteString.copyFrom(new byte[] {1});
+    TestAllTypes message =
+        TestAllTypes.newBuilder()
+            .addRepeatedBytes(ByteString.EMPTY)
+            .addRepeatedBytes(ByteString.EMPTY)
+            .addRepeatedBytes(oneByte)
+            .build();
+    TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteArray());
+    assertEquals(3, parsed.getRepeatedBytesCount());
+    assertEquals(ByteString.EMPTY, parsed.getRepeatedBytes(0));
+    assertEquals(ByteString.EMPTY, parsed.getRepeatedBytes(1));
+    assertEquals(oneByte, parsed.getRepeatedBytes(2));
+  }
+
+  public void testSkipUnknownFieldInMessageSetItem() throws Exception {
+    ByteArrayOutputStream output = new ByteArrayOutputStream();
+    // MessageSet item's start tag.
+    output.write((byte) WireFormat.MESSAGE_SET_ITEM_TAG);
+    // Put all field types into the item.
+    TestUtil.getAllSet().writeTo(output);
+    // Closing the item with the real payload and closing tag.
+    output.write(
+        new byte[] {
+          (byte) WireFormat.MESSAGE_SET_TYPE_ID_TAG,
+          100, // TYPE_ID = 100
+          (byte) WireFormat.MESSAGE_SET_MESSAGE_TAG,
+          0, // empty payload
+          (byte) WireFormat.MESSAGE_SET_ITEM_END_TAG,
+        });
+    byte[] data = output.toByteArray();
+    TestMessageSet parsed = TestMessageSet.parseFrom(data);
+
+    // Convert to RawMessageSet for inspection.
+    RawMessageSet raw = RawMessageSet.parseFrom(parsed.toByteArray());
+    assertEquals(1, raw.getItemCount());
+    assertEquals(100, raw.getItem(0).getTypeId());
+    assertEquals(0, raw.getItem(0).getMessage().size());
+  }
+
+  public void testProto2UnknownEnumValuesInOptionalField() throws Exception {
+    // Proto2 doesn't allow setting unknown enum values so we use proto3 to build a message with
+    // unknown enum values
+    UnittestProto3.TestAllTypes message =
+        UnittestProto3.TestAllTypes.newBuilder().setOptionalNestedEnumValue(4321).build();
+    TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteArray());
+    assertFalse(parsed.hasOptionalNestedEnum());
+    // Make sure unknown enum values are preserved.
+    UnittestProto3.TestAllTypes actual =
+        UnittestProto3.TestAllTypes.parseFrom(parsed.toByteArray());
+    assertEquals(4321, actual.getOptionalNestedEnumValue());
+  }
+
+  public void testProto2UnknownEnumValuesInRepeatedField() throws Exception {
+    // Proto2 doesn't allow setting unknown enum values so we use proto3 to build a message with
+    // unknown enum values
+    UnittestProto3.TestAllTypes message =
+        UnittestProto3.TestAllTypes.newBuilder().addRepeatedNestedEnumValue(5432).build();
+    TestAllTypes parsed = TestAllTypes.parseFrom(message.toByteArray());
+    assertEquals(0, parsed.getRepeatedNestedEnumCount());
+    // Make sure unknown enum values are preserved.
+    UnittestProto3.TestAllTypes actual =
+        UnittestProto3.TestAllTypes.parseFrom(parsed.toByteArray());
+    assertEquals(1, actual.getRepeatedNestedEnumCount());
+    assertEquals(5432, actual.getRepeatedNestedEnumValue(0));
+  }
+
+  public void testProto2UnknownEnumValuesInMapField() throws Exception {
+    // Proto2 doesn't allow setting unknown enum values so we use proto3 to build a message with
+    // unknown enum values
+    TestMap message = TestMap.newBuilder().putInt32ToEnumFieldValue(1, 4321).build();
+    MapForProto2TestProto.TestMap parsed =
+        MapForProto2TestProto.TestMap.parseFrom(message.toByteArray());
+    assertEquals(0, parsed.getInt32ToEnumFieldMap().size());
+    // Make sure unknown enum values are preserved.
+    TestMap actual = TestMap.parseFrom(parsed.toByteArray());
+    assertEquals(1, actual.getInt32ToEnumFieldMap().size());
+    assertEquals(4321, actual.getInt32ToEnumFieldValueOrThrow(1));
+  }
+
+  public void testProto2UnknownEnumValuesInOneof() throws Exception {
+    // Proto2 doesn't allow setting unknown enum values so we use proto3 to build a message with
+    // unknown enum values
+    UnittestProto3.TestOneof2 message =
+        UnittestProto3.TestOneof2.newBuilder().setFooEnumValue(1234).build();
+    TestOneof2 parsed = TestOneof2.parseFrom(message.toByteArray());
+    assertFalse(parsed.hasFooEnum());
+    // Make sure unknown enum values are preserved.
+    UnittestProto3.TestOneof2 actual = UnittestProto3.TestOneof2.parseFrom(parsed.toByteArray());
+    assertEquals(1234, actual.getFooEnumValue());
+  }
+
+  public void testProto2UnknownEnumValuesInExtension() throws Exception {
+    ExtensionRegistryLite extensionRegistry = TestUtilLite.getExtensionRegistryLite();
+    // Raw bytes for "[.optional_foreign_enum_extension_lite]: 10"
+    final byte[] rawBytes = new byte[]{-80, 1, 10};
+    TestAllExtensionsLite testAllExtensionsLite =
+        TestAllExtensionsLite.parseFrom(rawBytes, extensionRegistry);
+    assertEquals(ForeignEnumLite.FOREIGN_LITE_FOO,
+        testAllExtensionsLite.getExtension(optionalForeignEnumExtensionLite));
+    final byte[] resultRawBytes = testAllExtensionsLite.toByteArray();
+    assertEquals(rawBytes.length, resultRawBytes.length);
+    for (int i = 0; i < rawBytes.length; i++) {
+      assertEquals(rawBytes[i], resultRawBytes[i]);
+    }
+  }
+
+  public void testProto3UnknownEnumValuesInOptionalField() throws Exception {
+    UnittestProto3.TestAllTypes message =
+        UnittestProto3.TestAllTypes.newBuilder().setOptionalNestedEnumValue(4321).build();
+    UnittestProto3.TestAllTypes parsed =
+        UnittestProto3.TestAllTypes.parseFrom(message.toByteArray());
+    assertEquals(4321, parsed.getOptionalNestedEnumValue());
+  }
+
+  public void testProto3UnknownEnumValuesInRepeatedField() throws Exception {
+    UnittestProto3.TestAllTypes message =
+        UnittestProto3.TestAllTypes.newBuilder().addRepeatedNestedEnumValue(5432).build();
+    UnittestProto3.TestAllTypes parsed =
+        UnittestProto3.TestAllTypes.parseFrom(message.toByteArray());
+    assertEquals(1, parsed.getRepeatedNestedEnumCount());
+    assertEquals(5432, parsed.getRepeatedNestedEnumValue(0));
+  }
+
+  public void testProto3UnknownEnumValuesInMapField() throws Exception {
+    TestMap message = TestMap.newBuilder().putInt32ToEnumFieldValue(1, 4321).build();
+    TestMap parsed = TestMap.parseFrom(message.toByteArray());
+    assertEquals(1, parsed.getInt32ToEnumFieldMap().size());
+    assertEquals(4321, parsed.getInt32ToEnumFieldValueOrThrow(1));
+  }
+
+  public void testProto3UnknownEnumValuesInOneof() throws Exception {
+    UnittestProto3.TestOneof2 message =
+        UnittestProto3.TestOneof2.newBuilder().setFooEnumValue(1234).build();
+    UnittestProto3.TestOneof2 parsed = UnittestProto3.TestOneof2.parseFrom(message.toByteArray());
+    assertEquals(1234, parsed.getFooEnumValue());
+  }
+
+  public void testProto3MessageFieldMergeBehavior() throws Exception {
+    UnittestProto3.NestedTestAllTypes message1 =
+        UnittestProto3.NestedTestAllTypes.newBuilder()
+            .setPayload(
+                UnittestProto3.TestAllTypes.newBuilder()
+                    .setOptionalInt32(1234)
+                    .setOptionalInt64(5678))
+            .build();
+    UnittestProto3.NestedTestAllTypes message2 =
+        UnittestProto3.NestedTestAllTypes.newBuilder()
+            .setPayload(
+                UnittestProto3.TestAllTypes.newBuilder()
+                    .setOptionalInt32(4321)
+                    .setOptionalUint32(8765))
+            .build();
+
+    UnittestProto3.NestedTestAllTypes merged =
+        UnittestProto3.NestedTestAllTypes.newBuilder()
+            .mergeFrom(message1.toByteArray())
+            .mergeFrom(message2.toByteArray())
+            .build();
+    // Field values coming later in the stream override earlier values.
+    assertEquals(4321, merged.getPayload().getOptionalInt32());
+    // Field values present in either message should be present in the merged result.
+    assertEquals(5678, merged.getPayload().getOptionalInt64());
+    assertEquals(8765, merged.getPayload().getOptionalUint32());
+  }
+
+  public void testMergeFromPartialByteArray() throws Exception {
+    byte[] data = TestUtil.getAllSet().toByteArray();
+    byte[] dataWithPaddings = new byte[data.length + 2];
+    System.arraycopy(data, 0, dataWithPaddings, 1, data.length);
+    // Parsing will fail if the builder (or parser) interprets offset or length incorrectly.
+    TestAllTypes.newBuilder().mergeFrom(dataWithPaddings, 1, data.length);
+    TestAllTypes.parser().parseFrom(dataWithPaddings, 1, data.length);
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/WrappersLiteOfMethodTest.java b/java/core/src/test/java/com/google/protobuf/WrappersLiteOfMethodTest.java
new file mode 100755
index 0000000..4a3c764
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/WrappersLiteOfMethodTest.java
@@ -0,0 +1,61 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.wrapperstest.WrappersTestProto.TopLevelMessage;
+import junit.framework.TestCase;
+
+public class WrappersLiteOfMethodTest extends TestCase {
+
+  public void testOf() throws Exception {
+    TopLevelMessage.Builder builder = TopLevelMessage.newBuilder();
+    builder.setFieldDouble(DoubleValue.of(2.333));
+    builder.setFieldFloat(FloatValue.of(2.333f));
+    builder.setFieldInt32(Int32Value.of(2333));
+    builder.setFieldInt64(Int64Value.of(23333333333333L));
+    builder.setFieldUint32(UInt32Value.of(2333));
+    builder.setFieldUint64(UInt64Value.of(23333333333333L));
+    builder.setFieldBool(BoolValue.of(true));
+    builder.setFieldString(StringValue.of("23333"));
+    builder.setFieldBytes(BytesValue.of(ByteString.wrap("233".getBytes(Internal.UTF_8))));
+
+    TopLevelMessage message = builder.build();
+    assertTrue(2.333 == message.getFieldDouble().getValue());
+    assertTrue(2.333f == message.getFieldFloat().getValue());
+    assertTrue(2333 == message.getFieldInt32().getValue());
+    assertTrue(23333333333333L == message.getFieldInt64().getValue());
+    assertTrue(2333 == message.getFieldUint32().getValue());
+    assertTrue(23333333333333L == message.getFieldUint64().getValue());
+    assertTrue(true == message.getFieldBool().getValue());
+    assertTrue(message.getFieldString().getValue().equals("23333"));
+    assertTrue(message.getFieldBytes().getValue().toStringUtf8().equals("233"));
+  }
+}
diff --git a/java/core/src/test/java/com/google/protobuf/WrappersOfMethodTest.java b/java/core/src/test/java/com/google/protobuf/WrappersOfMethodTest.java
new file mode 100755
index 0000000..f0d662d
--- /dev/null
+++ b/java/core/src/test/java/com/google/protobuf/WrappersOfMethodTest.java
@@ -0,0 +1,61 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import com.google.protobuf.wrapperstest.WrappersTestProto.TopLevelMessage;
+import junit.framework.TestCase;
+
+public class WrappersOfMethodTest extends TestCase {
+
+  public void testOf() throws Exception {
+    TopLevelMessage.Builder builder = TopLevelMessage.newBuilder();
+    builder.setFieldDouble(DoubleValue.of(2.333));
+    builder.setFieldFloat(FloatValue.of(2.333f));
+    builder.setFieldInt32(Int32Value.of(2333));
+    builder.setFieldInt64(Int64Value.of(23333333333333L));
+    builder.setFieldUint32(UInt32Value.of(2333));
+    builder.setFieldUint64(UInt64Value.of(23333333333333L));
+    builder.setFieldBool(BoolValue.of(true));
+    builder.setFieldString(StringValue.of("23333"));
+    builder.setFieldBytes(BytesValue.of(ByteString.wrap("233".getBytes(Internal.UTF_8))));
+
+    TopLevelMessage message = builder.build();
+    assertTrue(2.333 == message.getFieldDouble().getValue());
+    assertTrue(2.333f == message.getFieldFloat().getValue());
+    assertTrue(2333 == message.getFieldInt32().getValue());
+    assertTrue(23333333333333L == message.getFieldInt64().getValue());
+    assertTrue(2333 == message.getFieldUint32().getValue());
+    assertTrue(23333333333333L == message.getFieldUint64().getValue());
+    assertTrue(true == message.getFieldBool().getValue());
+    assertTrue(message.getFieldString().getValue().equals("23333"));
+    assertTrue(message.getFieldBytes().getValue().toStringUtf8().equals("233"));
+  }
+}
diff --git a/java/core/src/test/proto/com/google/protobuf/cached_field_size_test.proto b/java/core/src/test/proto/com/google/protobuf/cached_field_size_test.proto
new file mode 100755
index 0000000..ce78b34
--- /dev/null
+++ b/java/core/src/test/proto/com/google/protobuf/cached_field_size_test.proto
@@ -0,0 +1,45 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A regression test for b/74087933
+syntax = "proto2";
+
+package protobuf_unittest;
+
+option optimize_for = CODE_SIZE;
+option java_multiple_files = true;
+
+import "google/protobuf/unittest.proto";
+import "google/protobuf/unittest_proto3.proto";
+
+message TestCachedFieldSizeMessage {
+  optional protobuf_unittest.TestPackedTypes proto2_child = 1;
+  optional proto3_unittest.TestPackedTypes proto3_child = 2;
+}
diff --git a/java/core/src/test/proto/com/google/protobuf/message_lite_extension_util_test.proto b/java/core/src/test/proto/com/google/protobuf/message_lite_extension_util_test.proto
new file mode 100755
index 0000000..f985ab0
--- /dev/null
+++ b/java/core/src/test/proto/com/google/protobuf/message_lite_extension_util_test.proto
@@ -0,0 +1,47 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Proto definitions used to test MessageLiteExtensionUtil
+syntax = "proto2";
+
+package protobuf_unittest;
+
+option java_outer_classname = "MessageLiteExtensionTestProtos";
+
+message Car {
+  optional string make = 1;
+  extensions 1000 to max;
+}
+
+extend Car {
+  optional bool turbo = 1001;
+  optional bool self_driving = 1002;
+  optional string plate = 9999;
+}
diff --git a/java/core/src/test/proto/com/google/protobuf/nested_extension.proto b/java/core/src/test/proto/com/google/protobuf/nested_extension.proto
index 037040b..2da6d08 100644
--- a/java/core/src/test/proto/com/google/protobuf/nested_extension.proto
+++ b/java/core/src/test/proto/com/google/protobuf/nested_extension.proto
@@ -35,10 +35,10 @@
 
 syntax = "proto2";
 
-import "com/google/protobuf/non_nested_extension.proto";
-
 package protobuf_unittest;
 
+import "com/google/protobuf/non_nested_extension.proto";
+
 
 message MyNestedExtension {
   extend MessageToBeExtended {
diff --git a/java/core/src/test/proto/com/google/protobuf/nested_extension_lite.proto b/java/core/src/test/proto/com/google/protobuf/nested_extension_lite.proto
index 40d0f19..024097c 100644
--- a/java/core/src/test/proto/com/google/protobuf/nested_extension_lite.proto
+++ b/java/core/src/test/proto/com/google/protobuf/nested_extension_lite.proto
@@ -38,10 +38,10 @@
 
 package protobuf_unittest;
 
-option optimize_for = LITE_RUNTIME;
-
 import "com/google/protobuf/non_nested_extension_lite.proto";
 
+option optimize_for = LITE_RUNTIME;
+
 message MyNestedExtensionLite {
   extend MessageLiteToBeExtended {
     optional MessageLiteToBeExtended recursiveExtensionLite = 3;
diff --git a/java/core/src/test/proto/com/google/protobuf/packed_field_test.proto b/java/core/src/test/proto/com/google/protobuf/packed_field_test.proto
new file mode 100755
index 0000000..7935322
--- /dev/null
+++ b/java/core/src/test/proto/com/google/protobuf/packed_field_test.proto
@@ -0,0 +1,76 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package packed_field_test;
+
+option java_package = "com.google.protobuf";
+option java_outer_classname = "PackedFieldTestProto";
+
+message TestAllTypes {
+  enum NestedEnum {
+    FOO = 0;
+    BAR = 1;
+    BAZ = 2;
+  }
+
+  repeated int32 repeated_int32 = 31;
+  repeated int64 repeated_int64 = 32;
+  repeated uint32 repeated_uint32 = 33;
+  repeated uint64 repeated_uint64 = 34;
+  repeated sint32 repeated_sint32 = 35;
+  repeated sint64 repeated_sint64 = 36;
+  repeated fixed32 repeated_fixed32 = 37;
+  repeated fixed64 repeated_fixed64 = 38;
+  repeated sfixed32 repeated_sfixed32 = 39;
+  repeated sfixed64 repeated_sfixed64 = 40;
+  repeated float repeated_float = 41;
+  repeated double repeated_double = 42;
+  repeated bool repeated_bool = 43;
+  repeated NestedEnum repeated_nested_enum = 51;
+}
+
+message TestUnpackedTypes {
+  repeated int32 repeated_int32 = 1 [packed = false];
+  repeated int64 repeated_int64 = 2 [packed = false];
+  repeated uint32 repeated_uint32 = 3 [packed = false];
+  repeated uint64 repeated_uint64 = 4 [packed = false];
+  repeated sint32 repeated_sint32 = 5 [packed = false];
+  repeated sint64 repeated_sint64 = 6 [packed = false];
+  repeated fixed32 repeated_fixed32 = 7 [packed = false];
+  repeated fixed64 repeated_fixed64 = 8 [packed = false];
+  repeated sfixed32 repeated_sfixed32 = 9 [packed = false];
+  repeated sfixed64 repeated_sfixed64 = 10 [packed = false];
+  repeated float repeated_float = 11 [packed = false];
+  repeated double repeated_double = 12 [packed = false];
+  repeated bool repeated_bool = 13 [packed = false];
+  repeated TestAllTypes.NestedEnum repeated_nested_enum = 14 [packed = false];
+}
diff --git a/java/core/src/test/proto/com/google/protobuf/proto2_message.proto b/java/core/src/test/proto/com/google/protobuf/proto2_message.proto
new file mode 100755
index 0000000..005a911
--- /dev/null
+++ b/java/core/src/test/proto/com/google/protobuf/proto2_message.proto
@@ -0,0 +1,429 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// LINT: ALLOW_GROUPS
+syntax = "proto2";
+
+option java_package = "com.google.protobuf.testing";
+option java_outer_classname = "Proto2Testing";
+package protobuf.experimental;
+
+
+message Proto2SpecialFieldName {
+  optional double regular_name = 1;
+  optional int32 cached_size = 2;
+  optional int64 serialized_size = 3;
+  optional string class = 4;
+}
+
+message Proto2Message {
+
+  enum TestEnum {
+    ZERO = 0;
+    ONE = 1;
+    TWO = 2;
+  }
+
+  optional double field_double_1 = 1;
+  optional float field_float_2 = 2;
+  optional int64 field_int64_3 = 3;
+  optional uint64 field_uint64_4 = 4;
+  optional int32 field_int32_5 = 5;
+  optional fixed64 field_fixed64_6 = 6;
+  optional fixed32 field_fixed32_7 = 7;
+  optional bool field_bool_8 = 8;
+  optional string field_string_9 = 9;
+  optional Proto2Message field_message_10 = 10;
+  optional bytes field_bytes_11 = 11;
+  optional uint32 field_uint32_12 = 12;
+  optional TestEnum field_enum_13 = 13;
+  optional sfixed32 field_sfixed32_14 = 14;
+  optional sfixed64 field_sfixed64_15 = 15;
+  optional sint32 field_sint32_16 = 16;
+  optional sint64 field_sint64_17 = 17;
+  repeated double field_double_list_18 = 18 [packed = false];
+  repeated float field_float_list_19 = 19 [packed = false];
+  repeated int64 field_int64_list_20 = 20 [packed = false];
+  repeated uint64 field_uint64_list_21 = 21 [packed = false];
+  repeated int32 field_int32_list_22 = 22 [packed = false];
+  repeated fixed64 field_fixed64_list_23 = 23 [packed = false];
+  repeated fixed32 field_fixed32_list_24 = 24 [packed = false];
+  repeated bool field_bool_list_25 = 25 [packed = false];
+  repeated string field_string_list_26 = 26 [packed = false];
+  repeated Proto2Message field_message_list_27 = 27 [packed = false];
+  repeated bytes field_bytes_list_28 = 28 [packed = false];
+  repeated uint32 field_uint32_list_29 = 29 [packed = false];
+  repeated TestEnum field_enum_list_30 = 30 [packed = false];
+  repeated sfixed32 field_sfixed32_list_31 = 31 [packed = false];
+  repeated sfixed64 field_sfixed64_list_32 = 32 [packed = false];
+  repeated sint32 field_sint32_list_33 = 33 [packed = false];
+  repeated sint64 field_sint64_list_34 = 34 [packed = false];
+  repeated double field_double_list_packed_35 = 35 [packed = true];
+  repeated float field_float_list_packed_36 = 36 [packed = true];
+  repeated int64 field_int64_list_packed_37 = 37 [packed = true];
+  repeated uint64 field_uint64_list_packed_38 = 38 [packed = true];
+  repeated int32 field_int32_list_packed_39 = 39 [packed = true];
+  repeated fixed64 field_fixed64_list_packed_40 = 40 [packed = true];
+  repeated fixed32 field_fixed32_list_packed_41 = 41 [packed = true];
+  repeated bool field_bool_list_packed_42 = 42 [packed = true];
+  repeated uint32 field_uint32_list_packed_43 = 43 [packed = true];
+  repeated TestEnum field_enum_list_packed_44 = 44 [packed = true];
+  repeated sfixed32 field_sfixed32_list_packed_45 = 45 [packed = true];
+  repeated sfixed64 field_sfixed64_list_packed_46 = 46 [packed = true];
+  repeated sint32 field_sint32_list_packed_47 = 47 [packed = true];
+  repeated sint64 field_sint64_list_packed_48 = 48 [packed = true];
+  optional group FieldGroup49 = 49 {
+    optional int32 field_int32_50 = 50;
+  }
+  repeated group FieldGroupList51 = 51 {
+    optional int32 field_int32_52 = 52;
+  }
+  oneof test_oneof {
+    double field_double_53 = 53;
+    float field_float_54 = 54;
+    int64 field_int64_55 = 55;
+    uint64 field_uint64_56 = 56;
+    int32 field_int32_57 = 57;
+    fixed64 field_fixed64_58 = 58;
+    fixed32 field_fixed32_59 = 59;
+    bool field_bool_60 = 60;
+    string field_string_61 = 61;
+    Proto2Message field_message_62 = 62;
+    bytes field_bytes_63 = 63;
+    uint32 field_uint32_64 = 64;
+    sfixed32 field_sfixed32_65 = 65;
+    sfixed64 field_sfixed64_66 = 66;
+    sint32 field_sint32_67 = 67;
+    sint64 field_sint64_68 = 68;
+    group FieldGroup69 = 69 {
+      optional int32 field_int32_70 = 70;
+    }
+  }
+
+  message RequiredNestedMessage {
+    optional int32 value = 1;
+  }
+
+  required double field_required_double_71 = 71;
+  required float field_required_float_72 = 72;
+  required int64 field_required_int64_73 = 73;
+  required uint64 field_required_uint64_74 = 74;
+  required int32 field_required_int32_75 = 75;
+  required fixed64 field_required_fixed64_76 = 76;
+  required fixed32 field_required_fixed32_77 = 77;
+  required bool field_required_bool_78 = 78;
+  required string field_required_string_79 = 79;
+  required RequiredNestedMessage field_required_message_80 = 80;
+  required bytes field_required_bytes_81 = 81;
+  required uint32 field_required_uint32_82 = 82;
+  required TestEnum field_required_enum_83 = 83;
+  required sfixed32 field_required_sfixed32_84 = 84;
+  required sfixed64 field_required_sfixed64_85 = 85;
+  required sint32 field_required_sint32_86 = 86;
+  required sint64 field_required_sint64_87 = 87;
+  required group FieldRequiredGroup88 = 88 {
+    optional int32 field_int32_89 = 89;
+  }
+}
+
+message Proto2Empty {}
+
+message Proto2MessageWithExtensions {
+  extensions 1 to 10000;
+}
+
+extend Proto2MessageWithExtensions {
+  optional double field_double_1 = 1;
+  optional float field_float_2 = 2;
+  optional int64 field_int64_3 = 3;
+  optional uint64 field_uint64_4 = 4;
+  optional int32 field_int32_5 = 5;
+  optional fixed64 field_fixed64_6 = 6;
+  optional fixed32 field_fixed32_7 = 7;
+  optional bool field_bool_8 = 8;
+  optional string field_string_9 = 9;
+  optional Proto2Message field_message_10 = 10;
+  optional bytes field_bytes_11 = 11;
+  optional uint32 field_uint32_12 = 12;
+  optional Proto2Message.TestEnum field_enum_13 = 13;
+  optional sfixed32 field_sfixed32_14 = 14;
+  optional sfixed64 field_sfixed64_15 = 15;
+  optional sint32 field_sint32_16 = 16;
+  optional sint64 field_sint64_17 = 17;
+
+  repeated double field_double_list_18 = 18 [packed = false];
+  repeated float field_float_list_19 = 19 [packed = false];
+  repeated int64 field_int64_list_20 = 20 [packed = false];
+  repeated uint64 field_uint64_list_21 = 21 [packed = false];
+  repeated int32 field_int32_list_22 = 22 [packed = false];
+  repeated fixed64 field_fixed64_list_23 = 23 [packed = false];
+  repeated fixed32 field_fixed32_list_24 = 24 [packed = false];
+  repeated bool field_bool_list_25 = 25 [packed = false];
+  repeated string field_string_list_26 = 26 [packed = false];
+  repeated Proto2Message field_message_list_27 = 27 [packed = false];
+  repeated bytes field_bytes_list_28 = 28 [packed = false];
+  repeated uint32 field_uint32_list_29 = 29 [packed = false];
+  repeated Proto2Message.TestEnum field_enum_list_30 = 30 [packed = false];
+  repeated sfixed32 field_sfixed32_list_31 = 31 [packed = false];
+  repeated sfixed64 field_sfixed64_list_32 = 32 [packed = false];
+  repeated sint32 field_sint32_list_33 = 33 [packed = false];
+  repeated sint64 field_sint64_list_34 = 34 [packed = false];
+
+  repeated double field_double_list_packed_35 = 35 [packed = true];
+  repeated float field_float_list_packed_36 = 36 [packed = true];
+  repeated int64 field_int64_list_packed_37 = 37 [packed = true];
+  repeated uint64 field_uint64_list_packed_38 = 38 [packed = true];
+  repeated int32 field_int32_list_packed_39 = 39 [packed = true];
+  repeated fixed64 field_fixed64_list_packed_40 = 40 [packed = true];
+  repeated fixed32 field_fixed32_list_packed_41 = 41 [packed = true];
+  repeated bool field_bool_list_packed_42 = 42 [packed = true];
+  repeated uint32 field_uint32_list_packed_43 = 43 [packed = true];
+  repeated Proto2Message.TestEnum field_enum_list_packed_44 = 44
+      [packed = true];
+  repeated sfixed32 field_sfixed32_list_packed_45 = 45 [packed = true];
+  repeated sfixed64 field_sfixed64_list_packed_46 = 46 [packed = true];
+  repeated sint32 field_sint32_list_packed_47 = 47 [packed = true];
+  repeated sint64 field_sint64_list_packed_48 = 48 [packed = true];
+
+  optional group FieldGroup49 = 49 {
+    optional int32 field_int32_50 = 50;
+  }
+
+  repeated group FieldGroupList51 = 51 {
+    optional int32 field_int32_52 = 52;
+  }
+}
+
+message Proto2MessageWithMaps {
+  map<bool, bool> field_map_bool_bool_1 = 1;
+  map<bool, bytes> field_map_bool_bytes_2 = 2;
+  map<bool, double> field_map_bool_double_3 = 3;
+  map<bool, Proto2Message.TestEnum> field_map_bool_enum_4 = 4;
+  map<bool, fixed32> field_map_bool_fixed32_5 = 5;
+  map<bool, fixed64> field_map_bool_fixed64_6 = 6;
+  map<bool, float> field_map_bool_float_7 = 7;
+  map<bool, int32> field_map_bool_int32_8 = 8;
+  map<bool, int64> field_map_bool_int64_9 = 9;
+  map<bool, Proto2Message> field_map_bool_message_10 = 10;
+  map<bool, sfixed32> field_map_bool_sfixed32_11 = 11;
+  map<bool, sfixed64> field_map_bool_sfixed64_12 = 12;
+  map<bool, sint32> field_map_bool_sint32_13 = 13;
+  map<bool, sint64> field_map_bool_sint64_14 = 14;
+  map<bool, string> field_map_bool_string_15 = 15;
+  map<bool, uint32> field_map_bool_uint32_16 = 16;
+  map<bool, uint64> field_map_bool_uint64_17 = 17;
+  map<fixed32, bool> field_map_fixed32_bool_18 = 18;
+  map<fixed32, bytes> field_map_fixed32_bytes_19 = 19;
+  map<fixed32, double> field_map_fixed32_double_20 = 20;
+  map<fixed32, Proto2Message.TestEnum> field_map_fixed32_enum_21 = 21;
+  map<fixed32, fixed32> field_map_fixed32_fixed32_22 = 22;
+  map<fixed32, fixed64> field_map_fixed32_fixed64_23 = 23;
+  map<fixed32, float> field_map_fixed32_float_24 = 24;
+  map<fixed32, int32> field_map_fixed32_int32_25 = 25;
+  map<fixed32, int64> field_map_fixed32_int64_26 = 26;
+  map<fixed32, Proto2Message> field_map_fixed32_message_27 = 27;
+  map<fixed32, sfixed32> field_map_fixed32_sfixed32_28 = 28;
+  map<fixed32, sfixed64> field_map_fixed32_sfixed64_29 = 29;
+  map<fixed32, sint32> field_map_fixed32_sint32_30 = 30;
+  map<fixed32, sint64> field_map_fixed32_sint64_31 = 31;
+  map<fixed32, string> field_map_fixed32_string_32 = 32;
+  map<fixed32, uint32> field_map_fixed32_uint32_33 = 33;
+  map<fixed32, uint64> field_map_fixed32_uint64_34 = 34;
+  map<fixed64, bool> field_map_fixed64_bool_35 = 35;
+  map<fixed64, bytes> field_map_fixed64_bytes_36 = 36;
+  map<fixed64, double> field_map_fixed64_double_37 = 37;
+  map<fixed64, Proto2Message.TestEnum> field_map_fixed64_enum_38 = 38;
+  map<fixed64, fixed32> field_map_fixed64_fixed32_39 = 39;
+  map<fixed64, fixed64> field_map_fixed64_fixed64_40 = 40;
+  map<fixed64, float> field_map_fixed64_float_41 = 41;
+  map<fixed64, int32> field_map_fixed64_int32_42 = 42;
+  map<fixed64, int64> field_map_fixed64_int64_43 = 43;
+  map<fixed64, Proto2Message> field_map_fixed64_message_44 = 44;
+  map<fixed64, sfixed32> field_map_fixed64_sfixed32_45 = 45;
+  map<fixed64, sfixed64> field_map_fixed64_sfixed64_46 = 46;
+  map<fixed64, sint32> field_map_fixed64_sint32_47 = 47;
+  map<fixed64, sint64> field_map_fixed64_sint64_48 = 48;
+  map<fixed64, string> field_map_fixed64_string_49 = 49;
+  map<fixed64, uint32> field_map_fixed64_uint32_50 = 50;
+  map<fixed64, uint64> field_map_fixed64_uint64_51 = 51;
+  map<int32, bool> field_map_int32_bool_52 = 52;
+  map<int32, bytes> field_map_int32_bytes_53 = 53;
+  map<int32, double> field_map_int32_double_54 = 54;
+  map<int32, Proto2Message.TestEnum> field_map_int32_enum_55 = 55;
+  map<int32, fixed32> field_map_int32_fixed32_56 = 56;
+  map<int32, fixed64> field_map_int32_fixed64_57 = 57;
+  map<int32, float> field_map_int32_float_58 = 58;
+  map<int32, int32> field_map_int32_int32_59 = 59;
+  map<int32, int64> field_map_int32_int64_60 = 60;
+  map<int32, Proto2Message> field_map_int32_message_61 = 61;
+  map<int32, sfixed32> field_map_int32_sfixed32_62 = 62;
+  map<int32, sfixed64> field_map_int32_sfixed64_63 = 63;
+  map<int32, sint32> field_map_int32_sint32_64 = 64;
+  map<int32, sint64> field_map_int32_sint64_65 = 65;
+  map<int32, string> field_map_int32_string_66 = 66;
+  map<int32, uint32> field_map_int32_uint32_67 = 67;
+  map<int32, uint64> field_map_int32_uint64_68 = 68;
+  map<int64, bool> field_map_int64_bool_69 = 69;
+  map<int64, bytes> field_map_int64_bytes_70 = 70;
+  map<int64, double> field_map_int64_double_71 = 71;
+  map<int64, Proto2Message.TestEnum> field_map_int64_enum_72 = 72;
+  map<int64, fixed32> field_map_int64_fixed32_73 = 73;
+  map<int64, fixed64> field_map_int64_fixed64_74 = 74;
+  map<int64, float> field_map_int64_float_75 = 75;
+  map<int64, int32> field_map_int64_int32_76 = 76;
+  map<int64, int64> field_map_int64_int64_77 = 77;
+  map<int64, Proto2Message> field_map_int64_message_78 = 78;
+  map<int64, sfixed32> field_map_int64_sfixed32_79 = 79;
+  map<int64, sfixed64> field_map_int64_sfixed64_80 = 80;
+  map<int64, sint32> field_map_int64_sint32_81 = 81;
+  map<int64, sint64> field_map_int64_sint64_82 = 82;
+  map<int64, string> field_map_int64_string_83 = 83;
+  map<int64, uint32> field_map_int64_uint32_84 = 84;
+  map<int64, uint64> field_map_int64_uint64_85 = 85;
+  map<sfixed32, bool> field_map_sfixed32_bool_86 = 86;
+  map<sfixed32, bytes> field_map_sfixed32_bytes_87 = 87;
+  map<sfixed32, double> field_map_sfixed32_double_88 = 88;
+  map<sfixed32, Proto2Message.TestEnum> field_map_sfixed32_enum_89 = 89;
+  map<sfixed32, fixed32> field_map_sfixed32_fixed32_90 = 90;
+  map<sfixed32, fixed64> field_map_sfixed32_fixed64_91 = 91;
+  map<sfixed32, float> field_map_sfixed32_float_92 = 92;
+  map<sfixed32, int32> field_map_sfixed32_int32_93 = 93;
+  map<sfixed32, int64> field_map_sfixed32_int64_94 = 94;
+  map<sfixed32, Proto2Message> field_map_sfixed32_message_95 = 95;
+  map<sfixed32, sfixed32> field_map_sfixed32_sfixed32_96 = 96;
+  map<sfixed32, sfixed64> field_map_sfixed32_sfixed64_97 = 97;
+  map<sfixed32, sint32> field_map_sfixed32_sint32_98 = 98;
+  map<sfixed32, sint64> field_map_sfixed32_sint64_99 = 99;
+  map<sfixed32, string> field_map_sfixed32_string_100 = 100;
+  map<sfixed32, uint32> field_map_sfixed32_uint32_101 = 101;
+  map<sfixed32, uint64> field_map_sfixed32_uint64_102 = 102;
+  map<sfixed64, bool> field_map_sfixed64_bool_103 = 103;
+  map<sfixed64, bytes> field_map_sfixed64_bytes_104 = 104;
+  map<sfixed64, double> field_map_sfixed64_double_105 = 105;
+  map<sfixed64, Proto2Message.TestEnum> field_map_sfixed64_enum_106 = 106;
+  map<sfixed64, fixed32> field_map_sfixed64_fixed32_107 = 107;
+  map<sfixed64, fixed64> field_map_sfixed64_fixed64_108 = 108;
+  map<sfixed64, float> field_map_sfixed64_float_109 = 109;
+  map<sfixed64, int32> field_map_sfixed64_int32_110 = 110;
+  map<sfixed64, int64> field_map_sfixed64_int64_111 = 111;
+  map<sfixed64, Proto2Message> field_map_sfixed64_message_112 = 112;
+  map<sfixed64, sfixed32> field_map_sfixed64_sfixed32_113 = 113;
+  map<sfixed64, sfixed64> field_map_sfixed64_sfixed64_114 = 114;
+  map<sfixed64, sint32> field_map_sfixed64_sint32_115 = 115;
+  map<sfixed64, sint64> field_map_sfixed64_sint64_116 = 116;
+  map<sfixed64, string> field_map_sfixed64_string_117 = 117;
+  map<sfixed64, uint32> field_map_sfixed64_uint32_118 = 118;
+  map<sfixed64, uint64> field_map_sfixed64_uint64_119 = 119;
+  map<sint32, bool> field_map_sint32_bool_120 = 120;
+  map<sint32, bytes> field_map_sint32_bytes_121 = 121;
+  map<sint32, double> field_map_sint32_double_122 = 122;
+  map<sint32, Proto2Message.TestEnum> field_map_sint32_enum_123 = 123;
+  map<sint32, fixed32> field_map_sint32_fixed32_124 = 124;
+  map<sint32, fixed64> field_map_sint32_fixed64_125 = 125;
+  map<sint32, float> field_map_sint32_float_126 = 126;
+  map<sint32, int32> field_map_sint32_int32_127 = 127;
+  map<sint32, int64> field_map_sint32_int64_128 = 128;
+  map<sint32, Proto2Message> field_map_sint32_message_129 = 129;
+  map<sint32, sfixed32> field_map_sint32_sfixed32_130 = 130;
+  map<sint32, sfixed64> field_map_sint32_sfixed64_131 = 131;
+  map<sint32, sint32> field_map_sint32_sint32_132 = 132;
+  map<sint32, sint64> field_map_sint32_sint64_133 = 133;
+  map<sint32, string> field_map_sint32_string_134 = 134;
+  map<sint32, uint32> field_map_sint32_uint32_135 = 135;
+  map<sint32, uint64> field_map_sint32_uint64_136 = 136;
+  map<sint64, bool> field_map_sint64_bool_137 = 137;
+  map<sint64, bytes> field_map_sint64_bytes_138 = 138;
+  map<sint64, double> field_map_sint64_double_139 = 139;
+  map<sint64, Proto2Message.TestEnum> field_map_sint64_enum_140 = 140;
+  map<sint64, fixed32> field_map_sint64_fixed32_141 = 141;
+  map<sint64, fixed64> field_map_sint64_fixed64_142 = 142;
+  map<sint64, float> field_map_sint64_float_143 = 143;
+  map<sint64, int32> field_map_sint64_int32_144 = 144;
+  map<sint64, int64> field_map_sint64_int64_145 = 145;
+  map<sint64, Proto2Message> field_map_sint64_message_146 = 146;
+  map<sint64, sfixed32> field_map_sint64_sfixed32_147 = 147;
+  map<sint64, sfixed64> field_map_sint64_sfixed64_148 = 148;
+  map<sint64, sint32> field_map_sint64_sint32_149 = 149;
+  map<sint64, sint64> field_map_sint64_sint64_150 = 150;
+  map<sint64, string> field_map_sint64_string_151 = 151;
+  map<sint64, uint32> field_map_sint64_uint32_152 = 152;
+  map<sint64, uint64> field_map_sint64_uint64_153 = 153;
+  map<string, bool> field_map_string_bool_154 = 154;
+  map<string, bytes> field_map_string_bytes_155 = 155;
+  map<string, double> field_map_string_double_156 = 156;
+  map<string, Proto2Message.TestEnum> field_map_string_enum_157 = 157;
+  map<string, fixed32> field_map_string_fixed32_158 = 158;
+  map<string, fixed64> field_map_string_fixed64_159 = 159;
+  map<string, float> field_map_string_float_160 = 160;
+  map<string, int32> field_map_string_int32_161 = 161;
+  map<string, int64> field_map_string_int64_162 = 162;
+  map<string, Proto2Message> field_map_string_message_163 = 163;
+  map<string, sfixed32> field_map_string_sfixed32_164 = 164;
+  map<string, sfixed64> field_map_string_sfixed64_165 = 165;
+  map<string, sint32> field_map_string_sint32_166 = 166;
+  map<string, sint64> field_map_string_sint64_167 = 167;
+  map<string, string> field_map_string_string_168 = 168;
+  map<string, uint32> field_map_string_uint32_169 = 169;
+  map<string, uint64> field_map_string_uint64_170 = 170;
+  map<uint32, bool> field_map_uint32_bool_171 = 171;
+  map<uint32, bytes> field_map_uint32_bytes_172 = 172;
+  map<uint32, double> field_map_uint32_double_173 = 173;
+  map<uint32, Proto2Message.TestEnum> field_map_uint32_enum_174 = 174;
+  map<uint32, fixed32> field_map_uint32_fixed32_175 = 175;
+  map<uint32, fixed64> field_map_uint32_fixed64_176 = 176;
+  map<uint32, float> field_map_uint32_float_177 = 177;
+  map<uint32, int32> field_map_uint32_int32_178 = 178;
+  map<uint32, int64> field_map_uint32_int64_179 = 179;
+  map<uint32, Proto2Message> field_map_uint32_message_180 = 180;
+  map<uint32, sfixed32> field_map_uint32_sfixed32_181 = 181;
+  map<uint32, sfixed64> field_map_uint32_sfixed64_182 = 182;
+  map<uint32, sint32> field_map_uint32_sint32_183 = 183;
+  map<uint32, sint64> field_map_uint32_sint64_184 = 184;
+  map<uint32, string> field_map_uint32_string_185 = 185;
+  map<uint32, uint32> field_map_uint32_uint32_186 = 186;
+  map<uint32, uint64> field_map_uint32_uint64_187 = 187;
+  map<uint64, bool> field_map_uint64_bool_188 = 188;
+  map<uint64, bytes> field_map_uint64_bytes_189 = 189;
+  map<uint64, double> field_map_uint64_double_190 = 190;
+  map<uint64, Proto2Message.TestEnum> field_map_uint64_enum_191 = 191;
+  map<uint64, fixed32> field_map_uint64_fixed32_192 = 192;
+  map<uint64, fixed64> field_map_uint64_fixed64_193 = 193;
+  map<uint64, float> field_map_uint64_float_194 = 194;
+  map<uint64, int32> field_map_uint64_int32_195 = 195;
+  map<uint64, int64> field_map_uint64_int64_196 = 196;
+  map<uint64, Proto2Message> field_map_uint64_message_197 = 197;
+  map<uint64, sfixed32> field_map_uint64_sfixed32_198 = 198;
+  map<uint64, sfixed64> field_map_uint64_sfixed64_199 = 199;
+  map<uint64, sint32> field_map_uint64_sint32_200 = 200;
+  map<uint64, sint64> field_map_uint64_sint64_201 = 201;
+  map<uint64, string> field_map_uint64_string_202 = 202;
+  map<uint64, uint32> field_map_uint64_uint32_203 = 203;
+  map<uint64, uint64> field_map_uint64_uint64_204 = 204;
+}
diff --git a/java/core/src/test/proto/com/google/protobuf/proto2_message_lite.proto b/java/core/src/test/proto/com/google/protobuf/proto2_message_lite.proto
new file mode 100755
index 0000000..8385dfd
--- /dev/null
+++ b/java/core/src/test/proto/com/google/protobuf/proto2_message_lite.proto
@@ -0,0 +1,422 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// LINT: ALLOW_GROUPS
+syntax = "proto2";
+
+option java_package = "com.google.protobuf.testing";
+option java_outer_classname = "Proto2TestingLite";
+package protobuf.experimental.lite;
+
+
+message Proto2MessageLite {
+
+  enum TestEnum {
+    ZERO = 0;
+    ONE = 1;
+    TWO = 2;
+  }
+
+  optional double field_double_1 = 1;
+  optional float field_float_2 = 2;
+  optional int64 field_int64_3 = 3;
+  optional uint64 field_uint64_4 = 4;
+  optional int32 field_int32_5 = 5;
+  optional fixed64 field_fixed64_6 = 6;
+  optional fixed32 field_fixed32_7 = 7;
+  optional bool field_bool_8 = 8;
+  optional string field_string_9 = 9;
+  optional Proto2MessageLite field_message_10 = 10;
+  optional bytes field_bytes_11 = 11;
+  optional uint32 field_uint32_12 = 12;
+  optional TestEnum field_enum_13 = 13;
+  optional sfixed32 field_sfixed32_14 = 14;
+  optional sfixed64 field_sfixed64_15 = 15;
+  optional sint32 field_sint32_16 = 16;
+  optional sint64 field_sint64_17 = 17;
+  repeated double field_double_list_18 = 18 [packed = false];
+  repeated float field_float_list_19 = 19 [packed = false];
+  repeated int64 field_int64_list_20 = 20 [packed = false];
+  repeated uint64 field_uint64_list_21 = 21 [packed = false];
+  repeated int32 field_int32_list_22 = 22 [packed = false];
+  repeated fixed64 field_fixed64_list_23 = 23 [packed = false];
+  repeated fixed32 field_fixed32_list_24 = 24 [packed = false];
+  repeated bool field_bool_list_25 = 25 [packed = false];
+  repeated string field_string_list_26 = 26 [packed = false];
+  repeated Proto2MessageLite field_message_list_27 = 27 [packed = false];
+  repeated bytes field_bytes_list_28 = 28 [packed = false];
+  repeated uint32 field_uint32_list_29 = 29 [packed = false];
+  repeated TestEnum field_enum_list_30 = 30 [packed = false];
+  repeated sfixed32 field_sfixed32_list_31 = 31 [packed = false];
+  repeated sfixed64 field_sfixed64_list_32 = 32 [packed = false];
+  repeated sint32 field_sint32_list_33 = 33 [packed = false];
+  repeated sint64 field_sint64_list_34 = 34 [packed = false];
+  repeated double field_double_list_packed_35 = 35 [packed = true];
+  repeated float field_float_list_packed_36 = 36 [packed = true];
+  repeated int64 field_int64_list_packed_37 = 37 [packed = true];
+  repeated uint64 field_uint64_list_packed_38 = 38 [packed = true];
+  repeated int32 field_int32_list_packed_39 = 39 [packed = true];
+  repeated fixed64 field_fixed64_list_packed_40 = 40 [packed = true];
+  repeated fixed32 field_fixed32_list_packed_41 = 41 [packed = true];
+  repeated bool field_bool_list_packed_42 = 42 [packed = true];
+  repeated uint32 field_uint32_list_packed_43 = 43 [packed = true];
+  repeated TestEnum field_enum_list_packed_44 = 44 [packed = true];
+  repeated sfixed32 field_sfixed32_list_packed_45 = 45 [packed = true];
+  repeated sfixed64 field_sfixed64_list_packed_46 = 46 [packed = true];
+  repeated sint32 field_sint32_list_packed_47 = 47 [packed = true];
+  repeated sint64 field_sint64_list_packed_48 = 48 [packed = true];
+  optional group FieldGroup49 = 49 {
+    optional int32 field_int32_50 = 50;
+  }
+  repeated group FieldGroupList51 = 51 {
+    optional int32 field_int32_52 = 52;
+  }
+  oneof test_oneof {
+    double field_double_53 = 53;
+    float field_float_54 = 54;
+    int64 field_int64_55 = 55;
+    uint64 field_uint64_56 = 56;
+    int32 field_int32_57 = 57;
+    fixed64 field_fixed64_58 = 58;
+    fixed32 field_fixed32_59 = 59;
+    bool field_bool_60 = 60;
+    string field_string_61 = 61;
+    Proto2MessageLite field_message_62 = 62;
+    bytes field_bytes_63 = 63;
+    uint32 field_uint32_64 = 64;
+    sfixed32 field_sfixed32_65 = 65;
+    sfixed64 field_sfixed64_66 = 66;
+    sint32 field_sint32_67 = 67;
+    sint64 field_sint64_68 = 68;
+    group FieldGroup69 = 69 {
+      optional int32 field_int32_70 = 70;
+    }
+  }
+
+  message RequiredNestedMessage {
+    optional int32 value = 1;
+  }
+
+  required double field_required_double_71 = 71;
+  required float field_required_float_72 = 72;
+  required int64 field_required_int64_73 = 73;
+  required uint64 field_required_uint64_74 = 74;
+  required int32 field_required_int32_75 = 75;
+  required fixed64 field_required_fixed64_76 = 76;
+  required fixed32 field_required_fixed32_77 = 77;
+  required bool field_required_bool_78 = 78;
+  required string field_required_string_79 = 79;
+  required RequiredNestedMessage field_required_message_80 = 80;
+  required bytes field_required_bytes_81 = 81;
+  required uint32 field_required_uint32_82 = 82;
+  required TestEnum field_required_enum_83 = 83;
+  required sfixed32 field_required_sfixed32_84 = 84;
+  required sfixed64 field_required_sfixed64_85 = 85;
+  required sint32 field_required_sint32_86 = 86;
+  required sint64 field_required_sint64_87 = 87;
+  required group FieldRequiredGroup88 = 88 {
+    optional int32 field_int32_89 = 89;
+  }
+}
+
+message Proto2EmptyLite {}
+
+message Proto2MessageLiteWithExtensions {
+  extensions 1 to max;
+}
+
+extend Proto2MessageLiteWithExtensions {
+  optional double field_double_1 = 1;
+  optional float field_float_2 = 2;
+  optional int64 field_int64_3 = 3;
+  optional uint64 field_uint64_4 = 4;
+  optional int32 field_int32_5 = 5;
+  optional fixed64 field_fixed64_6 = 6;
+  optional fixed32 field_fixed32_7 = 7;
+  optional bool field_bool_8 = 8;
+  optional string field_string_9 = 9;
+  optional Proto2MessageLite field_message_10 = 10;
+  optional bytes field_bytes_11 = 11;
+  optional uint32 field_uint32_12 = 12;
+  optional Proto2MessageLite.TestEnum field_enum_13 = 13;
+  optional sfixed32 field_sfixed32_14 = 14;
+  optional sfixed64 field_sfixed64_15 = 15;
+  optional sint32 field_sint32_16 = 16;
+  optional sint64 field_sint64_17 = 17;
+
+  repeated double field_double_list_18 = 18 [packed = false];
+  repeated float field_float_list_19 = 19 [packed = false];
+  repeated int64 field_int64_list_20 = 20 [packed = false];
+  repeated uint64 field_uint64_list_21 = 21 [packed = false];
+  repeated int32 field_int32_list_22 = 22 [packed = false];
+  repeated fixed64 field_fixed64_list_23 = 23 [packed = false];
+  repeated fixed32 field_fixed32_list_24 = 24 [packed = false];
+  repeated bool field_bool_list_25 = 25 [packed = false];
+  repeated string field_string_list_26 = 26 [packed = false];
+  repeated Proto2MessageLite field_message_list_27 = 27 [packed = false];
+  repeated bytes field_bytes_list_28 = 28 [packed = false];
+  repeated uint32 field_uint32_list_29 = 29 [packed = false];
+  repeated Proto2MessageLite.TestEnum field_enum_list_30 = 30 [packed = false];
+  repeated sfixed32 field_sfixed32_list_31 = 31 [packed = false];
+  repeated sfixed64 field_sfixed64_list_32 = 32 [packed = false];
+  repeated sint32 field_sint32_list_33 = 33 [packed = false];
+  repeated sint64 field_sint64_list_34 = 34 [packed = false];
+
+  repeated double field_double_list_packed_35 = 35 [packed = true];
+  repeated float field_float_list_packed_36 = 36 [packed = true];
+  repeated int64 field_int64_list_packed_37 = 37 [packed = true];
+  repeated uint64 field_uint64_list_packed_38 = 38 [packed = true];
+  repeated int32 field_int32_list_packed_39 = 39 [packed = true];
+  repeated fixed64 field_fixed64_list_packed_40 = 40 [packed = true];
+  repeated fixed32 field_fixed32_list_packed_41 = 41 [packed = true];
+  repeated bool field_bool_list_packed_42 = 42 [packed = true];
+  repeated uint32 field_uint32_list_packed_43 = 43 [packed = true];
+  repeated Proto2MessageLite.TestEnum field_enum_list_packed_44 = 44
+      [packed = true];
+  repeated sfixed32 field_sfixed32_list_packed_45 = 45 [packed = true];
+  repeated sfixed64 field_sfixed64_list_packed_46 = 46 [packed = true];
+  repeated sint32 field_sint32_list_packed_47 = 47 [packed = true];
+  repeated sint64 field_sint64_list_packed_48 = 48 [packed = true];
+
+  optional group FieldGroup49 = 49 {
+    optional int32 field_int32_50 = 50;
+  }
+
+  repeated group FieldGroupList51 = 51 {
+    optional int32 field_int32_52 = 52;
+  }
+}
+
+message Proto2MessageLiteWithMaps {
+  map<bool, bool> field_map_bool_bool_1 = 1;
+  map<bool, bytes> field_map_bool_bytes_2 = 2;
+  map<bool, double> field_map_bool_double_3 = 3;
+  map<bool, Proto2MessageLite.TestEnum> field_map_bool_enum_4 = 4;
+  map<bool, fixed32> field_map_bool_fixed32_5 = 5;
+  map<bool, fixed64> field_map_bool_fixed64_6 = 6;
+  map<bool, float> field_map_bool_float_7 = 7;
+  map<bool, int32> field_map_bool_int32_8 = 8;
+  map<bool, int64> field_map_bool_int64_9 = 9;
+  map<bool, Proto2MessageLite> field_map_bool_message_10 = 10;
+  map<bool, sfixed32> field_map_bool_sfixed32_11 = 11;
+  map<bool, sfixed64> field_map_bool_sfixed64_12 = 12;
+  map<bool, sint32> field_map_bool_sint32_13 = 13;
+  map<bool, sint64> field_map_bool_sint64_14 = 14;
+  map<bool, string> field_map_bool_string_15 = 15;
+  map<bool, uint32> field_map_bool_uint32_16 = 16;
+  map<bool, uint64> field_map_bool_uint64_17 = 17;
+  map<fixed32, bool> field_map_fixed32_bool_18 = 18;
+  map<fixed32, bytes> field_map_fixed32_bytes_19 = 19;
+  map<fixed32, double> field_map_fixed32_double_20 = 20;
+  map<fixed32, Proto2MessageLite.TestEnum> field_map_fixed32_enum_21 = 21;
+  map<fixed32, fixed32> field_map_fixed32_fixed32_22 = 22;
+  map<fixed32, fixed64> field_map_fixed32_fixed64_23 = 23;
+  map<fixed32, float> field_map_fixed32_float_24 = 24;
+  map<fixed32, int32> field_map_fixed32_int32_25 = 25;
+  map<fixed32, int64> field_map_fixed32_int64_26 = 26;
+  map<fixed32, Proto2MessageLite> field_map_fixed32_message_27 = 27;
+  map<fixed32, sfixed32> field_map_fixed32_sfixed32_28 = 28;
+  map<fixed32, sfixed64> field_map_fixed32_sfixed64_29 = 29;
+  map<fixed32, sint32> field_map_fixed32_sint32_30 = 30;
+  map<fixed32, sint64> field_map_fixed32_sint64_31 = 31;
+  map<fixed32, string> field_map_fixed32_string_32 = 32;
+  map<fixed32, uint32> field_map_fixed32_uint32_33 = 33;
+  map<fixed32, uint64> field_map_fixed32_uint64_34 = 34;
+  map<fixed64, bool> field_map_fixed64_bool_35 = 35;
+  map<fixed64, bytes> field_map_fixed64_bytes_36 = 36;
+  map<fixed64, double> field_map_fixed64_double_37 = 37;
+  map<fixed64, Proto2MessageLite.TestEnum> field_map_fixed64_enum_38 = 38;
+  map<fixed64, fixed32> field_map_fixed64_fixed32_39 = 39;
+  map<fixed64, fixed64> field_map_fixed64_fixed64_40 = 40;
+  map<fixed64, float> field_map_fixed64_float_41 = 41;
+  map<fixed64, int32> field_map_fixed64_int32_42 = 42;
+  map<fixed64, int64> field_map_fixed64_int64_43 = 43;
+  map<fixed64, Proto2MessageLite> field_map_fixed64_message_44 = 44;
+  map<fixed64, sfixed32> field_map_fixed64_sfixed32_45 = 45;
+  map<fixed64, sfixed64> field_map_fixed64_sfixed64_46 = 46;
+  map<fixed64, sint32> field_map_fixed64_sint32_47 = 47;
+  map<fixed64, sint64> field_map_fixed64_sint64_48 = 48;
+  map<fixed64, string> field_map_fixed64_string_49 = 49;
+  map<fixed64, uint32> field_map_fixed64_uint32_50 = 50;
+  map<fixed64, uint64> field_map_fixed64_uint64_51 = 51;
+  map<int32, bool> field_map_int32_bool_52 = 52;
+  map<int32, bytes> field_map_int32_bytes_53 = 53;
+  map<int32, double> field_map_int32_double_54 = 54;
+  map<int32, Proto2MessageLite.TestEnum> field_map_int32_enum_55 = 55;
+  map<int32, fixed32> field_map_int32_fixed32_56 = 56;
+  map<int32, fixed64> field_map_int32_fixed64_57 = 57;
+  map<int32, float> field_map_int32_float_58 = 58;
+  map<int32, int32> field_map_int32_int32_59 = 59;
+  map<int32, int64> field_map_int32_int64_60 = 60;
+  map<int32, Proto2MessageLite> field_map_int32_message_61 = 61;
+  map<int32, sfixed32> field_map_int32_sfixed32_62 = 62;
+  map<int32, sfixed64> field_map_int32_sfixed64_63 = 63;
+  map<int32, sint32> field_map_int32_sint32_64 = 64;
+  map<int32, sint64> field_map_int32_sint64_65 = 65;
+  map<int32, string> field_map_int32_string_66 = 66;
+  map<int32, uint32> field_map_int32_uint32_67 = 67;
+  map<int32, uint64> field_map_int32_uint64_68 = 68;
+  map<int64, bool> field_map_int64_bool_69 = 69;
+  map<int64, bytes> field_map_int64_bytes_70 = 70;
+  map<int64, double> field_map_int64_double_71 = 71;
+  map<int64, Proto2MessageLite.TestEnum> field_map_int64_enum_72 = 72;
+  map<int64, fixed32> field_map_int64_fixed32_73 = 73;
+  map<int64, fixed64> field_map_int64_fixed64_74 = 74;
+  map<int64, float> field_map_int64_float_75 = 75;
+  map<int64, int32> field_map_int64_int32_76 = 76;
+  map<int64, int64> field_map_int64_int64_77 = 77;
+  map<int64, Proto2MessageLite> field_map_int64_message_78 = 78;
+  map<int64, sfixed32> field_map_int64_sfixed32_79 = 79;
+  map<int64, sfixed64> field_map_int64_sfixed64_80 = 80;
+  map<int64, sint32> field_map_int64_sint32_81 = 81;
+  map<int64, sint64> field_map_int64_sint64_82 = 82;
+  map<int64, string> field_map_int64_string_83 = 83;
+  map<int64, uint32> field_map_int64_uint32_84 = 84;
+  map<int64, uint64> field_map_int64_uint64_85 = 85;
+  map<sfixed32, bool> field_map_sfixed32_bool_86 = 86;
+  map<sfixed32, bytes> field_map_sfixed32_bytes_87 = 87;
+  map<sfixed32, double> field_map_sfixed32_double_88 = 88;
+  map<sfixed32, Proto2MessageLite.TestEnum> field_map_sfixed32_enum_89 = 89;
+  map<sfixed32, fixed32> field_map_sfixed32_fixed32_90 = 90;
+  map<sfixed32, fixed64> field_map_sfixed32_fixed64_91 = 91;
+  map<sfixed32, float> field_map_sfixed32_float_92 = 92;
+  map<sfixed32, int32> field_map_sfixed32_int32_93 = 93;
+  map<sfixed32, int64> field_map_sfixed32_int64_94 = 94;
+  map<sfixed32, Proto2MessageLite> field_map_sfixed32_message_95 = 95;
+  map<sfixed32, sfixed32> field_map_sfixed32_sfixed32_96 = 96;
+  map<sfixed32, sfixed64> field_map_sfixed32_sfixed64_97 = 97;
+  map<sfixed32, sint32> field_map_sfixed32_sint32_98 = 98;
+  map<sfixed32, sint64> field_map_sfixed32_sint64_99 = 99;
+  map<sfixed32, string> field_map_sfixed32_string_100 = 100;
+  map<sfixed32, uint32> field_map_sfixed32_uint32_101 = 101;
+  map<sfixed32, uint64> field_map_sfixed32_uint64_102 = 102;
+  map<sfixed64, bool> field_map_sfixed64_bool_103 = 103;
+  map<sfixed64, bytes> field_map_sfixed64_bytes_104 = 104;
+  map<sfixed64, double> field_map_sfixed64_double_105 = 105;
+  map<sfixed64, Proto2MessageLite.TestEnum> field_map_sfixed64_enum_106 = 106;
+  map<sfixed64, fixed32> field_map_sfixed64_fixed32_107 = 107;
+  map<sfixed64, fixed64> field_map_sfixed64_fixed64_108 = 108;
+  map<sfixed64, float> field_map_sfixed64_float_109 = 109;
+  map<sfixed64, int32> field_map_sfixed64_int32_110 = 110;
+  map<sfixed64, int64> field_map_sfixed64_int64_111 = 111;
+  map<sfixed64, Proto2MessageLite> field_map_sfixed64_message_112 = 112;
+  map<sfixed64, sfixed32> field_map_sfixed64_sfixed32_113 = 113;
+  map<sfixed64, sfixed64> field_map_sfixed64_sfixed64_114 = 114;
+  map<sfixed64, sint32> field_map_sfixed64_sint32_115 = 115;
+  map<sfixed64, sint64> field_map_sfixed64_sint64_116 = 116;
+  map<sfixed64, string> field_map_sfixed64_string_117 = 117;
+  map<sfixed64, uint32> field_map_sfixed64_uint32_118 = 118;
+  map<sfixed64, uint64> field_map_sfixed64_uint64_119 = 119;
+  map<sint32, bool> field_map_sint32_bool_120 = 120;
+  map<sint32, bytes> field_map_sint32_bytes_121 = 121;
+  map<sint32, double> field_map_sint32_double_122 = 122;
+  map<sint32, Proto2MessageLite.TestEnum> field_map_sint32_enum_123 = 123;
+  map<sint32, fixed32> field_map_sint32_fixed32_124 = 124;
+  map<sint32, fixed64> field_map_sint32_fixed64_125 = 125;
+  map<sint32, float> field_map_sint32_float_126 = 126;
+  map<sint32, int32> field_map_sint32_int32_127 = 127;
+  map<sint32, int64> field_map_sint32_int64_128 = 128;
+  map<sint32, Proto2MessageLite> field_map_sint32_message_129 = 129;
+  map<sint32, sfixed32> field_map_sint32_sfixed32_130 = 130;
+  map<sint32, sfixed64> field_map_sint32_sfixed64_131 = 131;
+  map<sint32, sint32> field_map_sint32_sint32_132 = 132;
+  map<sint32, sint64> field_map_sint32_sint64_133 = 133;
+  map<sint32, string> field_map_sint32_string_134 = 134;
+  map<sint32, uint32> field_map_sint32_uint32_135 = 135;
+  map<sint32, uint64> field_map_sint32_uint64_136 = 136;
+  map<sint64, bool> field_map_sint64_bool_137 = 137;
+  map<sint64, bytes> field_map_sint64_bytes_138 = 138;
+  map<sint64, double> field_map_sint64_double_139 = 139;
+  map<sint64, Proto2MessageLite.TestEnum> field_map_sint64_enum_140 = 140;
+  map<sint64, fixed32> field_map_sint64_fixed32_141 = 141;
+  map<sint64, fixed64> field_map_sint64_fixed64_142 = 142;
+  map<sint64, float> field_map_sint64_float_143 = 143;
+  map<sint64, int32> field_map_sint64_int32_144 = 144;
+  map<sint64, int64> field_map_sint64_int64_145 = 145;
+  map<sint64, Proto2MessageLite> field_map_sint64_message_146 = 146;
+  map<sint64, sfixed32> field_map_sint64_sfixed32_147 = 147;
+  map<sint64, sfixed64> field_map_sint64_sfixed64_148 = 148;
+  map<sint64, sint32> field_map_sint64_sint32_149 = 149;
+  map<sint64, sint64> field_map_sint64_sint64_150 = 150;
+  map<sint64, string> field_map_sint64_string_151 = 151;
+  map<sint64, uint32> field_map_sint64_uint32_152 = 152;
+  map<sint64, uint64> field_map_sint64_uint64_153 = 153;
+  map<string, bool> field_map_string_bool_154 = 154;
+  map<string, bytes> field_map_string_bytes_155 = 155;
+  map<string, double> field_map_string_double_156 = 156;
+  map<string, Proto2MessageLite.TestEnum> field_map_string_enum_157 = 157;
+  map<string, fixed32> field_map_string_fixed32_158 = 158;
+  map<string, fixed64> field_map_string_fixed64_159 = 159;
+  map<string, float> field_map_string_float_160 = 160;
+  map<string, int32> field_map_string_int32_161 = 161;
+  map<string, int64> field_map_string_int64_162 = 162;
+  map<string, Proto2MessageLite> field_map_string_message_163 = 163;
+  map<string, sfixed32> field_map_string_sfixed32_164 = 164;
+  map<string, sfixed64> field_map_string_sfixed64_165 = 165;
+  map<string, sint32> field_map_string_sint32_166 = 166;
+  map<string, sint64> field_map_string_sint64_167 = 167;
+  map<string, string> field_map_string_string_168 = 168;
+  map<string, uint32> field_map_string_uint32_169 = 169;
+  map<string, uint64> field_map_string_uint64_170 = 170;
+  map<uint32, bool> field_map_uint32_bool_171 = 171;
+  map<uint32, bytes> field_map_uint32_bytes_172 = 172;
+  map<uint32, double> field_map_uint32_double_173 = 173;
+  map<uint32, Proto2MessageLite.TestEnum> field_map_uint32_enum_174 = 174;
+  map<uint32, fixed32> field_map_uint32_fixed32_175 = 175;
+  map<uint32, fixed64> field_map_uint32_fixed64_176 = 176;
+  map<uint32, float> field_map_uint32_float_177 = 177;
+  map<uint32, int32> field_map_uint32_int32_178 = 178;
+  map<uint32, int64> field_map_uint32_int64_179 = 179;
+  map<uint32, Proto2MessageLite> field_map_uint32_message_180 = 180;
+  map<uint32, sfixed32> field_map_uint32_sfixed32_181 = 181;
+  map<uint32, sfixed64> field_map_uint32_sfixed64_182 = 182;
+  map<uint32, sint32> field_map_uint32_sint32_183 = 183;
+  map<uint32, sint64> field_map_uint32_sint64_184 = 184;
+  map<uint32, string> field_map_uint32_string_185 = 185;
+  map<uint32, uint32> field_map_uint32_uint32_186 = 186;
+  map<uint32, uint64> field_map_uint32_uint64_187 = 187;
+  map<uint64, bool> field_map_uint64_bool_188 = 188;
+  map<uint64, bytes> field_map_uint64_bytes_189 = 189;
+  map<uint64, double> field_map_uint64_double_190 = 190;
+  map<uint64, Proto2MessageLite.TestEnum> field_map_uint64_enum_191 = 191;
+  map<uint64, fixed32> field_map_uint64_fixed32_192 = 192;
+  map<uint64, fixed64> field_map_uint64_fixed64_193 = 193;
+  map<uint64, float> field_map_uint64_float_194 = 194;
+  map<uint64, int32> field_map_uint64_int32_195 = 195;
+  map<uint64, int64> field_map_uint64_int64_196 = 196;
+  map<uint64, Proto2MessageLite> field_map_uint64_message_197 = 197;
+  map<uint64, sfixed32> field_map_uint64_sfixed32_198 = 198;
+  map<uint64, sfixed64> field_map_uint64_sfixed64_199 = 199;
+  map<uint64, sint32> field_map_uint64_sint32_200 = 200;
+  map<uint64, sint64> field_map_uint64_sint64_201 = 201;
+  map<uint64, string> field_map_uint64_string_202 = 202;
+  map<uint64, uint32> field_map_uint64_uint32_203 = 203;
+  map<uint64, uint64> field_map_uint64_uint64_204 = 204;
+}
diff --git a/java/core/src/test/proto/com/google/protobuf/proto3_message.proto b/java/core/src/test/proto/com/google/protobuf/proto3_message.proto
new file mode 100755
index 0000000..01c7deb
--- /dev/null
+++ b/java/core/src/test/proto/com/google/protobuf/proto3_message.proto
@@ -0,0 +1,326 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+option java_package = "com.google.protobuf.testing";
+option java_outer_classname = "Proto3Testing";
+package protobuf.experimental;
+
+message Proto3SpecialFieldName {
+  double regular_name = 1;
+  int32 cached_size = 2;
+  int64 serialized_size = 3;
+  string class = 4;
+}
+
+message Proto3Message {
+  enum TestEnum {
+    ZERO = 0;
+    ONE = 1;
+    TWO = 2;
+  }
+
+  double field_double_1 = 1;
+  float field_float_2 = 2;
+  int64 field_int64_3 = 3;
+  uint64 field_uint64_4 = 4;
+  int32 field_int32_5 = 5;
+  fixed64 field_fixed64_6 = 6;
+  fixed32 field_fixed32_7 = 7;
+  bool field_bool_8 = 8;
+  string field_string_9 = 9;
+  Proto3Message field_message_10 = 10;
+  bytes field_bytes_11 = 11;
+  uint32 field_uint32_12 = 12;
+  TestEnum field_enum_13 = 13;
+  sfixed32 field_sfixed32_14 = 14;
+  sfixed64 field_sfixed64_15 = 15;
+  sint32 field_sint32_16 = 16;
+  sint64 field_sint64_17 = 17;
+  repeated double field_double_list_18 = 18 [packed = false];
+  repeated float field_float_list_19 = 19 [packed = false];
+  repeated int64 field_int64_list_20 = 20 [packed = false];
+  repeated uint64 field_uint64_list_21 = 21 [packed = false];
+  repeated int32 field_int32_list_22 = 22 [packed = false];
+  repeated fixed64 field_fixed64_list_23 = 23 [packed = false];
+  repeated fixed32 field_fixed32_list_24 = 24 [packed = false];
+  repeated bool field_bool_list_25 = 25 [packed = false];
+  repeated string field_string_list_26 = 26 [packed = false];
+  repeated Proto3Message field_message_list_27 = 27 [packed = false];
+  repeated bytes field_bytes_list_28 = 28 [packed = false];
+  repeated uint32 field_uint32_list_29 = 29 [packed = false];
+  repeated TestEnum field_enum_list_30 = 30 [packed = false];
+  repeated sfixed32 field_sfixed32_list_31 = 31 [packed = false];
+  repeated sfixed64 field_sfixed64_list_32 = 32 [packed = false];
+  repeated sint32 field_sint32_list_33 = 33 [packed = false];
+  repeated sint64 field_sint64_list_34 = 34 [packed = false];
+  repeated double field_double_list_packed_35 = 35 [packed = true];
+  repeated float field_float_list_packed_36 = 36 [packed = true];
+  repeated int64 field_int64_list_packed_37 = 37 [packed = true];
+  repeated uint64 field_uint64_list_packed_38 = 38 [packed = true];
+  repeated int32 field_int32_list_packed_39 = 39 [packed = true];
+  repeated fixed64 field_fixed64_list_packed_40 = 40 [packed = true];
+  repeated fixed32 field_fixed32_list_packed_41 = 41 [packed = true];
+  repeated bool field_bool_list_packed_42 = 42 [packed = true];
+  repeated uint32 field_uint32_list_packed_43 = 43 [packed = true];
+  repeated TestEnum field_enum_list_packed_44 = 44 [packed = true];
+  repeated sfixed32 field_sfixed32_list_packed_45 = 45 [packed = true];
+  repeated sfixed64 field_sfixed64_list_packed_46 = 46 [packed = true];
+  repeated sint32 field_sint32_list_packed_47 = 47 [packed = true];
+  repeated sint64 field_sint64_list_packed_48 = 48 [packed = true];
+  oneof test_oneof {
+    double field_double_53 = 53;
+    float field_float_54 = 54;
+    int64 field_int64_55 = 55;
+    uint64 field_uint64_56 = 56;
+    int32 field_int32_57 = 57;
+    fixed64 field_fixed64_58 = 58;
+    fixed32 field_fixed32_59 = 59;
+    bool field_bool_60 = 60;
+    string field_string_61 = 61;
+    Proto3Message field_message_62 = 62;
+    bytes field_bytes_63 = 63;
+    uint32 field_uint32_64 = 64;
+    sfixed32 field_sfixed32_65 = 65;
+    sfixed64 field_sfixed64_66 = 66;
+    sint32 field_sint32_67 = 67;
+    sint64 field_sint64_68 = 68;
+  }
+}
+
+message Proto3Empty {}
+
+message Proto3MessageWithMaps {
+  map<bool, bool> field_map_bool_bool_1 = 1;
+  map<bool, bytes> field_map_bool_bytes_2 = 2;
+  map<bool, double> field_map_bool_double_3 = 3;
+  map<bool, Proto3Message.TestEnum> field_map_bool_enum_4 = 4;
+  map<bool, fixed32> field_map_bool_fixed32_5 = 5;
+  map<bool, fixed64> field_map_bool_fixed64_6 = 6;
+  map<bool, float> field_map_bool_float_7 = 7;
+  map<bool, int32> field_map_bool_int32_8 = 8;
+  map<bool, int64> field_map_bool_int64_9 = 9;
+  map<bool, Proto3Message> field_map_bool_message_10 = 10;
+  map<bool, sfixed32> field_map_bool_sfixed32_11 = 11;
+  map<bool, sfixed64> field_map_bool_sfixed64_12 = 12;
+  map<bool, sint32> field_map_bool_sint32_13 = 13;
+  map<bool, sint64> field_map_bool_sint64_14 = 14;
+  map<bool, string> field_map_bool_string_15 = 15;
+  map<bool, uint32> field_map_bool_uint32_16 = 16;
+  map<bool, uint64> field_map_bool_uint64_17 = 17;
+  map<fixed32, bool> field_map_fixed32_bool_18 = 18;
+  map<fixed32, bytes> field_map_fixed32_bytes_19 = 19;
+  map<fixed32, double> field_map_fixed32_double_20 = 20;
+  map<fixed32, Proto3Message.TestEnum> field_map_fixed32_enum_21 = 21;
+  map<fixed32, fixed32> field_map_fixed32_fixed32_22 = 22;
+  map<fixed32, fixed64> field_map_fixed32_fixed64_23 = 23;
+  map<fixed32, float> field_map_fixed32_float_24 = 24;
+  map<fixed32, int32> field_map_fixed32_int32_25 = 25;
+  map<fixed32, int64> field_map_fixed32_int64_26 = 26;
+  map<fixed32, Proto3Message> field_map_fixed32_message_27 = 27;
+  map<fixed32, sfixed32> field_map_fixed32_sfixed32_28 = 28;
+  map<fixed32, sfixed64> field_map_fixed32_sfixed64_29 = 29;
+  map<fixed32, sint32> field_map_fixed32_sint32_30 = 30;
+  map<fixed32, sint64> field_map_fixed32_sint64_31 = 31;
+  map<fixed32, string> field_map_fixed32_string_32 = 32;
+  map<fixed32, uint32> field_map_fixed32_uint32_33 = 33;
+  map<fixed32, uint64> field_map_fixed32_uint64_34 = 34;
+  map<fixed64, bool> field_map_fixed64_bool_35 = 35;
+  map<fixed64, bytes> field_map_fixed64_bytes_36 = 36;
+  map<fixed64, double> field_map_fixed64_double_37 = 37;
+  map<fixed64, Proto3Message.TestEnum> field_map_fixed64_enum_38 = 38;
+  map<fixed64, fixed32> field_map_fixed64_fixed32_39 = 39;
+  map<fixed64, fixed64> field_map_fixed64_fixed64_40 = 40;
+  map<fixed64, float> field_map_fixed64_float_41 = 41;
+  map<fixed64, int32> field_map_fixed64_int32_42 = 42;
+  map<fixed64, int64> field_map_fixed64_int64_43 = 43;
+  map<fixed64, Proto3Message> field_map_fixed64_message_44 = 44;
+  map<fixed64, sfixed32> field_map_fixed64_sfixed32_45 = 45;
+  map<fixed64, sfixed64> field_map_fixed64_sfixed64_46 = 46;
+  map<fixed64, sint32> field_map_fixed64_sint32_47 = 47;
+  map<fixed64, sint64> field_map_fixed64_sint64_48 = 48;
+  map<fixed64, string> field_map_fixed64_string_49 = 49;
+  map<fixed64, uint32> field_map_fixed64_uint32_50 = 50;
+  map<fixed64, uint64> field_map_fixed64_uint64_51 = 51;
+  map<int32, bool> field_map_int32_bool_52 = 52;
+  map<int32, bytes> field_map_int32_bytes_53 = 53;
+  map<int32, double> field_map_int32_double_54 = 54;
+  map<int32, Proto3Message.TestEnum> field_map_int32_enum_55 = 55;
+  map<int32, fixed32> field_map_int32_fixed32_56 = 56;
+  map<int32, fixed64> field_map_int32_fixed64_57 = 57;
+  map<int32, float> field_map_int32_float_58 = 58;
+  map<int32, int32> field_map_int32_int32_59 = 59;
+  map<int32, int64> field_map_int32_int64_60 = 60;
+  map<int32, Proto3Message> field_map_int32_message_61 = 61;
+  map<int32, sfixed32> field_map_int32_sfixed32_62 = 62;
+  map<int32, sfixed64> field_map_int32_sfixed64_63 = 63;
+  map<int32, sint32> field_map_int32_sint32_64 = 64;
+  map<int32, sint64> field_map_int32_sint64_65 = 65;
+  map<int32, string> field_map_int32_string_66 = 66;
+  map<int32, uint32> field_map_int32_uint32_67 = 67;
+  map<int32, uint64> field_map_int32_uint64_68 = 68;
+  map<int64, bool> field_map_int64_bool_69 = 69;
+  map<int64, bytes> field_map_int64_bytes_70 = 70;
+  map<int64, double> field_map_int64_double_71 = 71;
+  map<int64, Proto3Message.TestEnum> field_map_int64_enum_72 = 72;
+  map<int64, fixed32> field_map_int64_fixed32_73 = 73;
+  map<int64, fixed64> field_map_int64_fixed64_74 = 74;
+  map<int64, float> field_map_int64_float_75 = 75;
+  map<int64, int32> field_map_int64_int32_76 = 76;
+  map<int64, int64> field_map_int64_int64_77 = 77;
+  map<int64, Proto3Message> field_map_int64_message_78 = 78;
+  map<int64, sfixed32> field_map_int64_sfixed32_79 = 79;
+  map<int64, sfixed64> field_map_int64_sfixed64_80 = 80;
+  map<int64, sint32> field_map_int64_sint32_81 = 81;
+  map<int64, sint64> field_map_int64_sint64_82 = 82;
+  map<int64, string> field_map_int64_string_83 = 83;
+  map<int64, uint32> field_map_int64_uint32_84 = 84;
+  map<int64, uint64> field_map_int64_uint64_85 = 85;
+  map<sfixed32, bool> field_map_sfixed32_bool_86 = 86;
+  map<sfixed32, bytes> field_map_sfixed32_bytes_87 = 87;
+  map<sfixed32, double> field_map_sfixed32_double_88 = 88;
+  map<sfixed32, Proto3Message.TestEnum> field_map_sfixed32_enum_89 = 89;
+  map<sfixed32, fixed32> field_map_sfixed32_fixed32_90 = 90;
+  map<sfixed32, fixed64> field_map_sfixed32_fixed64_91 = 91;
+  map<sfixed32, float> field_map_sfixed32_float_92 = 92;
+  map<sfixed32, int32> field_map_sfixed32_int32_93 = 93;
+  map<sfixed32, int64> field_map_sfixed32_int64_94 = 94;
+  map<sfixed32, Proto3Message> field_map_sfixed32_message_95 = 95;
+  map<sfixed32, sfixed32> field_map_sfixed32_sfixed32_96 = 96;
+  map<sfixed32, sfixed64> field_map_sfixed32_sfixed64_97 = 97;
+  map<sfixed32, sint32> field_map_sfixed32_sint32_98 = 98;
+  map<sfixed32, sint64> field_map_sfixed32_sint64_99 = 99;
+  map<sfixed32, string> field_map_sfixed32_string_100 = 100;
+  map<sfixed32, uint32> field_map_sfixed32_uint32_101 = 101;
+  map<sfixed32, uint64> field_map_sfixed32_uint64_102 = 102;
+  map<sfixed64, bool> field_map_sfixed64_bool_103 = 103;
+  map<sfixed64, bytes> field_map_sfixed64_bytes_104 = 104;
+  map<sfixed64, double> field_map_sfixed64_double_105 = 105;
+  map<sfixed64, Proto3Message.TestEnum> field_map_sfixed64_enum_106 = 106;
+  map<sfixed64, fixed32> field_map_sfixed64_fixed32_107 = 107;
+  map<sfixed64, fixed64> field_map_sfixed64_fixed64_108 = 108;
+  map<sfixed64, float> field_map_sfixed64_float_109 = 109;
+  map<sfixed64, int32> field_map_sfixed64_int32_110 = 110;
+  map<sfixed64, int64> field_map_sfixed64_int64_111 = 111;
+  map<sfixed64, Proto3Message> field_map_sfixed64_message_112 = 112;
+  map<sfixed64, sfixed32> field_map_sfixed64_sfixed32_113 = 113;
+  map<sfixed64, sfixed64> field_map_sfixed64_sfixed64_114 = 114;
+  map<sfixed64, sint32> field_map_sfixed64_sint32_115 = 115;
+  map<sfixed64, sint64> field_map_sfixed64_sint64_116 = 116;
+  map<sfixed64, string> field_map_sfixed64_string_117 = 117;
+  map<sfixed64, uint32> field_map_sfixed64_uint32_118 = 118;
+  map<sfixed64, uint64> field_map_sfixed64_uint64_119 = 119;
+  map<sint32, bool> field_map_sint32_bool_120 = 120;
+  map<sint32, bytes> field_map_sint32_bytes_121 = 121;
+  map<sint32, double> field_map_sint32_double_122 = 122;
+  map<sint32, Proto3Message.TestEnum> field_map_sint32_enum_123 = 123;
+  map<sint32, fixed32> field_map_sint32_fixed32_124 = 124;
+  map<sint32, fixed64> field_map_sint32_fixed64_125 = 125;
+  map<sint32, float> field_map_sint32_float_126 = 126;
+  map<sint32, int32> field_map_sint32_int32_127 = 127;
+  map<sint32, int64> field_map_sint32_int64_128 = 128;
+  map<sint32, Proto3Message> field_map_sint32_message_129 = 129;
+  map<sint32, sfixed32> field_map_sint32_sfixed32_130 = 130;
+  map<sint32, sfixed64> field_map_sint32_sfixed64_131 = 131;
+  map<sint32, sint32> field_map_sint32_sint32_132 = 132;
+  map<sint32, sint64> field_map_sint32_sint64_133 = 133;
+  map<sint32, string> field_map_sint32_string_134 = 134;
+  map<sint32, uint32> field_map_sint32_uint32_135 = 135;
+  map<sint32, uint64> field_map_sint32_uint64_136 = 136;
+  map<sint64, bool> field_map_sint64_bool_137 = 137;
+  map<sint64, bytes> field_map_sint64_bytes_138 = 138;
+  map<sint64, double> field_map_sint64_double_139 = 139;
+  map<sint64, Proto3Message.TestEnum> field_map_sint64_enum_140 = 140;
+  map<sint64, fixed32> field_map_sint64_fixed32_141 = 141;
+  map<sint64, fixed64> field_map_sint64_fixed64_142 = 142;
+  map<sint64, float> field_map_sint64_float_143 = 143;
+  map<sint64, int32> field_map_sint64_int32_144 = 144;
+  map<sint64, int64> field_map_sint64_int64_145 = 145;
+  map<sint64, Proto3Message> field_map_sint64_message_146 = 146;
+  map<sint64, sfixed32> field_map_sint64_sfixed32_147 = 147;
+  map<sint64, sfixed64> field_map_sint64_sfixed64_148 = 148;
+  map<sint64, sint32> field_map_sint64_sint32_149 = 149;
+  map<sint64, sint64> field_map_sint64_sint64_150 = 150;
+  map<sint64, string> field_map_sint64_string_151 = 151;
+  map<sint64, uint32> field_map_sint64_uint32_152 = 152;
+  map<sint64, uint64> field_map_sint64_uint64_153 = 153;
+  map<string, bool> field_map_string_bool_154 = 154;
+  map<string, bytes> field_map_string_bytes_155 = 155;
+  map<string, double> field_map_string_double_156 = 156;
+  map<string, Proto3Message.TestEnum> field_map_string_enum_157 = 157;
+  map<string, fixed32> field_map_string_fixed32_158 = 158;
+  map<string, fixed64> field_map_string_fixed64_159 = 159;
+  map<string, float> field_map_string_float_160 = 160;
+  map<string, int32> field_map_string_int32_161 = 161;
+  map<string, int64> field_map_string_int64_162 = 162;
+  map<string, Proto3Message> field_map_string_message_163 = 163;
+  map<string, sfixed32> field_map_string_sfixed32_164 = 164;
+  map<string, sfixed64> field_map_string_sfixed64_165 = 165;
+  map<string, sint32> field_map_string_sint32_166 = 166;
+  map<string, sint64> field_map_string_sint64_167 = 167;
+  map<string, string> field_map_string_string_168 = 168;
+  map<string, uint32> field_map_string_uint32_169 = 169;
+  map<string, uint64> field_map_string_uint64_170 = 170;
+  map<uint32, bool> field_map_uint32_bool_171 = 171;
+  map<uint32, bytes> field_map_uint32_bytes_172 = 172;
+  map<uint32, double> field_map_uint32_double_173 = 173;
+  map<uint32, Proto3Message.TestEnum> field_map_uint32_enum_174 = 174;
+  map<uint32, fixed32> field_map_uint32_fixed32_175 = 175;
+  map<uint32, fixed64> field_map_uint32_fixed64_176 = 176;
+  map<uint32, float> field_map_uint32_float_177 = 177;
+  map<uint32, int32> field_map_uint32_int32_178 = 178;
+  map<uint32, int64> field_map_uint32_int64_179 = 179;
+  map<uint32, Proto3Message> field_map_uint32_message_180 = 180;
+  map<uint32, sfixed32> field_map_uint32_sfixed32_181 = 181;
+  map<uint32, sfixed64> field_map_uint32_sfixed64_182 = 182;
+  map<uint32, sint32> field_map_uint32_sint32_183 = 183;
+  map<uint32, sint64> field_map_uint32_sint64_184 = 184;
+  map<uint32, string> field_map_uint32_string_185 = 185;
+  map<uint32, uint32> field_map_uint32_uint32_186 = 186;
+  map<uint32, uint64> field_map_uint32_uint64_187 = 187;
+  map<uint64, bool> field_map_uint64_bool_188 = 188;
+  map<uint64, bytes> field_map_uint64_bytes_189 = 189;
+  map<uint64, double> field_map_uint64_double_190 = 190;
+  map<uint64, Proto3Message.TestEnum> field_map_uint64_enum_191 = 191;
+  map<uint64, fixed32> field_map_uint64_fixed32_192 = 192;
+  map<uint64, fixed64> field_map_uint64_fixed64_193 = 193;
+  map<uint64, float> field_map_uint64_float_194 = 194;
+  map<uint64, int32> field_map_uint64_int32_195 = 195;
+  map<uint64, int64> field_map_uint64_int64_196 = 196;
+  map<uint64, Proto3Message> field_map_uint64_message_197 = 197;
+  map<uint64, sfixed32> field_map_uint64_sfixed32_198 = 198;
+  map<uint64, sfixed64> field_map_uint64_sfixed64_199 = 199;
+  map<uint64, sint32> field_map_uint64_sint32_200 = 200;
+  map<uint64, sint64> field_map_uint64_sint64_201 = 201;
+  map<uint64, string> field_map_uint64_string_202 = 202;
+  map<uint64, uint32> field_map_uint64_uint32_203 = 203;
+  map<uint64, uint64> field_map_uint64_uint64_204 = 204;
+}
diff --git a/java/core/src/test/proto/com/google/protobuf/proto3_message_lite.proto b/java/core/src/test/proto/com/google/protobuf/proto3_message_lite.proto
new file mode 100755
index 0000000..ed364ec
--- /dev/null
+++ b/java/core/src/test/proto/com/google/protobuf/proto3_message_lite.proto
@@ -0,0 +1,319 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+option java_package = "com.google.protobuf.testing";
+option java_outer_classname = "Proto3TestingLite";
+package protobuf.experimental;
+
+message Proto3MessageLite {
+  enum TestEnum {
+    ZERO = 0;
+    ONE = 1;
+    TWO = 2;
+  }
+
+  double field_double_1 = 1;
+  float field_float_2 = 2;
+  int64 field_int64_3 = 3;
+  uint64 field_uint64_4 = 4;
+  int32 field_int32_5 = 5;
+  fixed64 field_fixed64_6 = 6;
+  fixed32 field_fixed32_7 = 7;
+  bool field_bool_8 = 8;
+  string field_string_9 = 9;
+  Proto3MessageLite field_message_10 = 10;
+  bytes field_bytes_11 = 11;
+  uint32 field_uint32_12 = 12;
+  TestEnum field_enum_13 = 13;
+  sfixed32 field_sfixed32_14 = 14;
+  sfixed64 field_sfixed64_15 = 15;
+  sint32 field_sint32_16 = 16;
+  sint64 field_sint64_17 = 17;
+  repeated double field_double_list_18 = 18 [packed = false];
+  repeated float field_float_list_19 = 19 [packed = false];
+  repeated int64 field_int64_list_20 = 20 [packed = false];
+  repeated uint64 field_uint64_list_21 = 21 [packed = false];
+  repeated int32 field_int32_list_22 = 22 [packed = false];
+  repeated fixed64 field_fixed64_list_23 = 23 [packed = false];
+  repeated fixed32 field_fixed32_list_24 = 24 [packed = false];
+  repeated bool field_bool_list_25 = 25 [packed = false];
+  repeated string field_string_list_26 = 26 [packed = false];
+  repeated Proto3MessageLite field_message_list_27 = 27 [packed = false];
+  repeated bytes field_bytes_list_28 = 28 [packed = false];
+  repeated uint32 field_uint32_list_29 = 29 [packed = false];
+  repeated TestEnum field_enum_list_30 = 30 [packed = false];
+  repeated sfixed32 field_sfixed32_list_31 = 31 [packed = false];
+  repeated sfixed64 field_sfixed64_list_32 = 32 [packed = false];
+  repeated sint32 field_sint32_list_33 = 33 [packed = false];
+  repeated sint64 field_sint64_list_34 = 34 [packed = false];
+  repeated double field_double_list_packed_35 = 35 [packed = true];
+  repeated float field_float_list_packed_36 = 36 [packed = true];
+  repeated int64 field_int64_list_packed_37 = 37 [packed = true];
+  repeated uint64 field_uint64_list_packed_38 = 38 [packed = true];
+  repeated int32 field_int32_list_packed_39 = 39 [packed = true];
+  repeated fixed64 field_fixed64_list_packed_40 = 40 [packed = true];
+  repeated fixed32 field_fixed32_list_packed_41 = 41 [packed = true];
+  repeated bool field_bool_list_packed_42 = 42 [packed = true];
+  repeated uint32 field_uint32_list_packed_43 = 43 [packed = true];
+  repeated TestEnum field_enum_list_packed_44 = 44 [packed = true];
+  repeated sfixed32 field_sfixed32_list_packed_45 = 45 [packed = true];
+  repeated sfixed64 field_sfixed64_list_packed_46 = 46 [packed = true];
+  repeated sint32 field_sint32_list_packed_47 = 47 [packed = true];
+  repeated sint64 field_sint64_list_packed_48 = 48 [packed = true];
+  oneof test_oneof {
+    double field_double_53 = 53;
+    float field_float_54 = 54;
+    int64 field_int64_55 = 55;
+    uint64 field_uint64_56 = 56;
+    int32 field_int32_57 = 57;
+    fixed64 field_fixed64_58 = 58;
+    fixed32 field_fixed32_59 = 59;
+    bool field_bool_60 = 60;
+    string field_string_61 = 61;
+    Proto3MessageLite field_message_62 = 62;
+    bytes field_bytes_63 = 63;
+    uint32 field_uint32_64 = 64;
+    sfixed32 field_sfixed32_65 = 65;
+    sfixed64 field_sfixed64_66 = 66;
+    sint32 field_sint32_67 = 67;
+    sint64 field_sint64_68 = 68;
+  }
+}
+
+message Proto3EmptyLite {}
+
+message Proto3MessageLiteWithMaps {
+  map<bool, bool> field_map_bool_bool_1 = 1;
+  map<bool, bytes> field_map_bool_bytes_2 = 2;
+  map<bool, double> field_map_bool_double_3 = 3;
+  map<bool, Proto3MessageLite.TestEnum> field_map_bool_enum_4 = 4;
+  map<bool, fixed32> field_map_bool_fixed32_5 = 5;
+  map<bool, fixed64> field_map_bool_fixed64_6 = 6;
+  map<bool, float> field_map_bool_float_7 = 7;
+  map<bool, int32> field_map_bool_int32_8 = 8;
+  map<bool, int64> field_map_bool_int64_9 = 9;
+  map<bool, Proto3MessageLite> field_map_bool_message_10 = 10;
+  map<bool, sfixed32> field_map_bool_sfixed32_11 = 11;
+  map<bool, sfixed64> field_map_bool_sfixed64_12 = 12;
+  map<bool, sint32> field_map_bool_sint32_13 = 13;
+  map<bool, sint64> field_map_bool_sint64_14 = 14;
+  map<bool, string> field_map_bool_string_15 = 15;
+  map<bool, uint32> field_map_bool_uint32_16 = 16;
+  map<bool, uint64> field_map_bool_uint64_17 = 17;
+  map<fixed32, bool> field_map_fixed32_bool_18 = 18;
+  map<fixed32, bytes> field_map_fixed32_bytes_19 = 19;
+  map<fixed32, double> field_map_fixed32_double_20 = 20;
+  map<fixed32, Proto3MessageLite.TestEnum> field_map_fixed32_enum_21 = 21;
+  map<fixed32, fixed32> field_map_fixed32_fixed32_22 = 22;
+  map<fixed32, fixed64> field_map_fixed32_fixed64_23 = 23;
+  map<fixed32, float> field_map_fixed32_float_24 = 24;
+  map<fixed32, int32> field_map_fixed32_int32_25 = 25;
+  map<fixed32, int64> field_map_fixed32_int64_26 = 26;
+  map<fixed32, Proto3MessageLite> field_map_fixed32_message_27 = 27;
+  map<fixed32, sfixed32> field_map_fixed32_sfixed32_28 = 28;
+  map<fixed32, sfixed64> field_map_fixed32_sfixed64_29 = 29;
+  map<fixed32, sint32> field_map_fixed32_sint32_30 = 30;
+  map<fixed32, sint64> field_map_fixed32_sint64_31 = 31;
+  map<fixed32, string> field_map_fixed32_string_32 = 32;
+  map<fixed32, uint32> field_map_fixed32_uint32_33 = 33;
+  map<fixed32, uint64> field_map_fixed32_uint64_34 = 34;
+  map<fixed64, bool> field_map_fixed64_bool_35 = 35;
+  map<fixed64, bytes> field_map_fixed64_bytes_36 = 36;
+  map<fixed64, double> field_map_fixed64_double_37 = 37;
+  map<fixed64, Proto3MessageLite.TestEnum> field_map_fixed64_enum_38 = 38;
+  map<fixed64, fixed32> field_map_fixed64_fixed32_39 = 39;
+  map<fixed64, fixed64> field_map_fixed64_fixed64_40 = 40;
+  map<fixed64, float> field_map_fixed64_float_41 = 41;
+  map<fixed64, int32> field_map_fixed64_int32_42 = 42;
+  map<fixed64, int64> field_map_fixed64_int64_43 = 43;
+  map<fixed64, Proto3MessageLite> field_map_fixed64_message_44 = 44;
+  map<fixed64, sfixed32> field_map_fixed64_sfixed32_45 = 45;
+  map<fixed64, sfixed64> field_map_fixed64_sfixed64_46 = 46;
+  map<fixed64, sint32> field_map_fixed64_sint32_47 = 47;
+  map<fixed64, sint64> field_map_fixed64_sint64_48 = 48;
+  map<fixed64, string> field_map_fixed64_string_49 = 49;
+  map<fixed64, uint32> field_map_fixed64_uint32_50 = 50;
+  map<fixed64, uint64> field_map_fixed64_uint64_51 = 51;
+  map<int32, bool> field_map_int32_bool_52 = 52;
+  map<int32, bytes> field_map_int32_bytes_53 = 53;
+  map<int32, double> field_map_int32_double_54 = 54;
+  map<int32, Proto3MessageLite.TestEnum> field_map_int32_enum_55 = 55;
+  map<int32, fixed32> field_map_int32_fixed32_56 = 56;
+  map<int32, fixed64> field_map_int32_fixed64_57 = 57;
+  map<int32, float> field_map_int32_float_58 = 58;
+  map<int32, int32> field_map_int32_int32_59 = 59;
+  map<int32, int64> field_map_int32_int64_60 = 60;
+  map<int32, Proto3MessageLite> field_map_int32_message_61 = 61;
+  map<int32, sfixed32> field_map_int32_sfixed32_62 = 62;
+  map<int32, sfixed64> field_map_int32_sfixed64_63 = 63;
+  map<int32, sint32> field_map_int32_sint32_64 = 64;
+  map<int32, sint64> field_map_int32_sint64_65 = 65;
+  map<int32, string> field_map_int32_string_66 = 66;
+  map<int32, uint32> field_map_int32_uint32_67 = 67;
+  map<int32, uint64> field_map_int32_uint64_68 = 68;
+  map<int64, bool> field_map_int64_bool_69 = 69;
+  map<int64, bytes> field_map_int64_bytes_70 = 70;
+  map<int64, double> field_map_int64_double_71 = 71;
+  map<int64, Proto3MessageLite.TestEnum> field_map_int64_enum_72 = 72;
+  map<int64, fixed32> field_map_int64_fixed32_73 = 73;
+  map<int64, fixed64> field_map_int64_fixed64_74 = 74;
+  map<int64, float> field_map_int64_float_75 = 75;
+  map<int64, int32> field_map_int64_int32_76 = 76;
+  map<int64, int64> field_map_int64_int64_77 = 77;
+  map<int64, Proto3MessageLite> field_map_int64_message_78 = 78;
+  map<int64, sfixed32> field_map_int64_sfixed32_79 = 79;
+  map<int64, sfixed64> field_map_int64_sfixed64_80 = 80;
+  map<int64, sint32> field_map_int64_sint32_81 = 81;
+  map<int64, sint64> field_map_int64_sint64_82 = 82;
+  map<int64, string> field_map_int64_string_83 = 83;
+  map<int64, uint32> field_map_int64_uint32_84 = 84;
+  map<int64, uint64> field_map_int64_uint64_85 = 85;
+  map<sfixed32, bool> field_map_sfixed32_bool_86 = 86;
+  map<sfixed32, bytes> field_map_sfixed32_bytes_87 = 87;
+  map<sfixed32, double> field_map_sfixed32_double_88 = 88;
+  map<sfixed32, Proto3MessageLite.TestEnum> field_map_sfixed32_enum_89 = 89;
+  map<sfixed32, fixed32> field_map_sfixed32_fixed32_90 = 90;
+  map<sfixed32, fixed64> field_map_sfixed32_fixed64_91 = 91;
+  map<sfixed32, float> field_map_sfixed32_float_92 = 92;
+  map<sfixed32, int32> field_map_sfixed32_int32_93 = 93;
+  map<sfixed32, int64> field_map_sfixed32_int64_94 = 94;
+  map<sfixed32, Proto3MessageLite> field_map_sfixed32_message_95 = 95;
+  map<sfixed32, sfixed32> field_map_sfixed32_sfixed32_96 = 96;
+  map<sfixed32, sfixed64> field_map_sfixed32_sfixed64_97 = 97;
+  map<sfixed32, sint32> field_map_sfixed32_sint32_98 = 98;
+  map<sfixed32, sint64> field_map_sfixed32_sint64_99 = 99;
+  map<sfixed32, string> field_map_sfixed32_string_100 = 100;
+  map<sfixed32, uint32> field_map_sfixed32_uint32_101 = 101;
+  map<sfixed32, uint64> field_map_sfixed32_uint64_102 = 102;
+  map<sfixed64, bool> field_map_sfixed64_bool_103 = 103;
+  map<sfixed64, bytes> field_map_sfixed64_bytes_104 = 104;
+  map<sfixed64, double> field_map_sfixed64_double_105 = 105;
+  map<sfixed64, Proto3MessageLite.TestEnum> field_map_sfixed64_enum_106 = 106;
+  map<sfixed64, fixed32> field_map_sfixed64_fixed32_107 = 107;
+  map<sfixed64, fixed64> field_map_sfixed64_fixed64_108 = 108;
+  map<sfixed64, float> field_map_sfixed64_float_109 = 109;
+  map<sfixed64, int32> field_map_sfixed64_int32_110 = 110;
+  map<sfixed64, int64> field_map_sfixed64_int64_111 = 111;
+  map<sfixed64, Proto3MessageLite> field_map_sfixed64_message_112 = 112;
+  map<sfixed64, sfixed32> field_map_sfixed64_sfixed32_113 = 113;
+  map<sfixed64, sfixed64> field_map_sfixed64_sfixed64_114 = 114;
+  map<sfixed64, sint32> field_map_sfixed64_sint32_115 = 115;
+  map<sfixed64, sint64> field_map_sfixed64_sint64_116 = 116;
+  map<sfixed64, string> field_map_sfixed64_string_117 = 117;
+  map<sfixed64, uint32> field_map_sfixed64_uint32_118 = 118;
+  map<sfixed64, uint64> field_map_sfixed64_uint64_119 = 119;
+  map<sint32, bool> field_map_sint32_bool_120 = 120;
+  map<sint32, bytes> field_map_sint32_bytes_121 = 121;
+  map<sint32, double> field_map_sint32_double_122 = 122;
+  map<sint32, Proto3MessageLite.TestEnum> field_map_sint32_enum_123 = 123;
+  map<sint32, fixed32> field_map_sint32_fixed32_124 = 124;
+  map<sint32, fixed64> field_map_sint32_fixed64_125 = 125;
+  map<sint32, float> field_map_sint32_float_126 = 126;
+  map<sint32, int32> field_map_sint32_int32_127 = 127;
+  map<sint32, int64> field_map_sint32_int64_128 = 128;
+  map<sint32, Proto3MessageLite> field_map_sint32_message_129 = 129;
+  map<sint32, sfixed32> field_map_sint32_sfixed32_130 = 130;
+  map<sint32, sfixed64> field_map_sint32_sfixed64_131 = 131;
+  map<sint32, sint32> field_map_sint32_sint32_132 = 132;
+  map<sint32, sint64> field_map_sint32_sint64_133 = 133;
+  map<sint32, string> field_map_sint32_string_134 = 134;
+  map<sint32, uint32> field_map_sint32_uint32_135 = 135;
+  map<sint32, uint64> field_map_sint32_uint64_136 = 136;
+  map<sint64, bool> field_map_sint64_bool_137 = 137;
+  map<sint64, bytes> field_map_sint64_bytes_138 = 138;
+  map<sint64, double> field_map_sint64_double_139 = 139;
+  map<sint64, Proto3MessageLite.TestEnum> field_map_sint64_enum_140 = 140;
+  map<sint64, fixed32> field_map_sint64_fixed32_141 = 141;
+  map<sint64, fixed64> field_map_sint64_fixed64_142 = 142;
+  map<sint64, float> field_map_sint64_float_143 = 143;
+  map<sint64, int32> field_map_sint64_int32_144 = 144;
+  map<sint64, int64> field_map_sint64_int64_145 = 145;
+  map<sint64, Proto3MessageLite> field_map_sint64_message_146 = 146;
+  map<sint64, sfixed32> field_map_sint64_sfixed32_147 = 147;
+  map<sint64, sfixed64> field_map_sint64_sfixed64_148 = 148;
+  map<sint64, sint32> field_map_sint64_sint32_149 = 149;
+  map<sint64, sint64> field_map_sint64_sint64_150 = 150;
+  map<sint64, string> field_map_sint64_string_151 = 151;
+  map<sint64, uint32> field_map_sint64_uint32_152 = 152;
+  map<sint64, uint64> field_map_sint64_uint64_153 = 153;
+  map<string, bool> field_map_string_bool_154 = 154;
+  map<string, bytes> field_map_string_bytes_155 = 155;
+  map<string, double> field_map_string_double_156 = 156;
+  map<string, Proto3MessageLite.TestEnum> field_map_string_enum_157 = 157;
+  map<string, fixed32> field_map_string_fixed32_158 = 158;
+  map<string, fixed64> field_map_string_fixed64_159 = 159;
+  map<string, float> field_map_string_float_160 = 160;
+  map<string, int32> field_map_string_int32_161 = 161;
+  map<string, int64> field_map_string_int64_162 = 162;
+  map<string, Proto3MessageLite> field_map_string_message_163 = 163;
+  map<string, sfixed32> field_map_string_sfixed32_164 = 164;
+  map<string, sfixed64> field_map_string_sfixed64_165 = 165;
+  map<string, sint32> field_map_string_sint32_166 = 166;
+  map<string, sint64> field_map_string_sint64_167 = 167;
+  map<string, string> field_map_string_string_168 = 168;
+  map<string, uint32> field_map_string_uint32_169 = 169;
+  map<string, uint64> field_map_string_uint64_170 = 170;
+  map<uint32, bool> field_map_uint32_bool_171 = 171;
+  map<uint32, bytes> field_map_uint32_bytes_172 = 172;
+  map<uint32, double> field_map_uint32_double_173 = 173;
+  map<uint32, Proto3MessageLite.TestEnum> field_map_uint32_enum_174 = 174;
+  map<uint32, fixed32> field_map_uint32_fixed32_175 = 175;
+  map<uint32, fixed64> field_map_uint32_fixed64_176 = 176;
+  map<uint32, float> field_map_uint32_float_177 = 177;
+  map<uint32, int32> field_map_uint32_int32_178 = 178;
+  map<uint32, int64> field_map_uint32_int64_179 = 179;
+  map<uint32, Proto3MessageLite> field_map_uint32_message_180 = 180;
+  map<uint32, sfixed32> field_map_uint32_sfixed32_181 = 181;
+  map<uint32, sfixed64> field_map_uint32_sfixed64_182 = 182;
+  map<uint32, sint32> field_map_uint32_sint32_183 = 183;
+  map<uint32, sint64> field_map_uint32_sint64_184 = 184;
+  map<uint32, string> field_map_uint32_string_185 = 185;
+  map<uint32, uint32> field_map_uint32_uint32_186 = 186;
+  map<uint32, uint64> field_map_uint32_uint64_187 = 187;
+  map<uint64, bool> field_map_uint64_bool_188 = 188;
+  map<uint64, bytes> field_map_uint64_bytes_189 = 189;
+  map<uint64, double> field_map_uint64_double_190 = 190;
+  map<uint64, Proto3MessageLite.TestEnum> field_map_uint64_enum_191 = 191;
+  map<uint64, fixed32> field_map_uint64_fixed32_192 = 192;
+  map<uint64, fixed64> field_map_uint64_fixed64_193 = 193;
+  map<uint64, float> field_map_uint64_float_194 = 194;
+  map<uint64, int32> field_map_uint64_int32_195 = 195;
+  map<uint64, int64> field_map_uint64_int64_196 = 196;
+  map<uint64, Proto3MessageLite> field_map_uint64_message_197 = 197;
+  map<uint64, sfixed32> field_map_uint64_sfixed32_198 = 198;
+  map<uint64, sfixed64> field_map_uint64_sfixed64_199 = 199;
+  map<uint64, sint32> field_map_uint64_sint32_200 = 200;
+  map<uint64, sint64> field_map_uint64_sint64_201 = 201;
+  map<uint64, string> field_map_uint64_string_202 = 202;
+  map<uint64, uint32> field_map_uint64_uint32_203 = 203;
+  map<uint64, uint64> field_map_uint64_uint64_204 = 204;
+}
diff --git a/java/core/src/test/proto/com/google/protobuf/wrappers_test.proto b/java/core/src/test/proto/com/google/protobuf/wrappers_test.proto
new file mode 100755
index 0000000..f151edf
--- /dev/null
+++ b/java/core/src/test/proto/com/google/protobuf/wrappers_test.proto
@@ -0,0 +1,49 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package wrappers_test;
+option java_package = "com.google.protobuf.wrapperstest";
+option java_outer_classname = "WrappersTestProto";
+import "google/protobuf/wrappers.proto";
+
+message TopLevelMessage {
+  int32 field1 = 1;
+  .google.protobuf.DoubleValue field_double = 2;
+  .google.protobuf.FloatValue field_float = 3;
+  .google.protobuf.Int64Value field_int64 = 4;
+  .google.protobuf.UInt64Value field_uint64 = 5;
+  .google.protobuf.Int32Value field_int32 = 6;
+  .google.protobuf.UInt32Value field_uint32 = 7;
+  .google.protobuf.BoolValue field_bool = 8;
+  .google.protobuf.StringValue field_string = 9;
+  .google.protobuf.BytesValue field_bytes = 10;
+}
diff --git a/java/core/src/test/java/com/google/protobuf/LiteTest.java b/java/lite/src/test/java/com/google/protobuf/LiteTest.java
old mode 100644
new mode 100755
similarity index 98%
rename from java/core/src/test/java/com/google/protobuf/LiteTest.java
rename to java/lite/src/test/java/com/google/protobuf/LiteTest.java
index 89213a7..960b203
--- a/java/core/src/test/java/com/google/protobuf/LiteTest.java
+++ b/java/lite/src/test/java/com/google/protobuf/LiteTest.java
@@ -50,6 +50,8 @@
 import com.google.protobuf.UnittestLite.TestNestedExtensionLite;
 import map_lite_test.MapTestProto.TestMap;
 import map_lite_test.MapTestProto.TestMap.MessageValue;
+import protobuf_unittest.NestedExtensionLite;
+import protobuf_unittest.NonNestedExtensionLite;
 import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.Bar;
 import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.BarPrime;
 import protobuf_unittest.lite_equals_and_hash.LiteEqualsAndHash.Foo;
@@ -2338,6 +2340,26 @@
     }
   }
 
+  public void testExtensionRenamesKeywords() {
+    assertTrue(NonNestedExtensionLite.package_ instanceof GeneratedMessageLite.GeneratedExtension);
+    assertTrue(
+        NestedExtensionLite.MyNestedExtensionLite.private_
+            instanceof GeneratedMessageLite.GeneratedExtension);
+
+    NonNestedExtensionLite.MessageLiteToBeExtended msg =
+        NonNestedExtensionLite.MessageLiteToBeExtended.newBuilder()
+            .setExtension(NonNestedExtensionLite.package_, true)
+            .build();
+    assertTrue(msg.getExtension(NonNestedExtensionLite.package_));
+
+    msg =
+        NonNestedExtensionLite.MessageLiteToBeExtended.newBuilder()
+            .setExtension(NestedExtensionLite.MyNestedExtensionLite.private_, 2.4)
+            .build();
+    assertEquals(
+        2.4, msg.getExtension(NestedExtensionLite.MyNestedExtensionLite.private_), 0.001);
+  }
+
   private static final class OneTimeIterableList<T> extends ArrayList<T> {
     private boolean wasIterated = false;
 
diff --git a/java/lite/src/test/java/com/google/protobuf/Proto2MessageLiteInfoFactory.java b/java/lite/src/test/java/com/google/protobuf/Proto2MessageLiteInfoFactory.java
new file mode 100755
index 0000000..4a1d89b
--- /dev/null
+++ b/java/lite/src/test/java/com/google/protobuf/Proto2MessageLiteInfoFactory.java
@@ -0,0 +1,1327 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+package com.google.protobuf;
+
+import static com.google.protobuf.FieldInfo.forField;
+import static com.google.protobuf.FieldInfo.forFieldWithEnumVerifier;
+import static com.google.protobuf.FieldInfo.forMapField;
+import static com.google.protobuf.FieldInfo.forOneofMemberField;
+import static com.google.protobuf.FieldInfo.forProto2OptionalField;
+import static com.google.protobuf.FieldInfo.forProto2RequiredField;
+import static com.google.protobuf.FieldInfo.forRepeatedMessageField;
+
+import com.google.protobuf.testing.Proto2TestingLite;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2EmptyLite;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite.FieldGroup49;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite.FieldGroup69;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite.FieldGroupList51;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite.FieldRequiredGroup88;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite.RequiredNestedMessage;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLite.TestEnum;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLiteWithExtensions;
+import com.google.protobuf.testing.Proto2TestingLite.Proto2MessageLiteWithMaps;
+import java.lang.reflect.Field;
+
+/** A factory that generates a hard-coded info for {@link Proto2MessageLite}. */
+public final class Proto2MessageLiteInfoFactory implements MessageInfoFactory {
+  private static final Proto2MessageLiteInfoFactory instanceForRawMessageInfo =
+      new Proto2MessageLiteInfoFactory(true);
+  private static final Proto2MessageLiteInfoFactory instanceForStructuralMessageInfo =
+      new Proto2MessageLiteInfoFactory(false);
+
+  public static Proto2MessageLiteInfoFactory getInstanceForRawMessageInfo() {
+    return instanceForRawMessageInfo;
+  }
+
+  public static Proto2MessageLiteInfoFactory getInstanceForStructuralMessageInfo() {
+    return instanceForStructuralMessageInfo;
+  }
+
+  private final boolean produceRawMessageInfo;
+
+  private Proto2MessageLiteInfoFactory(boolean produceRawMessageInfo) {
+    this.produceRawMessageInfo = produceRawMessageInfo;
+  }
+
+  @Override
+  public boolean isSupported(Class<?> clazz) {
+    return true;
+  }
+
+  @Override
+  public MessageInfo messageInfoFor(Class<?> clazz) {
+    return produceRawMessageInfo ? rawMessageInfoFor(clazz) : structuralMessageInfoFor(clazz);
+  }
+
+  private MessageInfo rawMessageInfoFor(Class<?> clazz) {
+    if (Proto2MessageLite.class.isAssignableFrom(clazz)) {
+      return newRawMessageInfoForProto2MessageLite();
+    } else {
+      throw new IllegalArgumentException("Unsupported class: " + clazz.getName());
+    }
+  }
+
+  private MessageInfo newRawMessageInfoForProto2MessageLite() {
+    java.lang.Object[] objects =
+        new java.lang.Object[] {
+          "testOneof_",
+          "testOneofCase_",
+          "bitField0_",
+          "bitField1_",
+          "fieldDouble1_",
+          "fieldFloat2_",
+          "fieldInt643_",
+          "fieldUint644_",
+          "fieldInt325_",
+          "fieldFixed646_",
+          "fieldFixed327_",
+          "fieldBool8_",
+          "fieldString9_",
+          "fieldMessage10_",
+          "fieldBytes11_",
+          "fieldUint3212_",
+          "fieldEnum13_",
+          Proto2MessageLite.TestEnum.internalGetVerifier(),
+          "fieldSfixed3214_",
+          "fieldSfixed6415_",
+          "fieldSint3216_",
+          "fieldSint6417_",
+          "fieldDoubleList18_",
+          "fieldFloatList19_",
+          "fieldInt64List20_",
+          "fieldUint64List21_",
+          "fieldInt32List22_",
+          "fieldFixed64List23_",
+          "fieldFixed32List24_",
+          "fieldBoolList25_",
+          "fieldStringList26_",
+          "fieldMessageList27_",
+          Proto2MessageLite.class,
+          "fieldBytesList28_",
+          "fieldUint32List29_",
+          "fieldEnumList30_",
+          Proto2MessageLite.TestEnum.internalGetVerifier(),
+          "fieldSfixed32List31_",
+          "fieldSfixed64List32_",
+          "fieldSint32List33_",
+          "fieldSint64List34_",
+          "fieldDoubleListPacked35_",
+          "fieldFloatListPacked36_",
+          "fieldInt64ListPacked37_",
+          "fieldUint64ListPacked38_",
+          "fieldInt32ListPacked39_",
+          "fieldFixed64ListPacked40_",
+          "fieldFixed32ListPacked41_",
+          "fieldBoolListPacked42_",
+          "fieldUint32ListPacked43_",
+          "fieldEnumListPacked44_",
+          Proto2MessageLite.TestEnum.internalGetVerifier(),
+          "fieldSfixed32ListPacked45_",
+          "fieldSfixed64ListPacked46_",
+          "fieldSint32ListPacked47_",
+          "fieldSint64ListPacked48_",
+          "fieldGroup49_",
+          "fieldGroupList51_",
+          Proto2MessageLite.FieldGroupList51.class,
+          Proto2MessageLite.class,
+          Proto2MessageLite.FieldGroup69.class,
+          "fieldRequiredDouble71_",
+          "fieldRequiredFloat72_",
+          "fieldRequiredInt6473_",
+          "fieldRequiredUint6474_",
+          "fieldRequiredInt3275_",
+          "fieldRequiredFixed6476_",
+          "fieldRequiredFixed3277_",
+          "fieldRequiredBool78_",
+          "fieldRequiredString79_",
+          "fieldRequiredMessage80_",
+          "fieldRequiredBytes81_",
+          "fieldRequiredUint3282_",
+          "fieldRequiredEnum83_",
+          Proto2MessageLite.TestEnum.internalGetVerifier(),
+          "fieldRequiredSfixed3284_",
+          "fieldRequiredSfixed6485_",
+          "fieldRequiredSint3286_",
+          "fieldRequiredSint6487_",
+          "fieldRequiredGroup88_",
+        };
+    // To update this after a proto change, run protoc on proto2_message_lite.proto and copy over
+    // the content of the generated buildMessageInfo() method here.
+    java.lang.String info =
+        "\u0001U\u0001\u0002\u0001XU\u0000 \u0015\u0001\u0000\u0000\u0002\u0001\u0001\u0003"
+            + "\u0002\u0002\u0004\u0003\u0003\u0005\u0004\u0004\u0006\u0005\u0005\u0007\u0006\u0006"
+            + "\b\u0007\u0007\t\b\b\n\u0409\t\u000b\n\n\f\u000b\u000b\r\f\f\u000e\r\r\u000f\u000e"
+            + "\u000e\u0010\u000f\u000f\u0011\u0010\u0010\u0012\u0012\u0013\u0013\u0014\u0014\u0015"
+            + "\u0015\u0016\u0016\u0017\u0017\u0018\u0018\u0019\u0019\u001a\u001a\u001b\u041b\u001c"
+            + "\u001c\u001d\u001d\u001e\u001e\u001f\u001f  !!\"\"##$$%%&&\'\'(())**++,,--..//00"
+            + "1\u0011\u00113153\u000064\u000075\u000086\u000097\u0000:8\u0000;9\u0000<:\u0000="
+            + ";\u0000>\u043c\u0000?=\u0000@>\u0000A@\u0000BA\u0000CB\u0000DC\u0000ED\u0000G\u0500"
+            + "#H\u0501$I\u0502%J\u0503&K\u0504\'L\u0505(M\u0506)N\u0507*O\u0508+P\u0509,Q\u050a"
+            + "-R\u050b.S\u050c/T\u050d0U\u050e1V\u050f2W\u05103X\u05114";
+    return new RawMessageInfo(Proto2MessageLite.getDefaultInstance(), info, objects);
+  }
+
+  private MessageInfo structuralMessageInfoFor(Class<?> clazz) {
+    if (Proto2MessageLite.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto2MessageLite();
+    } else if (FieldGroup49.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForFieldGroup49();
+    } else if (FieldGroupList51.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForFieldGroupList51();
+    } else if (FieldGroup69.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForFieldGroup69();
+    } else if (FieldRequiredGroup88.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForFieldRequiredGroup88();
+    } else if (RequiredNestedMessage.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForRequiredNestedMessage();
+    } else if (Proto2EmptyLite.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto2EmptyLite();
+    } else if (Proto2MessageLiteWithExtensions.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto2MessageLiteWithExtensions();
+    } else if (Proto2TestingLite.FieldGroup49.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForExtensionFieldGroup49();
+    } else if (Proto2TestingLite.FieldGroupList51.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForExtensionFieldGroupList51();
+    } else if (Proto2TestingLite.Proto2MessageLiteWithMaps.class.isAssignableFrom(clazz)) {
+      return newMessageInfoForProto2MessageLiteWithMaps();
+    } else {
+      throw new IllegalArgumentException("Unsupported class: " + clazz.getName());
+    }
+  }
+
+  /**
+   * Creates a new hard-coded info for {@link Proto2MessageLite}. Each time this is called, we
+   * manually go through the entire process of what a message would do if it self-registered its own
+   * info, including looking up each field by name. This is done for benchmarking purposes, so that
+   * we get a more accurate representation of the time it takes to perform this process.
+   */
+  private static StructuralMessageInfo newMessageInfoForProto2MessageLite() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(48);
+    builder.withCheckInitialized(
+        new int[] {
+          10, 27, 62, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+        });
+    lookupFieldsByName(builder);
+    return builder.build();
+  }
+
+  private static void lookupFieldsByName(StructuralMessageInfo.Builder builder) {
+    Field bitField0 = field(Proto2MessageLite.class, "bitField0_");
+
+    builder.withDefaultInstance(Proto2MessageLite.getDefaultInstance());
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldDouble1_"),
+            1,
+            FieldType.DOUBLE,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldFloat2_"),
+            2,
+            FieldType.FLOAT,
+            bitField0,
+            0x00000002,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldInt643_"),
+            3,
+            FieldType.INT64,
+            bitField0,
+            0x00000004,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldUint644_"),
+            4,
+            FieldType.UINT64,
+            bitField0,
+            0x00000008,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldInt325_"),
+            5,
+            FieldType.INT32,
+            bitField0,
+            0x00000010,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldFixed646_"),
+            6,
+            FieldType.FIXED64,
+            bitField0,
+            0x00000020,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldFixed327_"),
+            7,
+            FieldType.FIXED32,
+            bitField0,
+            0x00000040,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldBool8_"),
+            8,
+            FieldType.BOOL,
+            bitField0,
+            0x00000080,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldString9_"),
+            9,
+            FieldType.STRING,
+            bitField0,
+            0x00000100,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldMessage10_"),
+            10,
+            FieldType.MESSAGE,
+            bitField0,
+            0x00000200,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldBytes11_"),
+            11,
+            FieldType.BYTES,
+            bitField0,
+            0x00000400,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldUint3212_"),
+            12,
+            FieldType.UINT32,
+            bitField0,
+            0x00000800,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldEnum13_"),
+            13,
+            FieldType.ENUM,
+            bitField0,
+            0x00001000,
+            false,
+            TestEnum.internalGetVerifier()));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldSfixed3214_"),
+            14,
+            FieldType.SFIXED32,
+            bitField0,
+            0x00002000,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldSfixed6415_"),
+            15,
+            FieldType.SFIXED64,
+            bitField0,
+            0x00004000,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldSint3216_"),
+            16,
+            FieldType.SINT32,
+            bitField0,
+            0x00008000,
+            false,
+            null));
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldSint6417_"),
+            17,
+            FieldType.SINT64,
+            bitField0,
+            0x00010000,
+            false,
+            null));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldDoubleList18_"),
+            18,
+            FieldType.DOUBLE_LIST,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldFloatList19_"), 19, FieldType.FLOAT_LIST, false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldInt64List20_"), 20, FieldType.INT64_LIST, false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldUint64List21_"),
+            21,
+            FieldType.UINT64_LIST,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldInt32List22_"), 22, FieldType.INT32_LIST, false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldFixed64List23_"),
+            23,
+            FieldType.FIXED64_LIST,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldFixed32List24_"),
+            24,
+            FieldType.FIXED32_LIST,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldBoolList25_"), 25, FieldType.BOOL_LIST, false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldStringList26_"),
+            26,
+            FieldType.STRING_LIST,
+            false));
+    builder.withField(
+        forRepeatedMessageField(
+            field(Proto2MessageLite.class, "fieldMessageList27_"),
+            27,
+            FieldType.MESSAGE_LIST,
+            Proto2MessageLite.class));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldBytesList28_"), 28, FieldType.BYTES_LIST, false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldUint32List29_"),
+            29,
+            FieldType.UINT32_LIST,
+            false));
+    builder.withField(
+        forFieldWithEnumVerifier(
+            field(Proto2MessageLite.class, "fieldEnumList30_"),
+            30,
+            FieldType.ENUM_LIST,
+            TestEnum.internalGetVerifier()));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldSfixed32List31_"),
+            31,
+            FieldType.SFIXED32_LIST,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldSfixed64List32_"),
+            32,
+            FieldType.SFIXED64_LIST,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldSint32List33_"),
+            33,
+            FieldType.SINT32_LIST,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldSint64List34_"),
+            34,
+            FieldType.SINT64_LIST,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldDoubleListPacked35_"),
+            35,
+            FieldType.DOUBLE_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldFloatListPacked36_"),
+            36,
+            FieldType.FLOAT_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldInt64ListPacked37_"),
+            37,
+            FieldType.INT64_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldUint64ListPacked38_"),
+            38,
+            FieldType.UINT64_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldInt32ListPacked39_"),
+            39,
+            FieldType.INT32_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldFixed64ListPacked40_"),
+            40,
+            FieldType.FIXED64_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldFixed32ListPacked41_"),
+            41,
+            FieldType.FIXED32_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldBoolListPacked42_"),
+            42,
+            FieldType.BOOL_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldUint32ListPacked43_"),
+            43,
+            FieldType.UINT32_LIST_PACKED,
+            false));
+    builder.withField(
+        forFieldWithEnumVerifier(
+            field(Proto2MessageLite.class, "fieldEnumListPacked44_"),
+            44,
+            FieldType.ENUM_LIST_PACKED,
+            TestEnum.internalGetVerifier()));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldSfixed32ListPacked45_"),
+            45,
+            FieldType.SFIXED32_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldSfixed64ListPacked46_"),
+            46,
+            FieldType.SFIXED64_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldSint32ListPacked47_"),
+            47,
+            FieldType.SINT32_LIST_PACKED,
+            false));
+    builder.withField(
+        forField(
+            field(Proto2MessageLite.class, "fieldSint64ListPacked48_"),
+            48,
+            FieldType.SINT64_LIST_PACKED,
+            false));
+
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2MessageLite.class, "fieldGroup49_"),
+            49,
+            FieldType.GROUP,
+            bitField0,
+            0x00020000,
+            false,
+            null));
+    builder.withField(
+        forRepeatedMessageField(
+            field(Proto2MessageLite.class, "fieldGroupList51_"),
+            51,
+            FieldType.GROUP_LIST,
+            Proto2MessageLite.FieldGroupList51.class));
+
+    OneofInfo oneof =
+        new OneofInfo(
+            0,
+            field(Proto2MessageLite.class, "testOneofCase_"),
+            field(Proto2MessageLite.class, "testOneof_"));
+    builder.withField(forOneofMemberField(53, FieldType.DOUBLE, oneof, Double.class, false, null));
+    builder.withField(forOneofMemberField(54, FieldType.FLOAT, oneof, Float.class, false, null));
+    builder.withField(forOneofMemberField(55, FieldType.INT64, oneof, Long.class, false, null));
+    builder.withField(forOneofMemberField(56, FieldType.UINT64, oneof, Long.class, false, null));
+    builder.withField(forOneofMemberField(57, FieldType.INT32, oneof, Integer.class, false, null));
+    builder.withField(forOneofMemberField(58, FieldType.FIXED64, oneof, Long.class, false, null));
+    builder.withField(
+        forOneofMemberField(59, FieldType.FIXED32, oneof, Integer.class, false, null));
+    builder.withField(forOneofMemberField(60, FieldType.BOOL, oneof, Boolean.class, false, null));
+    builder.withField(forOneofMemberField(61, FieldType.STRING, oneof, String.class, false, null));
+    builder.withField(
+        forOneofMemberField(62, FieldType.MESSAGE, oneof, Proto2MessageLite.class, false, null));
+    builder.withField(
+        forOneofMemberField(63, FieldType.BYTES, oneof, ByteString.class, false, null));
+    builder.withField(forOneofMemberField(64, FieldType.UINT32, oneof, Integer.class, false, null));
+    builder.withField(
+        forOneofMemberField(65, FieldType.SFIXED32, oneof, Integer.class, false, null));
+    builder.withField(forOneofMemberField(66, FieldType.SFIXED64, oneof, Long.class, false, null));
+    builder.withField(forOneofMemberField(67, FieldType.SINT32, oneof, Integer.class, false, null));
+    builder.withField(forOneofMemberField(68, FieldType.SINT64, oneof, Long.class, false, null));
+    builder.withField(
+        forOneofMemberField(
+            69, FieldType.GROUP, oneof, Proto2MessageLite.FieldGroup69.class, false, null));
+
+    Field bitField1 = field(Proto2MessageLite.class, "bitField1_");
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredDouble71_"),
+            71,
+            FieldType.DOUBLE,
+            bitField1,
+            0x00000008,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredFloat72_"),
+            72,
+            FieldType.FLOAT,
+            bitField1,
+            0x00000010,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredInt6473_"),
+            73,
+            FieldType.INT64,
+            bitField1,
+            0x00000020,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredUint6474_"),
+            74,
+            FieldType.UINT64,
+            bitField1,
+            0x00000040,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredInt3275_"),
+            75,
+            FieldType.INT32,
+            bitField1,
+            0x00000080,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredFixed6476_"),
+            76,
+            FieldType.FIXED64,
+            bitField1,
+            0x00000100,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredFixed3277_"),
+            77,
+            FieldType.FIXED32,
+            bitField1,
+            0x00000200,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredBool78_"),
+            78,
+            FieldType.BOOL,
+            bitField1,
+            0x00000400,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredString79_"),
+            79,
+            FieldType.STRING,
+            bitField1,
+            0x00000800,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredMessage80_"),
+            80,
+            FieldType.MESSAGE,
+            bitField1,
+            0x00001000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredBytes81_"),
+            81,
+            FieldType.BYTES,
+            bitField1,
+            0x00002000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredUint3282_"),
+            82,
+            FieldType.UINT32,
+            bitField1,
+            0x00004000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredEnum83_"),
+            83,
+            FieldType.ENUM,
+            bitField1,
+            0x00008000,
+            false,
+            TestEnum.internalGetVerifier()));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredSfixed3284_"),
+            84,
+            FieldType.SFIXED32,
+            bitField1,
+            0x00010000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredSfixed6485_"),
+            85,
+            FieldType.SFIXED64,
+            bitField1,
+            0x00020000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredSint3286_"),
+            86,
+            FieldType.SINT32,
+            bitField1,
+            0x00040000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredSint6487_"),
+            87,
+            FieldType.SINT64,
+            bitField1,
+            0x00080000,
+            false,
+            null));
+    builder.withField(
+        forProto2RequiredField(
+            field(Proto2MessageLite.class, "fieldRequiredGroup88_"),
+            88,
+            FieldType.GROUP,
+            bitField1,
+            0x00100000,
+            false,
+            null));
+  }
+
+  private static StructuralMessageInfo newMessageInfoForFieldGroup49() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(FieldGroup49.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(FieldGroup49.class, "fieldInt3250_"),
+            50,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForFieldGroupList51() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(FieldGroup49.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(FieldGroupList51.class, "fieldInt3252_"),
+            52,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForFieldGroup69() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(FieldGroup69.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(FieldGroup69.class, "fieldInt3270_"),
+            70,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForRequiredNestedMessage() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(RequiredNestedMessage.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(RequiredNestedMessage.class, "value_"),
+            1,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForFieldRequiredGroup88() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(FieldRequiredGroup88.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(FieldRequiredGroup88.class, "fieldInt3289_"),
+            89,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForProto2EmptyLite() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForProto2MessageLiteWithExtensions() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(0);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForExtensionFieldGroup49() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(Proto2TestingLite.FieldGroup49.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2TestingLite.FieldGroup49.class, "fieldInt3250_"),
+            50,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+  private static StructuralMessageInfo newMessageInfoForExtensionFieldGroupList51() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder(1);
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    Field bitField0 = field(Proto2TestingLite.FieldGroup49.class, "bitField0_");
+    builder.withField(
+        forProto2OptionalField(
+            field(Proto2TestingLite.FieldGroupList51.class, "fieldInt3252_"),
+            52,
+            FieldType.INT32,
+            bitField0,
+            0x00000001,
+            false,
+            null));
+    return builder.build();
+  }
+
+
+  private static StructuralMessageInfo newMessageInfoForProto2MessageLiteWithMaps() {
+    StructuralMessageInfo.Builder builder = StructuralMessageInfo.newBuilder();
+    builder.withCheckInitialized(
+        new int[] {
+          10, 27, 44, 61, 78, 95, 112, 129, 146, 163, 180, 197,
+        });
+    builder.withSyntax(ProtoSyntax.PROTO2);
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_bool_1", 1));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_bytes_2", 2));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_double_3", 3));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_enum_4", 4));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_fixed32_5", 5));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_fixed64_6", 6));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_float_7", 7));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_int32_8", 8));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_int64_9", 9));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_message_10", 10));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_sfixed32_11", 11));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_sfixed64_12", 12));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_sint32_13", 13));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_sint64_14", 14));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_string_15", 15));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_uint32_16", 16));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_bool_uint64_17", 17));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_bool_18", 18));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_bytes_19", 19));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_double_20", 20));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_enum_21", 21));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_fixed32_22", 22));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_fixed64_23", 23));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_float_24", 24));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_int32_25", 25));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_int64_26", 26));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_message_27", 27));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_sfixed32_28", 28));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_sfixed64_29", 29));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_sint32_30", 30));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_sint64_31", 31));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_string_32", 32));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_uint32_33", 33));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed32_uint64_34", 34));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_bool_35", 35));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_bytes_36", 36));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_double_37", 37));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_enum_38", 38));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_fixed32_39", 39));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_fixed64_40", 40));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_float_41", 41));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_int32_42", 42));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_int64_43", 43));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_message_44", 44));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_sfixed32_45", 45));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_sfixed64_46", 46));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_sint32_47", 47));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_sint64_48", 48));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_string_49", 49));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_uint32_50", 50));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_fixed64_uint64_51", 51));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_bool_52", 52));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_bytes_53", 53));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_double_54", 54));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_enum_55", 55));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_fixed32_56", 56));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_fixed64_57", 57));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_float_58", 58));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_int32_59", 59));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_int64_60", 60));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_message_61", 61));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_sfixed32_62", 62));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_sfixed64_63", 63));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_sint32_64", 64));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_sint64_65", 65));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_string_66", 66));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_uint32_67", 67));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int32_uint64_68", 68));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_bool_69", 69));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_bytes_70", 70));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_double_71", 71));
+    builder.withField(mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_enum_72", 72));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_fixed32_73", 73));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_fixed64_74", 74));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_float_75", 75));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_int32_76", 76));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_int64_77", 77));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_message_78", 78));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_sfixed32_79", 79));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_sfixed64_80", 80));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_sint32_81", 81));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_sint64_82", 82));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_string_83", 83));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_uint32_84", 84));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_int64_uint64_85", 85));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_bool_86", 86));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_bytes_87", 87));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_double_88", 88));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_enum_89", 89));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_fixed32_90", 90));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_fixed64_91", 91));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_float_92", 92));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_int32_93", 93));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_int64_94", 94));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_message_95", 95));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_sfixed32_96", 96));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_sfixed64_97", 97));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_sint32_98", 98));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_sint64_99", 99));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_string_100", 100));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_uint32_101", 101));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed32_uint64_102", 102));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_bool_103", 103));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_bytes_104", 104));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_double_105", 105));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_enum_106", 106));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_fixed32_107", 107));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_fixed64_108", 108));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_float_109", 109));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_int32_110", 110));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_int64_111", 111));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_message_112", 112));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_sfixed32_113", 113));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_sfixed64_114", 114));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_sint32_115", 115));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_sint64_116", 116));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_string_117", 117));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_uint32_118", 118));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sfixed64_uint64_119", 119));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_bool_120", 120));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_bytes_121", 121));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_double_122", 122));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_enum_123", 123));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_fixed32_124", 124));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_fixed64_125", 125));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_float_126", 126));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_int32_127", 127));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_int64_128", 128));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_message_129", 129));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_sfixed32_130", 130));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_sfixed64_131", 131));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_sint32_132", 132));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_sint64_133", 133));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_string_134", 134));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_uint32_135", 135));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint32_uint64_136", 136));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_bool_137", 137));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_bytes_138", 138));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_double_139", 139));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_enum_140", 140));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_fixed32_141", 141));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_fixed64_142", 142));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_float_143", 143));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_int32_144", 144));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_int64_145", 145));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_message_146", 146));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_sfixed32_147", 147));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_sfixed64_148", 148));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_sint32_149", 149));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_sint64_150", 150));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_string_151", 151));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_uint32_152", 152));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_sint64_uint64_153", 153));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_bool_154", 154));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_bytes_155", 155));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_double_156", 156));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_enum_157", 157));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_fixed32_158", 158));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_fixed64_159", 159));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_float_160", 160));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_int32_161", 161));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_int64_162", 162));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_message_163", 163));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_sfixed32_164", 164));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_sfixed64_165", 165));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_sint32_166", 166));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_sint64_167", 167));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_string_168", 168));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_uint32_169", 169));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_string_uint64_170", 170));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_bool_171", 171));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_bytes_172", 172));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_double_173", 173));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_enum_174", 174));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_fixed32_175", 175));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_fixed64_176", 176));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_float_177", 177));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_int32_178", 178));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_int64_179", 179));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_message_180", 180));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_sfixed32_181", 181));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_sfixed64_182", 182));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_sint32_183", 183));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_sint64_184", 184));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_string_185", 185));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_uint32_186", 186));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint32_uint64_187", 187));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_bool_188", 188));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_bytes_189", 189));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_double_190", 190));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_enum_191", 191));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_fixed32_192", 192));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_fixed64_193", 193));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_float_194", 194));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_int32_195", 195));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_int64_196", 196));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_message_197", 197));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_sfixed32_198", 198));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_sfixed64_199", 199));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_sint32_200", 200));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_sint64_201", 201));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_string_202", 202));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_uint32_203", 203));
+    builder.withField(
+        mapFieldInfo(Proto2MessageLiteWithMaps.class, "field_map_uint64_uint64_204", 204));
+
+    return builder.build();
+  }
+
+  private static Field field(Class<?> clazz, String name) {
+    try {
+      return clazz.getDeclaredField(name);
+    } catch (NoSuchFieldException | SecurityException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  private static FieldInfo mapFieldInfo(Class<?> clazz, String fieldName, int fieldNumber) {
+    try {
+      return forMapField(
+          field(clazz, SchemaUtil.toCamelCase(fieldName, false) + "_"),
+          fieldNumber,
+          SchemaUtil.getMapDefaultEntry(clazz, fieldName),
+          fieldName.contains("_enum_") ? TestEnum.internalGetVerifier() : null);
+    } catch (Throwable t) {
+      throw new RuntimeException(t);
+    }
+  }
+}
diff --git a/java/util/src/test/java/com/google/protobuf/util/JsonFormatTest.java b/java/util/src/test/java/com/google/protobuf/util/JsonFormatTest.java
index b7b437c..75e2ae8 100644
--- a/java/util/src/test/java/com/google/protobuf/util/JsonFormatTest.java
+++ b/java/util/src/test/java/com/google/protobuf/util/JsonFormatTest.java
@@ -464,6 +464,20 @@
     assertEquals(NullValue.NULL_VALUE, message.getOneofNullValue());
   }
 
+  public void testNullMessageInDuplicateOneof() throws Exception {
+    // Succeeds if null is first.
+    TestOneof.Builder successBuilder = TestOneof.newBuilder();
+    mergeFromJson("{\"oneofNestedMessage\": null, \"oneofInt32\": 1}", successBuilder);
+
+    // Fails if null is last.
+    try {
+      TestOneof.Builder builder = TestOneof.newBuilder();
+      mergeFromJson("{\"oneofInt32\": 1, \"oneofNestedMessage\": null}", builder);
+      fail();
+    } catch (InvalidProtocolBufferException expected) {
+    }
+  }
+
   public void testParserRejectDuplicatedFields() throws Exception {
     // TODO(xiaofeng): The parser we are currently using (GSON) will accept and keep the last
     // one if multiple entries have the same name. This is not the desired behavior but it can
diff --git a/js/message.js b/js/message.js
index 5ca0a73..aa6e157 100644
--- a/js/message.js
+++ b/js/message.js
@@ -172,7 +172,8 @@
  *     dead code eliminate fields used in protocol buffers that are never used
  *     in an application.
  */
-goog.define('jspb.Message.GENERATE_TO_OBJECT', true);
+jspb.Message.GENERATE_TO_OBJECT =
+    goog.define('jspb.Message.GENERATE_TO_OBJECT', true);
 
 
 /**
@@ -184,7 +185,8 @@
  *     used in an application.
  *     By default this is enabled for test code only.
  */
-goog.define('jspb.Message.GENERATE_FROM_OBJECT', !goog.DISALLOW_TEST_ONLY_CODE);
+jspb.Message.GENERATE_FROM_OBJECT = goog.define(
+    'jspb.Message.GENERATE_FROM_OBJECT', !goog.DISALLOW_TEST_ONLY_CODE);
 
 
 /**
@@ -192,7 +194,8 @@
  *     this off if you do not use toString in your project and want to trim it
  *     from the compiled JS.
  */
-goog.define('jspb.Message.GENERATE_TO_STRING', true);
+jspb.Message.GENERATE_TO_STRING =
+    goog.define('jspb.Message.GENERATE_TO_STRING', true);
 
 
 /**
@@ -200,7 +203,8 @@
  *     local (e.g. not from another iframe) and thus safely classified with
  *     instanceof Array.
  */
-goog.define('jspb.Message.ASSUME_LOCAL_ARRAYS', false);
+jspb.Message.ASSUME_LOCAL_ARRAYS =
+    goog.define('jspb.Message.ASSUME_LOCAL_ARRAYS', false);
 
 
 // TODO(jakubvrana): Turn this off by default.
@@ -210,7 +214,8 @@
  *     the proto before serialization. This is enabled by default to be
  *     backwards compatible. Projects are advised to turn this flag always off.
  */
-goog.define('jspb.Message.SERIALIZE_EMPTY_TRAILING_FIELDS', true);
+jspb.Message.SERIALIZE_EMPTY_TRAILING_FIELDS =
+    goog.define('jspb.Message.SERIALIZE_EMPTY_TRAILING_FIELDS', true);
 
 
 /**
@@ -326,6 +331,10 @@
   return fieldNumber + msg.arrayIndexOffset_;
 };
 
+// This is only here to ensure we are not back sliding on ES6 requiements for
+// protos in g3.
+jspb.Message.hiddenES6Property_ = class {};
+
 
 /**
  * Returns the tag number based on the index in msg.array.
diff --git a/python/google/protobuf/internal/api_implementation.cc b/python/google/protobuf/internal/api_implementation.cc
index 6db12e8..2a7f41d 100644
--- a/python/google/protobuf/internal/api_implementation.cc
+++ b/python/google/protobuf/internal/api_implementation.cc
@@ -69,25 +69,24 @@
 
 static const char* kModuleName = "_api_implementation";
 static const char kModuleDocstring[] =
-"_api_implementation is a module that exposes compile-time constants that\n"
-"determine the default API implementation to use for Python proto2.\n"
-"\n"
-"It complements api_implementation.py by setting defaults using compile-time\n"
-"constants defined in C, such that one can set defaults at compilation\n"
-"(e.g. with blaze flag --copt=-DPYTHON_PROTO2_CPP_IMPL_V2).";
+    "_api_implementation is a module that exposes compile-time constants that\n"
+    "determine the default API implementation to use for Python proto2.\n"
+    "\n"
+    "It complements api_implementation.py by setting defaults using "
+    "compile-time\n"
+    "constants defined in C, such that one can set defaults at compilation\n"
+    "(e.g. with blaze flag --copt=-DPYTHON_PROTO2_CPP_IMPL_V2).";
 
 #if PY_MAJOR_VERSION >= 3
-static struct PyModuleDef _module = {
-  PyModuleDef_HEAD_INIT,
-  kModuleName,
-  kModuleDocstring,
-  -1,
-  NULL,
-  NULL,
-  NULL,
-  NULL,
-  NULL
-};
+static struct PyModuleDef _module = {PyModuleDef_HEAD_INIT,
+                                     kModuleName,
+                                     kModuleDocstring,
+                                     -1,
+                                     NULL,
+                                     NULL,
+                                     NULL,
+                                     NULL,
+                                     NULL};
 #define INITFUNC PyInit__api_implementation
 #define INITFUNC_ERRORVAL NULL
 #else
@@ -96,32 +95,31 @@
 #endif
 
 extern "C" {
-  PyMODINIT_FUNC INITFUNC() {
+PyMODINIT_FUNC INITFUNC() {
 #if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&_module);
+  PyObject* module = PyModule_Create(&_module);
 #else
-    PyObject *module = Py_InitModule3(
-        const_cast<char*>(kModuleName),
-        NULL,
-        const_cast<char*>(kModuleDocstring));
+  PyObject* module = Py_InitModule3(const_cast<char*>(kModuleName), NULL,
+                                    const_cast<char*>(kModuleDocstring));
 #endif
-    if (module == NULL) {
-      return INITFUNC_ERRORVAL;
-    }
-
-    // Adds the module variable "api_version".
-    if (PyModule_AddIntConstant(
-        module,
-        const_cast<char*>(kImplVersionName),
-        kImplVersion))
-#if PY_MAJOR_VERSION < 3
-      return;
-#else
-      { Py_DECREF(module); return NULL; }
-
-    return module;
-#endif
+  if (module == NULL) {
+    return INITFUNC_ERRORVAL;
   }
+
+  // Adds the module variable "api_version".
+  if (PyModule_AddIntConstant(module, const_cast<char*>(kImplVersionName),
+                              kImplVersion))
+#if PY_MAJOR_VERSION < 3
+    return;
+#else
+  {
+    Py_DECREF(module);
+    return NULL;
+  }
+
+  return module;
+#endif
+}
 }
 
 }  // namespace python
diff --git a/python/google/protobuf/internal/api_implementation.py b/python/google/protobuf/internal/api_implementation.py
index 23cc2c0..e8448e8 100755
--- a/python/google/protobuf/internal/api_implementation.py
+++ b/python/google/protobuf/internal/api_implementation.py
@@ -137,6 +137,12 @@
   return _implementation_type
 
 
+def _SetType(implementation_type):
+  """Never use! Only for protobuf benchmark."""
+  global _implementation_type
+  _implementation_type = implementation_type
+
+
 # See comment on 'Type' above.
 def Version():
   return _implementation_version
diff --git a/python/google/protobuf/internal/descriptor_database_test.py b/python/google/protobuf/internal/descriptor_database_test.py
index 800d54f..a185612 100644
--- a/python/google/protobuf/internal/descriptor_database_test.py
+++ b/python/google/protobuf/internal/descriptor_database_test.py
@@ -48,7 +48,8 @@
 from google.protobuf import descriptor_database
 
 
-class DescriptorDatabaseTest(testing_refleaks.BaseTestCase):
+@testing_refleaks.TestCase
+class DescriptorDatabaseTest(unittest.TestCase):
 
   def testAdd(self):
     db = descriptor_database.DescriptorDatabase()
diff --git a/python/google/protobuf/internal/descriptor_pool_test.py b/python/google/protobuf/internal/descriptor_pool_test.py
index 4dc2094..bf7e346 100644
--- a/python/google/protobuf/internal/descriptor_pool_test.py
+++ b/python/google/protobuf/internal/descriptor_pool_test.py
@@ -561,8 +561,8 @@
                       str(w[0].message))
 
 
-class DefaultDescriptorPoolTest(DescriptorPoolTestBase,
-                                testing_refleaks.BaseTestCase):
+@testing_refleaks.TestCase
+class DefaultDescriptorPoolTest(DescriptorPoolTestBase, unittest.TestCase):
 
   def setUp(self):
     self.pool = descriptor_pool.Default()
@@ -597,8 +597,8 @@
         unittest_pb2.DESCRIPTOR.services_by_name['TestService'])
 
 
-class CreateDescriptorPoolTest(DescriptorPoolTestBase,
-                               testing_refleaks.BaseTestCase):
+@testing_refleaks.TestCase
+class CreateDescriptorPoolTest(DescriptorPoolTestBase, unittest.TestCase):
 
   def setUp(self):
     self.pool = descriptor_pool.DescriptorPool()
@@ -619,8 +619,9 @@
         no_package_pb2.DESCRIPTOR.serialized_pb))
 
 
+@testing_refleaks.TestCase
 class SecondaryDescriptorFromDescriptorDB(DescriptorPoolTestBase,
-                                          testing_refleaks.BaseTestCase):
+                                          unittest.TestCase):
 
   def setUp(self):
     self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString(
@@ -812,7 +813,8 @@
     test.assertEqual(file_desc, field_desc.file)
 
 
-class AddDescriptorTest(testing_refleaks.BaseTestCase):
+@testing_refleaks.TestCase
+class AddDescriptorTest(unittest.TestCase):
 
   def _TestMessage(self, prefix):
     pool = descriptor_pool.DescriptorPool()
diff --git a/python/google/protobuf/internal/extension_dict.py b/python/google/protobuf/internal/extension_dict.py
index 4a1399d..a8ce013 100644
--- a/python/google/protobuf/internal/extension_dict.py
+++ b/python/google/protobuf/internal/extension_dict.py
@@ -183,3 +183,24 @@
       Extension field descriptor.
     """
     return self._extended_message._extensions_by_number.get(number, None)
+
+  def __iter__(self):
+    # Return a generator over the populated extension fields
+    return (f[0] for f in self._extended_message.ListFields()
+            if f[0].is_extension)
+
+  def __contains__(self, extension_handle):
+    _VerifyExtensionHandle(self._extended_message, extension_handle)
+
+    if extension_handle not in self._extended_message._fields:
+      return False
+
+    if extension_handle.label == FieldDescriptor.LABEL_REPEATED:
+      return bool(self._extended_message._fields.get(extension_handle))
+
+    if extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE:
+      value = self._extended_message._fields.get(extension_handle)
+      # pylint: disable=protected-access
+      return value is not None and value._is_present_in_parent
+
+    return True
diff --git a/python/google/protobuf/internal/keywords_test.py b/python/google/protobuf/internal/keywords_test.py
new file mode 100755
index 0000000..8744928
--- /dev/null
+++ b/python/google/protobuf/internal/keywords_test.py
@@ -0,0 +1,105 @@
+#! /usr/bin/env python
+#
+# Protocol Buffers - Google's data interchange format
+# Copyright 2008 Google Inc.  All rights reserved.
+# https://developers.google.com/protocol-buffers/
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests for google.protobuf.internal.keywords."""
+
+import unittest
+
+
+from google.protobuf.internal import more_messages_pb2
+from google.protobuf import descriptor_pool
+
+
+class KeywordsConflictTest(unittest.TestCase):
+
+  def setUp(self):
+    super(KeywordsConflictTest, self).setUp()
+    self.pool = descriptor_pool.Default()
+
+  def testMessage(self):
+    message = getattr(more_messages_pb2, 'class')()
+    message.int_field = 123
+    self.assertEqual(message.int_field, 123)
+    des = self.pool.FindMessageTypeByName('google.protobuf.internal.class')
+    self.assertEqual(des.name, 'class')
+
+  def testNestedMessage(self):
+    message = getattr(more_messages_pb2, 'class')()
+    message.nested_message.field = 234
+    self.assertEqual(message.nested_message.field, 234)
+    des = self.pool.FindMessageTypeByName('google.protobuf.internal.class.try')
+    self.assertEqual(des.name, 'try')
+
+  def testField(self):
+    message = getattr(more_messages_pb2, 'class')()
+    setattr(message, 'if', 123)
+    setattr(message, 'as', 1)
+    self.assertEqual(getattr(message, 'if'), 123)
+    self.assertEqual(getattr(message, 'as'), 1)
+
+  def testEnum(self):
+    class_ = getattr(more_messages_pb2, 'class')
+    message = class_()
+    # Normal enum value.
+    message.enum_field = more_messages_pb2.default
+    self.assertEqual(message.enum_field, more_messages_pb2.default)
+    # Top level enum value.
+    message.enum_field = getattr(more_messages_pb2, 'else')
+    self.assertEqual(message.enum_field, 1)
+    # Nested enum value
+    message.nested_enum_field = getattr(class_, 'True')
+    self.assertEqual(message.nested_enum_field, 1)
+
+  def testExtension(self):
+    message = getattr(more_messages_pb2, 'class')()
+    # Top level extension
+    extension1 = getattr(more_messages_pb2, 'continue')
+    message.Extensions[extension1] = 456
+    self.assertEqual(message.Extensions[extension1], 456)
+    # None top level extension
+    extension2 = getattr(more_messages_pb2.ExtendClass, 'return')
+    message.Extensions[extension2] = 789
+    self.assertEqual(message.Extensions[extension2], 789)
+
+  def testExtensionForNestedMessage(self):
+    message = getattr(more_messages_pb2, 'class')()
+    extension = getattr(more_messages_pb2, 'with')
+    message.nested_message.Extensions[extension] = 999
+    self.assertEqual(message.nested_message.Extensions[extension], 999)
+
+  def TestFullKeywordUsed(self):
+    message = more_messages_pb2.TestFullKeyword()
+    message.field2.int_field = 123
+
+
+if __name__ == '__main__':
+  unittest.main()
diff --git a/python/google/protobuf/internal/message_factory_test.py b/python/google/protobuf/internal/message_factory_test.py
index 7a5a090..24b79ec 100644
--- a/python/google/protobuf/internal/message_factory_test.py
+++ b/python/google/protobuf/internal/message_factory_test.py
@@ -49,7 +49,8 @@
 from google.protobuf import message_factory
 
 
-class MessageFactoryTest(testing_refleaks.BaseTestCase):
+@testing_refleaks.TestCase
+class MessageFactoryTest(unittest.TestCase):
 
   def setUp(self):
     self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString(
diff --git a/python/google/protobuf/internal/message_test.py b/python/google/protobuf/internal/message_test.py
index b66c1e0..3927ce1 100755
--- a/python/google/protobuf/internal/message_test.py
+++ b/python/google/protobuf/internal/message_test.py
@@ -106,13 +106,11 @@
   return isinf(val) and (val < 0)
 
 
-BaseTestCase = testing_refleaks.BaseTestCase
-
-
 @_parameterized.named_parameters(
     ('_proto2', unittest_pb2),
     ('_proto3', unittest_proto3_arena_pb2))
-class MessageTest(BaseTestCase):
+@testing_refleaks.TestCase
+class MessageTest(unittest.TestCase):
 
   def testBadUtf8String(self, message_module):
     if api_implementation.Type() != 'python':
@@ -779,28 +777,31 @@
     m1 = message_module.TestAllTypes()
     m2 = message_module.TestAllTypes()
     # Cpp extension will lazily create a sub message which is immutable.
-    self.assertEqual(0, m1.optional_nested_message.bb)
+    nested = m1.optional_nested_message
+    self.assertEqual(0, nested.bb)
     m2.optional_nested_message.bb = 1
     # Make sure cmessage pointing to a mutable message after merge instead of
     # the lazily created message.
     m1.MergeFrom(m2)
-    self.assertEqual(1, m1.optional_nested_message.bb)
+    self.assertEqual(1, nested.bb)
 
     # Test more nested sub message.
     msg1 = message_module.NestedTestAllTypes()
     msg2 = message_module.NestedTestAllTypes()
-    self.assertEqual(0, msg1.child.payload.optional_nested_message.bb)
+    nested = msg1.child.payload.optional_nested_message
+    self.assertEqual(0, nested.bb)
     msg2.child.payload.optional_nested_message.bb = 1
     msg1.MergeFrom(msg2)
-    self.assertEqual(1, msg1.child.payload.optional_nested_message.bb)
+    self.assertEqual(1, nested.bb)
 
     # Test repeated field.
     self.assertEqual(msg1.payload.repeated_nested_message,
                      msg1.payload.repeated_nested_message)
-    msg2.payload.repeated_nested_message.add().bb = 1
+    nested = msg2.payload.repeated_nested_message.add()
+    nested.bb = 1
     msg1.MergeFrom(msg2)
     self.assertEqual(1, len(msg1.payload.repeated_nested_message))
-    self.assertEqual(1, msg1.payload.repeated_nested_message[0].bb)
+    self.assertEqual(1, nested.bb)
 
   def testMergeFromString(self, message_module):
     m1 = message_module.TestAllTypes()
@@ -1299,7 +1300,8 @@
 
 
 # Class to test proto2-only features (required, extensions, etc.)
-class Proto2Test(BaseTestCase):
+@testing_refleaks.TestCase
+class Proto2Test(unittest.TestCase):
 
   def testFieldPresence(self):
     message = unittest_pb2.TestAllTypes()
@@ -1573,7 +1575,8 @@
 
 
 # Class to test proto3-only features/behavior (updated field presence & enums)
-class Proto3Test(BaseTestCase):
+@testing_refleaks.TestCase
+class Proto3Test(unittest.TestCase):
 
   # Utility method for comparing equality with a map.
   def assertMapIterEquals(self, map_iter, dict_value):
@@ -2444,7 +2447,8 @@
         optional_string=u'\ud801\ud801')
 
 
-class ValidTypeNamesTest(BaseTestCase):
+@testing_refleaks.TestCase
+class ValidTypeNamesTest(unittest.TestCase):
 
   def assertImportFromName(self, msg, base_name):
     # Parse <type 'module.class_name'> to extra 'some.name' as a string.
@@ -2465,7 +2469,8 @@
     self.assertImportFromName(pb.repeated_int32, 'Scalar')
     self.assertImportFromName(pb.repeated_nested_message, 'Composite')
 
-class PackedFieldTest(BaseTestCase):
+@testing_refleaks.TestCase
+class PackedFieldTest(unittest.TestCase):
 
   def setMessage(self, message):
     message.repeated_int32.append(1)
@@ -2525,7 +2530,8 @@
 @unittest.skipIf(api_implementation.Type() != 'cpp' or
                  sys.version_info < (2, 7),
                  'explicit tests of the C++ implementation for PY27 and above')
-class OversizeProtosTest(BaseTestCase):
+@testing_refleaks.TestCase
+class OversizeProtosTest(unittest.TestCase):
 
   @classmethod
   def setUpClass(cls):
diff --git a/python/google/protobuf/internal/more_extensions.proto b/python/google/protobuf/internal/more_extensions.proto
index 78f1467..5038fd2 100644
--- a/python/google/protobuf/internal/more_extensions.proto
+++ b/python/google/protobuf/internal/more_extensions.proto
@@ -41,7 +41,9 @@
 
 
 message ExtendedMessage {
-  extensions 1 to max;
+  optional int32 optional_int32 = 1001;
+  repeated string repeated_string = 1002;
+  extensions 1 to 999;
 }
 
 
diff --git a/python/google/protobuf/internal/more_messages.proto b/python/google/protobuf/internal/more_messages.proto
index 612f029..c5889c4 100644
--- a/python/google/protobuf/internal/more_messages.proto
+++ b/python/google/protobuf/internal/more_messages.proto
@@ -30,6 +30,8 @@
 
 // Author: robinson@google.com (Will Robinson)
 
+// LINT: LEGACY_NAMES
+
 syntax = "proto2";
 
 package google.protobuf.internal;
@@ -51,6 +53,53 @@
   optional    int64 optional_int64    =  2;
 }
 
+enum is {                               // top level enum keyword
+  default = 0;
+  else = 1;                             // top level enum value keyword
+}
+
+message class {                         // message keyword
+  optional int32 int_field = 1;
+  optional int32 if = 2;                // field keyword
+  optional is as = 3;                   // enum field keyword
+  optional is enum_field = 4;
+  enum for {                            // nested enum keyword
+    default = 0;
+    True = 1;                           // nested enum value keyword
+  }
+  optional for nested_enum_field = 5;
+  message try {
+    optional int32 field = 1;
+    extensions 999 to 9999;
+  }
+  optional try nested_message = 6;
+  extensions 999 to 9999;
+}
+
+extend class {
+  optional int32 continue = 1001;       // top level extension keyword
+}
+
+extend class.try {
+  optional int32 with = 1001;
+}
+
+message ExtendClass {
+  extend class {
+    optional int32 return = 1002;       // nested extension keyword
+  }
+}
+
+message TestFullKeyword {
+  optional google.protobuf.internal.OutOfOrderFields field1 = 1;
+  optional google.protobuf.internal.class field2 = 2;
+}
+
+// TODO(jieluo): Add keyword support for service.
+// service False {
+//   rpc Bar(class) returns (class);
+// }
+
 message LotsNestedMessage {
   message B0 {}
   message B1 {}
diff --git a/python/google/protobuf/internal/python_protobuf.cc b/python/google/protobuf/internal/python_protobuf.cc
index f90cc43..e823bf2 100644
--- a/python/google/protobuf/internal/python_protobuf.cc
+++ b/python/google/protobuf/internal/python_protobuf.cc
@@ -36,12 +36,8 @@
 namespace protobuf {
 namespace python {
 
-static const Message* GetCProtoInsidePyProtoStub(PyObject* msg) {
-  return NULL;
-}
-static Message* MutableCProtoInsidePyProtoStub(PyObject* msg) {
-  return NULL;
-}
+static const Message* GetCProtoInsidePyProtoStub(PyObject* msg) { return NULL; }
+static Message* MutableCProtoInsidePyProtoStub(PyObject* msg) { return NULL; }
 
 // This is initialized with a default, stub implementation.
 // If python-google.protobuf.cc is loaded, the function pointer is overridden
diff --git a/python/google/protobuf/internal/reflection_test.py b/python/google/protobuf/internal/reflection_test.py
index b87eaba..d486bb1 100755
--- a/python/google/protobuf/internal/reflection_test.py
+++ b/python/google/protobuf/internal/reflection_test.py
@@ -68,9 +68,6 @@
   long = int  # pylint: disable=redefined-builtin,invalid-name
 
 
-BaseTestCase = testing_refleaks.BaseTestCase
-
-
 class _MiniDecoder(object):
   """Decodes a stream of values from a string.
 
@@ -116,7 +113,8 @@
     return self._pos == len(self._bytes)
 
 
-class ReflectionTest(BaseTestCase):
+@testing_refleaks.TestCase
+class ReflectionTest(unittest.TestCase):
 
   def assertListsEqual(self, values, others):
     self.assertEqual(len(values), len(others))
@@ -1201,32 +1199,71 @@
     self.assertEqual(prius.price, new_prius.price)
     self.assertEqual(prius.owners, new_prius.owners)
 
+  def testExtensionIter(self):
+    extendee_proto = more_extensions_pb2.ExtendedMessage()
+
+    extension_int32 = more_extensions_pb2.optional_int_extension
+    extendee_proto.Extensions[extension_int32] = 23
+
+    extension_repeated = more_extensions_pb2.repeated_int_extension
+    extendee_proto.Extensions[extension_repeated].append(11)
+
+    extension_msg = more_extensions_pb2.optional_message_extension
+    extendee_proto.Extensions[extension_msg].foreign_message_int = 56
+
+    # Set some normal fields.
+    extendee_proto.optional_int32 = 1
+    extendee_proto.repeated_string.append('hi')
+
+    expected = (extension_int32, extension_msg, extension_repeated)
+    count = 0
+    for item in extendee_proto.Extensions:
+      self.assertEqual(item.name, expected[count].name)
+      self.assertIn(item, extendee_proto.Extensions)
+      count += 1
+    self.assertEqual(count, 3)
+
+  def testExtensionContainsError(self):
+    extendee_proto = more_extensions_pb2.ExtendedMessage()
+    self.assertRaises(KeyError, extendee_proto.Extensions.__contains__, 0)
+
+    field = more_extensions_pb2.ExtendedMessage.DESCRIPTOR.fields_by_name[
+        'optional_int32']
+    self.assertRaises(KeyError, extendee_proto.Extensions.__contains__, field)
+
   def testTopLevelExtensionsForOptionalScalar(self):
     extendee_proto = unittest_pb2.TestAllExtensions()
     extension = unittest_pb2.optional_int32_extension
     self.assertTrue(not extendee_proto.HasExtension(extension))
+    self.assertNotIn(extension, extendee_proto.Extensions)
     self.assertEqual(0, extendee_proto.Extensions[extension])
     # As with normal scalar fields, just doing a read doesn't actually set the
     # "has" bit.
     self.assertTrue(not extendee_proto.HasExtension(extension))
+    self.assertNotIn(extension, extendee_proto.Extensions)
     # Actually set the thing.
     extendee_proto.Extensions[extension] = 23
     self.assertEqual(23, extendee_proto.Extensions[extension])
     self.assertTrue(extendee_proto.HasExtension(extension))
+    self.assertIn(extension, extendee_proto.Extensions)
     # Ensure that clearing works as well.
     extendee_proto.ClearExtension(extension)
     self.assertEqual(0, extendee_proto.Extensions[extension])
     self.assertTrue(not extendee_proto.HasExtension(extension))
+    self.assertNotIn(extension, extendee_proto.Extensions)
 
   def testTopLevelExtensionsForRepeatedScalar(self):
     extendee_proto = unittest_pb2.TestAllExtensions()
     extension = unittest_pb2.repeated_string_extension
     self.assertEqual(0, len(extendee_proto.Extensions[extension]))
+    self.assertNotIn(extension, extendee_proto.Extensions)
     extendee_proto.Extensions[extension].append('foo')
     self.assertEqual(['foo'], extendee_proto.Extensions[extension])
+    self.assertIn(extension, extendee_proto.Extensions)
     string_list = extendee_proto.Extensions[extension]
     extendee_proto.ClearExtension(extension)
     self.assertEqual(0, len(extendee_proto.Extensions[extension]))
+    self.assertNotIn(extension, extendee_proto.Extensions)
     self.assertTrue(string_list is not extendee_proto.Extensions[extension])
     # Shouldn't be allowed to do Extensions[extension] = 'a'
     self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
@@ -1236,13 +1273,16 @@
     extendee_proto = unittest_pb2.TestAllExtensions()
     extension = unittest_pb2.optional_foreign_message_extension
     self.assertTrue(not extendee_proto.HasExtension(extension))
+    self.assertNotIn(extension, extendee_proto.Extensions)
     self.assertEqual(0, extendee_proto.Extensions[extension].c)
     # As with normal (non-extension) fields, merely reading from the
     # thing shouldn't set the "has" bit.
     self.assertTrue(not extendee_proto.HasExtension(extension))
+    self.assertNotIn(extension, extendee_proto.Extensions)
     extendee_proto.Extensions[extension].c = 23
     self.assertEqual(23, extendee_proto.Extensions[extension].c)
     self.assertTrue(extendee_proto.HasExtension(extension))
+    self.assertIn(extension, extendee_proto.Extensions)
     # Save a reference here.
     foreign_message = extendee_proto.Extensions[extension]
     extendee_proto.ClearExtension(extension)
@@ -1253,6 +1293,7 @@
     self.assertEqual(42, foreign_message.c)
     self.assertTrue(foreign_message.HasField('c'))
     self.assertTrue(not extendee_proto.HasExtension(extension))
+    self.assertNotIn(extension, extendee_proto.Extensions)
     # Shouldn't be allowed to do Extensions[extension] = 'a'
     self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
                       extension, 'a')
@@ -1280,15 +1321,19 @@
 
     # We just test the non-repeated case.
     self.assertTrue(not extendee_proto.HasExtension(extension))
+    self.assertNotIn(extension, extendee_proto.Extensions)
     required = extendee_proto.Extensions[extension]
     self.assertEqual(0, required.a)
     self.assertTrue(not extendee_proto.HasExtension(extension))
+    self.assertNotIn(extension, extendee_proto.Extensions)
     required.a = 23
     self.assertEqual(23, extendee_proto.Extensions[extension].a)
     self.assertTrue(extendee_proto.HasExtension(extension))
+    self.assertIn(extension, extendee_proto.Extensions)
     extendee_proto.ClearExtension(extension)
     self.assertTrue(required is not extendee_proto.Extensions[extension])
     self.assertTrue(not extendee_proto.HasExtension(extension))
+    self.assertNotIn(extension, extendee_proto.Extensions)
 
   def testRegisteredExtensions(self):
     pool = unittest_pb2.DESCRIPTOR.pool
@@ -1952,7 +1997,8 @@
 #  into separate TestCase classes.
 
 
-class TestAllTypesEqualityTest(BaseTestCase):
+@testing_refleaks.TestCase
+class TestAllTypesEqualityTest(unittest.TestCase):
 
   def setUp(self):
     self.first_proto = unittest_pb2.TestAllTypes()
@@ -1968,7 +2014,8 @@
     self.assertEqual(self.first_proto, self.second_proto)
 
 
-class FullProtosEqualityTest(BaseTestCase):
+@testing_refleaks.TestCase
+class FullProtosEqualityTest(unittest.TestCase):
 
   """Equality tests using completely-full protos as a starting point."""
 
@@ -2054,7 +2101,8 @@
     self.assertEqual(self.first_proto, self.second_proto)
 
 
-class ExtensionEqualityTest(BaseTestCase):
+@testing_refleaks.TestCase
+class ExtensionEqualityTest(unittest.TestCase):
 
   def testExtensionEquality(self):
     first_proto = unittest_pb2.TestAllExtensions()
@@ -2087,7 +2135,8 @@
     self.assertEqual(first_proto, second_proto)
 
 
-class MutualRecursionEqualityTest(BaseTestCase):
+@testing_refleaks.TestCase
+class MutualRecursionEqualityTest(unittest.TestCase):
 
   def testEqualityWithMutualRecursion(self):
     first_proto = unittest_pb2.TestMutualRecursionA()
@@ -2099,7 +2148,8 @@
     self.assertEqual(first_proto, second_proto)
 
 
-class ByteSizeTest(BaseTestCase):
+@testing_refleaks.TestCase
+class ByteSizeTest(unittest.TestCase):
 
   def setUp(self):
     self.proto = unittest_pb2.TestAllTypes()
@@ -2411,7 +2461,8 @@
 #   * Handling of empty submessages (with and without "has"
 #     bits set).
 
-class SerializationTest(BaseTestCase):
+@testing_refleaks.TestCase
+class SerializationTest(unittest.TestCase):
 
   def testSerializeEmtpyMessage(self):
     first_proto = unittest_pb2.TestAllTypes()
@@ -3004,7 +3055,8 @@
     self.assertEqual(3, proto.repeated_int32[2])
 
 
-class OptionsTest(BaseTestCase):
+@testing_refleaks.TestCase
+class OptionsTest(unittest.TestCase):
 
   def testMessageOptions(self):
     proto = message_set_extensions_pb2.TestMessageSet()
@@ -3031,7 +3083,8 @@
 
 
 
-class ClassAPITest(BaseTestCase):
+@testing_refleaks.TestCase
+class ClassAPITest(unittest.TestCase):
 
   @unittest.skipIf(
       api_implementation.Type() == 'cpp' and api_implementation.Version() == 2,
diff --git a/python/google/protobuf/internal/testing_refleaks.py b/python/google/protobuf/internal/testing_refleaks.py
index 8ce0651..e448fce 100644
--- a/python/google/protobuf/internal/testing_refleaks.py
+++ b/python/google/protobuf/internal/testing_refleaks.py
@@ -69,8 +69,8 @@
     pass
 
 
-class ReferenceLeakCheckerTestCase(unittest.TestCase):
-  """A TestCase which runs tests multiple times, collecting reference counts."""
+class ReferenceLeakCheckerMixin(object):
+  """A mixin class for TestCase, which checks reference counts."""
 
   NB_RUNS = 3
 
@@ -81,8 +81,8 @@
     self._saved_pickle_registry = copyreg.dispatch_table.copy()
 
     # Run the test twice, to warm up the instance attributes.
-    super(ReferenceLeakCheckerTestCase, self).run(result=result)
-    super(ReferenceLeakCheckerTestCase, self).run(result=result)
+    super(ReferenceLeakCheckerMixin, self).run(result=result)
+    super(ReferenceLeakCheckerMixin, self).run(result=result)
 
     oldrefcount = 0
     local_result = LocalTestResult(result)
@@ -90,7 +90,7 @@
     refcount_deltas = []
     for _ in range(self.NB_RUNS):
       oldrefcount = self._getRefcounts()
-      super(ReferenceLeakCheckerTestCase, self).run(result=local_result)
+      super(ReferenceLeakCheckerMixin, self).run(result=local_result)
       newrefcount = self._getRefcounts()
       refcount_deltas.append(newrefcount - oldrefcount)
     print(refcount_deltas, self)
@@ -112,12 +112,19 @@
 
 
 if hasattr(sys, 'gettotalrefcount'):
-  BaseTestCase = ReferenceLeakCheckerTestCase
+
+  def TestCase(test_class):
+    new_bases = (ReferenceLeakCheckerMixin,) + test_class.__bases__
+    new_class = type(test_class)(
+        test_class.__name__, new_bases, dict(test_class.__dict__))
+    return new_class
   SkipReferenceLeakChecker = unittest.skip
 
 else:
   # When PyDEBUG is not enabled, run the tests normally.
-  BaseTestCase = unittest.TestCase
+
+  def TestCase(test_class):
+    return test_class
 
   def SkipReferenceLeakChecker(reason):
     del reason  # Don't skip, so don't need a reason.
diff --git a/python/google/protobuf/internal/text_format_test.py b/python/google/protobuf/internal/text_format_test.py
index cdab1c6..3b0adcb 100755
--- a/python/google/protobuf/internal/text_format_test.py
+++ b/python/google/protobuf/internal/text_format_test.py
@@ -598,6 +598,12 @@
     six.assertRaisesRegex(self, text_format.ParseError, (
         r'1:1 : Message type "\w+.TestAllTypes" has no field named '
         r'"unknown_field".'), text_format.Parse, text, message)
+    text = ('optional_int32: 123\n'
+            'unknown_field: 8\n'
+            'optional_nested_message { bb: 45 }')
+    text_format.Parse(text, message, allow_unknown_field=True)
+    self.assertEqual(message.optional_nested_message.bb, 45)
+    self.assertEqual(message.optional_int32, 123)
 
   def testParseBadEnumValue(self, message_module):
     message = message_module.TestAllTypes()
diff --git a/python/google/protobuf/internal/unknown_fields_test.py b/python/google/protobuf/internal/unknown_fields_test.py
index ab0260e..bcc4a46 100755
--- a/python/google/protobuf/internal/unknown_fields_test.py
+++ b/python/google/protobuf/internal/unknown_fields_test.py
@@ -53,10 +53,8 @@
 from google.protobuf import descriptor
 
 
-BaseTestCase = testing_refleaks.BaseTestCase
-
-
-class UnknownFieldsTest(BaseTestCase):
+@testing_refleaks.TestCase
+class UnknownFieldsTest(unittest.TestCase):
 
   def setUp(self):
     self.descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
@@ -152,7 +150,8 @@
         msg.map_int32_all_types[1].optional_nested_message.SerializeToString())
 
 
-class UnknownFieldsAccessorsTest(BaseTestCase):
+@testing_refleaks.TestCase
+class UnknownFieldsAccessorsTest(unittest.TestCase):
 
   def setUp(self):
     self.descriptor = unittest_pb2.TestAllTypes.DESCRIPTOR
@@ -348,7 +347,8 @@
     self.assertEqual(message.SerializeToString(), self.all_fields_data)
 
 
-class UnknownEnumValuesTest(BaseTestCase):
+@testing_refleaks.TestCase
+class UnknownEnumValuesTest(unittest.TestCase):
 
   def setUp(self):
     self.descriptor = missing_enum_values_pb2.TestEnumValues.DESCRIPTOR
diff --git a/python/google/protobuf/message.py b/python/google/protobuf/message.py
index 8854c86..35ceccb 100755
--- a/python/google/protobuf/message.py
+++ b/python/google/protobuf/message.py
@@ -311,4 +311,9 @@
   def __setstate__(self, state):
     """Support the pickle protocol."""
     self.__init__()
-    self.ParseFromString(state['serialized'])
+    serialized = state['serialized']
+    # On Python 3, using encoding='latin1' is required for unpickling
+    # protos pickled by Python 2.
+    if not isinstance(serialized, bytes):
+      serialized = serialized.encode('latin1')
+    self.ParseFromString(serialized)
diff --git a/python/google/protobuf/pyext/descriptor.cc b/python/google/protobuf/pyext/descriptor.cc
index fb55511..7102a94 100644
--- a/python/google/protobuf/pyext/descriptor.cc
+++ b/python/google/protobuf/pyext/descriptor.cc
@@ -394,11 +394,12 @@
   return reinterpret_cast<PyObject*>(py_descriptor);
 }
 
-static void Dealloc(PyBaseDescriptor* self) {
+static void Dealloc(PyObject* pself) {
+  PyBaseDescriptor* self = reinterpret_cast<PyBaseDescriptor*>(pself);
   // Remove from interned dictionary
   interned_descriptors->erase(self->descriptor);
   Py_CLEAR(self->pool);
-  Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
+  Py_TYPE(self)->tp_free(pself);
 }
 
 static int GcTraverse(PyObject* pself, visitproc visit, void* arg) {
@@ -1323,7 +1324,7 @@
 
 static void Dealloc(PyFileDescriptor* self) {
   Py_XDECREF(self->serialized_pb);
-  descriptor::Dealloc(&self->base);
+  descriptor::Dealloc(reinterpret_cast<PyObject*>(self));
 }
 
 static PyObject* GetPool(PyFileDescriptor *self, void *closure) {
diff --git a/python/google/protobuf/pyext/extension_dict.cc b/python/google/protobuf/pyext/extension_dict.cc
index 7debe6f..35b6ec6 100644
--- a/python/google/protobuf/pyext/extension_dict.cc
+++ b/python/google/protobuf/pyext/extension_dict.cc
@@ -90,6 +90,47 @@
   return size;
 }
 
+struct ExtensionIterator {
+  PyObject_HEAD;
+  Py_ssize_t index;
+  std::vector<const FieldDescriptor*> fields;
+
+  // Owned reference, to keep the FieldDescriptors alive.
+  ExtensionDict* extension_dict;
+};
+
+PyObject* GetIter(PyObject* _self) {
+  ExtensionDict* self = reinterpret_cast<ExtensionDict*>(_self);
+
+  ScopedPyObjectPtr obj(PyType_GenericAlloc(&ExtensionIterator_Type, 0));
+  if (obj == nullptr) {
+    return PyErr_Format(PyExc_MemoryError,
+                        "Could not allocate extension iterator");
+  }
+
+  ExtensionIterator* iter = reinterpret_cast<ExtensionIterator*>(obj.get());
+
+  // Call "placement new" to initialize. So the constructor of
+  // std::vector<...> fields will be called.
+  new (iter) ExtensionIterator;
+
+  self->parent->message->GetReflection()->ListFields(*self->parent->message,
+                                                     &iter->fields);
+  iter->index = 0;
+  Py_INCREF(self);
+  iter->extension_dict = self;
+
+  return obj.release();
+}
+
+static void DeallocExtensionIterator(PyObject* _self) {
+  ExtensionIterator* self = reinterpret_cast<ExtensionIterator*>(_self);
+  self->fields.clear();
+  Py_XDECREF(self->extension_dict);
+  self->~ExtensionIterator();
+  Py_TYPE(_self)->tp_free(_self);
+}
+
 PyObject* subscript(ExtensionDict* self, PyObject* key) {
   const FieldDescriptor* descriptor = cmessage::GetExtensionDescriptor(key);
   if (descriptor == NULL) {
@@ -108,20 +149,19 @@
       self->parent->composite_fields->find(descriptor);
   if (iterator != self->parent->composite_fields->end()) {
     Py_INCREF(iterator->second);
-    return iterator->second;
+    return iterator->second->AsPyObject();
   }
 
   if (descriptor->label() != FieldDescriptor::LABEL_REPEATED &&
       descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
     // TODO(plabatut): consider building the class on the fly!
-    PyObject* sub_message = cmessage::InternalGetSubMessage(
+    ContainerBase* sub_message = cmessage::InternalGetSubMessage(
         self->parent, descriptor);
     if (sub_message == NULL) {
       return NULL;
     }
-    Py_INCREF(sub_message);
     (*self->parent->composite_fields)[descriptor] = sub_message;
-    return sub_message;
+    return sub_message->AsPyObject();
   }
 
   if (descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
@@ -144,23 +184,21 @@
       if (message_class == NULL) {
         return NULL;
       }
-      PyObject* py_container = repeated_composite_container::NewContainer(
+      ContainerBase* py_container = repeated_composite_container::NewContainer(
           self->parent, descriptor, message_class);
       if (py_container == NULL) {
         return NULL;
       }
-      Py_INCREF(py_container);
       (*self->parent->composite_fields)[descriptor] = py_container;
-      return py_container;
+      return py_container->AsPyObject();
     } else {
-      PyObject* py_container = repeated_scalar_container::NewContainer(
+      ContainerBase* py_container = repeated_scalar_container::NewContainer(
           self->parent, descriptor);
       if (py_container == NULL) {
         return NULL;
       }
-      Py_INCREF(py_container);
       (*self->parent->composite_fields)[descriptor] = py_container;
-      return py_container;
+      return py_container->AsPyObject();
     }
   }
   PyErr_SetString(PyExc_ValueError, "control reached unexpected line");
@@ -236,6 +274,35 @@
   return PyFieldDescriptor_FromDescriptor(message_extension);
 }
 
+static int Contains(PyObject* _self, PyObject* key) {
+  ExtensionDict* self = reinterpret_cast<ExtensionDict*>(_self);
+  const FieldDescriptor* field_descriptor =
+      cmessage::GetExtensionDescriptor(key);
+  if (field_descriptor == nullptr) {
+    return -1;
+  }
+
+  if (!field_descriptor->is_extension()) {
+    PyErr_Format(PyExc_KeyError, "%s is not an extension",
+                 field_descriptor->full_name().c_str());
+    return -1;
+  }
+
+  const Message* message = self->parent->message;
+  const Reflection* reflection = message->GetReflection();
+  if (field_descriptor->is_repeated()) {
+    if (reflection->FieldSize(*message, field_descriptor) > 0) {
+      return 1;
+    }
+  } else {
+    if (reflection->HasField(*message, field_descriptor)) {
+      return 1;
+    }
+  }
+
+  return 0;
+}
+
 ExtensionDict* NewExtensionDict(CMessage *parent) {
   ExtensionDict* self = reinterpret_cast<ExtensionDict*>(
       PyType_GenericAlloc(&ExtensionDict_Type, 0));
@@ -248,7 +315,8 @@
   return self;
 }
 
-void dealloc(ExtensionDict* self) {
+void dealloc(PyObject* pself) {
+  ExtensionDict* self = reinterpret_cast<ExtensionDict*>(pself);
   Py_CLEAR(self->parent);
   Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
 }
@@ -269,6 +337,16 @@
     Py_RETURN_TRUE;
   }
 }
+static PySequenceMethods SeqMethods = {
+    (lenfunc)len,          // sq_length
+    0,                     // sq_concat
+    0,                     // sq_repeat
+    0,                     // sq_item
+    0,                     // sq_slice
+    0,                     // sq_ass_item
+    0,                     // sq_ass_slice
+    (objobjproc)Contains,  // sq_contains
+};
 
 static PyMappingMethods MpMethods = {
   (lenfunc)len,                /* mp_length */
@@ -278,54 +356,119 @@
 
 #define EDMETHOD(name, args, doc) { #name, (PyCFunction)name, args, doc }
 static PyMethodDef Methods[] = {
-  EDMETHOD(_FindExtensionByName, METH_O,
-           "Finds an extension by name."),
-  EDMETHOD(_FindExtensionByNumber, METH_O,
-           "Finds an extension by field number."),
-  { NULL, NULL }
+    EDMETHOD(_FindExtensionByName, METH_O, "Finds an extension by name."),
+    EDMETHOD(_FindExtensionByNumber, METH_O,
+             "Finds an extension by field number."),
+    {NULL, NULL},
 };
 
 }  // namespace extension_dict
 
 PyTypeObject ExtensionDict_Type = {
-  PyVarObject_HEAD_INIT(&PyType_Type, 0)
-  FULL_MODULE_NAME ".ExtensionDict",   // tp_name
-  sizeof(ExtensionDict),               // tp_basicsize
-  0,                                   //  tp_itemsize
-  (destructor)extension_dict::dealloc,  //  tp_dealloc
-  0,                                   //  tp_print
-  0,                                   //  tp_getattr
-  0,                                   //  tp_setattr
-  0,                                   //  tp_compare
-  0,                                   //  tp_repr
-  0,                                   //  tp_as_number
-  0,                                   //  tp_as_sequence
-  &extension_dict::MpMethods,          //  tp_as_mapping
-  PyObject_HashNotImplemented,         //  tp_hash
-  0,                                   //  tp_call
-  0,                                   //  tp_str
-  0,                                   //  tp_getattro
-  0,                                   //  tp_setattro
-  0,                                   //  tp_as_buffer
-  Py_TPFLAGS_DEFAULT,                  //  tp_flags
-  "An extension dict",                 //  tp_doc
-  0,                                   //  tp_traverse
-  0,                                   //  tp_clear
-  (richcmpfunc)extension_dict::RichCompare,  //  tp_richcompare
-  0,                                   //  tp_weaklistoffset
-  0,                                   //  tp_iter
-  0,                                   //  tp_iternext
-  extension_dict::Methods,             //  tp_methods
-  0,                                   //  tp_members
-  0,                                   //  tp_getset
-  0,                                   //  tp_base
-  0,                                   //  tp_dict
-  0,                                   //  tp_descr_get
-  0,                                   //  tp_descr_set
-  0,                                   //  tp_dictoffset
-  0,                                   //  tp_init
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)     //
+    FULL_MODULE_NAME ".ExtensionDict",         // tp_name
+    sizeof(ExtensionDict),                     // tp_basicsize
+    0,                                         //  tp_itemsize
+    (destructor)extension_dict::dealloc,       //  tp_dealloc
+    0,                                         //  tp_print
+    0,                                         //  tp_getattr
+    0,                                         //  tp_setattr
+    0,                                         //  tp_compare
+    0,                                         //  tp_repr
+    0,                                         //  tp_as_number
+    &extension_dict::SeqMethods,               //  tp_as_sequence
+    &extension_dict::MpMethods,                //  tp_as_mapping
+    PyObject_HashNotImplemented,               //  tp_hash
+    0,                                         //  tp_call
+    0,                                         //  tp_str
+    0,                                         //  tp_getattro
+    0,                                         //  tp_setattro
+    0,                                         //  tp_as_buffer
+    Py_TPFLAGS_DEFAULT,                        //  tp_flags
+    "An extension dict",                       //  tp_doc
+    0,                                         //  tp_traverse
+    0,                                         //  tp_clear
+    (richcmpfunc)extension_dict::RichCompare,  //  tp_richcompare
+    0,                                         //  tp_weaklistoffset
+    extension_dict::GetIter,                   //  tp_iter
+    0,                                         //  tp_iternext
+    extension_dict::Methods,                   //  tp_methods
+    0,                                         //  tp_members
+    0,                                         //  tp_getset
+    0,                                         //  tp_base
+    0,                                         //  tp_dict
+    0,                                         //  tp_descr_get
+    0,                                         //  tp_descr_set
+    0,                                         //  tp_dictoffset
+    0,                                         //  tp_init
 };
 
+PyObject* IterNext(PyObject* _self) {
+  extension_dict::ExtensionIterator* self =
+      reinterpret_cast<extension_dict::ExtensionIterator*>(_self);
+  Py_ssize_t total_size = self->fields.size();
+  Py_ssize_t index = self->index;
+  while (self->index < total_size) {
+    index = self->index;
+    ++self->index;
+    if (self->fields[index]->is_extension()) {
+      // With C++ descriptors, the field can always be retrieved, but for
+      // unknown extensions which have not been imported in Python code, there
+      // is no message class and we cannot retrieve the value.
+      // ListFields() has the same behavior.
+      if (self->fields[index]->message_type() != nullptr &&
+          message_factory::GetMessageClass(
+              cmessage::GetFactoryForMessage(self->extension_dict->parent),
+              self->fields[index]->message_type()) == nullptr) {
+        PyErr_Clear();
+        continue;
+      }
+
+      return PyFieldDescriptor_FromDescriptor(self->fields[index]);
+    }
+  }
+
+  return nullptr;
+}
+
+PyTypeObject ExtensionIterator_Type = {
+    PyVarObject_HEAD_INIT(&PyType_Type, 0)      //
+    FULL_MODULE_NAME ".ExtensionIterator",      //  tp_name
+    sizeof(extension_dict::ExtensionIterator),  //  tp_basicsize
+    0,                                          //  tp_itemsize
+    extension_dict::DeallocExtensionIterator,   //  tp_dealloc
+    0,                                          //  tp_print
+    0,                                          //  tp_getattr
+    0,                                          //  tp_setattr
+    0,                                          //  tp_compare
+    0,                                          //  tp_repr
+    0,                                          //  tp_as_number
+    0,                                          //  tp_as_sequence
+    0,                                          //  tp_as_mapping
+    0,                                          //  tp_hash
+    0,                                          //  tp_call
+    0,                                          //  tp_str
+    0,                                          //  tp_getattro
+    0,                                          //  tp_setattro
+    0,                                          //  tp_as_buffer
+    Py_TPFLAGS_DEFAULT,                         //  tp_flags
+    "A scalar map iterator",                    //  tp_doc
+    0,                                          //  tp_traverse
+    0,                                          //  tp_clear
+    0,                                          //  tp_richcompare
+    0,                                          //  tp_weaklistoffset
+    PyObject_SelfIter,                          //  tp_iter
+    IterNext,                                   //  tp_iternext
+    0,                                          //  tp_methods
+    0,                                          //  tp_members
+    0,                                          //  tp_getset
+    0,                                          //  tp_base
+    0,                                          //  tp_dict
+    0,                                          //  tp_descr_get
+    0,                                          //  tp_descr_set
+    0,                                          //  tp_dictoffset
+    0,                                          //  tp_init
+};
 }  // namespace python
 }  // namespace protobuf
 }  // namespace google
diff --git a/python/google/protobuf/pyext/extension_dict.h b/python/google/protobuf/pyext/extension_dict.h
index a7d6bb7..c9da443 100644
--- a/python/google/protobuf/pyext/extension_dict.h
+++ b/python/google/protobuf/pyext/extension_dict.h
@@ -56,6 +56,7 @@
 } ExtensionDict;
 
 extern PyTypeObject ExtensionDict_Type;
+extern PyTypeObject ExtensionIterator_Type;
 
 namespace extension_dict {
 
diff --git a/python/google/protobuf/pyext/map_container.cc b/python/google/protobuf/pyext/map_container.cc
index d858402..bc59ae8 100644
--- a/python/google/protobuf/pyext/map_container.cc
+++ b/python/google/protobuf/pyext/map_container.cc
@@ -43,6 +43,7 @@
 #include <google/protobuf/pyext/message.h>
 #include <google/protobuf/pyext/repeated_composite_container.h>
 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
+#include <google/protobuf/stubs/map_util.h>
 
 #if PY_MAJOR_VERSION >= 3
   #define PyInt_FromLong PyLong_FromLong
@@ -82,26 +83,23 @@
   // We own a ref on this.
   MapContainer* container;
 
-  // We need to keep a ref on the Message* too, because
+  // We need to keep a ref on the parent Message too, because
   // MapIterator::~MapIterator() accesses it.  Normally this would be ok because
   // the ref on container (above) would guarantee outlive semantics.  However in
-  // the case of ClearField(), InitializeAndCopyToParentContainer() resets the
-  // message pointer (and the owner) to a different message, a copy of the
-  // original.  But our iterator still points to the original, which could now
-  // get deleted before us.
+  // the case of ClearField(), the MapContainer points to a different message,
+  // a copy of the original.  But our iterator still points to the original,
+  // which could now get deleted before us.
   //
   // To prevent this, we ensure that the Message will always stay alive as long
   // as this iterator does.  This is solely for the benefit of the MapIterator
   // destructor -- we should never actually access the iterator in this state
   // except to delete it.
-  CMessage::OwnerRef owner;
-
+  CMessage* parent;
   // The version of the map when we took the iterator to it.
   //
   // We store this so that if the map is modified during iteration we can throw
   // an error.
   uint64 version;
-
   // True if the container is empty.  We signal this separately to avoid calling
   // any of the iteration methods, which are non-const.
   bool empty;
@@ -109,7 +107,7 @@
 
 Message* MapContainer::GetMutableMessage() {
   cmessage::AssureWritable(parent);
-  return const_cast<Message*>(message);
+  return parent->message;
 }
 
 // Consumes a reference on the Python string object.
@@ -315,7 +313,7 @@
 
 Py_ssize_t MapReflectionFriend::Length(PyObject* _self) {
   MapContainer* self = GetMap(_self);
-  const google::protobuf::Message* message = self->message;
+  const google::protobuf::Message* message = self->parent->message;
   return message->GetReflection()->MapSize(*message,
                                            self->parent_field_descriptor);
 }
@@ -343,7 +341,7 @@
   MapContainer* self = GetMap(_self);
   MapContainer* other_map = GetMap(arg);
   Message* message = self->GetMutableMessage();
-  const Message* other_message = other_map->message;
+  const Message* other_message = other_map->parent->message;
   const Reflection* reflection = message->GetReflection();
   const Reflection* other_reflection = other_message->GetReflection();
   internal::MapFieldBase* field = reflection->MutableMapData(
@@ -359,7 +357,7 @@
 PyObject* MapReflectionFriend::Contains(PyObject* _self, PyObject* key) {
   MapContainer* self = GetMap(_self);
 
-  const Message* message = self->message;
+  const Message* message = self->parent->message;
   const Reflection* reflection = message->GetReflection();
   MapKey map_key;
 
@@ -375,71 +373,26 @@
   }
 }
 
-// Initializes the underlying Message object of "to" so it becomes a new parent
-// map container, and copies all the values from "from" to it. A child map
-// container can be released by passing it as both from and to (e.g. making it
-// the recipient of the new parent message and copying the values from itself).
-// In fact, this is the only supported use at the moment.
-static int InitializeAndCopyToParentContainer(MapContainer* from,
-                                              MapContainer* to) {
-  // For now we require from == to, re-evaluate if we want to support deep copy
-  // as in repeated_scalar_container.cc.
-  GOOGLE_DCHECK(from == to);
-  Message* new_message = from->message->New();
-
-  if (MapReflectionFriend::Length(reinterpret_cast<PyObject*>(from)) > 0) {
-    // A somewhat roundabout way of copying just one field from old_message to
-    // new_message.  This is the best we can do with what Reflection gives us.
-    Message* mutable_old = from->GetMutableMessage();
-    std::vector<const FieldDescriptor*> fields;
-    fields.push_back(from->parent_field_descriptor);
-
-    // Move the map field into the new message.
-    mutable_old->GetReflection()->SwapFields(mutable_old, new_message, fields);
-
-    // If/when we support from != to, this will be required also to copy the
-    // map field back into the existing message:
-    // mutable_old->MergeFrom(*new_message);
-  }
-
-  // If from == to this could delete old_message.
-  to->owner.reset(new_message);
-
-  to->parent = NULL;
-  to->parent_field_descriptor = from->parent_field_descriptor;
-  to->message = new_message;
-
-  // Invalidate iterators, since they point to the old copy of the field.
-  to->version++;
-
-  return 0;
-}
-
-int MapContainer::Release() {
-  return InitializeAndCopyToParentContainer(this, this);
-}
-
-
 // ScalarMap ///////////////////////////////////////////////////////////////////
 
-PyObject *NewScalarMapContainer(
+MapContainer* NewScalarMapContainer(
     CMessage* parent, const google::protobuf::FieldDescriptor* parent_field_descriptor) {
   if (!CheckFieldBelongsToMessage(parent_field_descriptor, parent->message)) {
     return NULL;
   }
 
-  ScopedPyObjectPtr obj(PyType_GenericAlloc(ScalarMapContainer_Type, 0));
-  if (obj.get() == NULL) {
-    return PyErr_Format(PyExc_RuntimeError,
-                        "Could not allocate new container.");
+  PyObject* obj(PyType_GenericAlloc(ScalarMapContainer_Type, 0));
+  if (obj == NULL) {
+    PyErr_Format(PyExc_RuntimeError,
+                 "Could not allocate new container.");
+    return NULL;
   }
 
-  MapContainer* self = GetMap(obj.get());
+  MapContainer* self = GetMap(obj);
 
-  self->message = parent->message;
+  Py_INCREF(parent);
   self->parent = parent;
   self->parent_field_descriptor = parent_field_descriptor;
-  self->owner = parent->owner;
   self->version = 0;
 
   self->key_field_descriptor =
@@ -449,11 +402,12 @@
 
   if (self->key_field_descriptor == NULL ||
       self->value_field_descriptor == NULL) {
-    return PyErr_Format(PyExc_KeyError,
-                        "Map entry descriptor did not have key/value fields");
+    PyErr_Format(PyExc_KeyError,
+                 "Map entry descriptor did not have key/value fields");
+    return NULL;
   }
 
-  return obj.release();
+  return self;
 }
 
 PyObject* MapReflectionFriend::ScalarMapGetItem(PyObject* _self,
@@ -571,7 +525,7 @@
 
 static void ScalarMapDealloc(PyObject* _self) {
   MapContainer* self = GetMap(_self);
-  self->owner.reset();
+  self->RemoveFromParentCache();
   PyTypeObject *type = Py_TYPE(_self);
   type->tp_free(_self);
   if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
@@ -674,36 +628,15 @@
   return reinterpret_cast<MessageMapContainer*>(obj);
 }
 
-static PyObject* GetCMessage(MessageMapContainer* self, Message* message,
-                             bool insert_message_dict) {
+static PyObject* GetCMessage(MessageMapContainer* self, Message* message) {
   // Get or create the CMessage object corresponding to this message.
-  ScopedPyObjectPtr key(PyLong_FromVoidPtr(message));
-  PyObject* ret = PyDict_GetItem(self->message_dict, key.get());
-
-  if (ret == NULL) {
-    CMessage* cmsg = cmessage::NewEmptyMessage(self->message_class);
-    ret = reinterpret_cast<PyObject*>(cmsg);
-
-    if (cmsg == NULL) {
-      return NULL;
-    }
-    cmsg->owner = self->owner;
-    cmsg->message = message;
-    cmsg->parent = self->parent;
-    if (insert_message_dict) {
-      if (PyDict_SetItem(self->message_dict, key.get(), ret) < 0) {
-        Py_DECREF(ret);
-        return NULL;
-      }
-    }
-  } else {
-    Py_INCREF(ret);
-  }
-
-  return ret;
+  return self->parent
+      ->BuildSubMessageFromPointer(self->parent_field_descriptor, message,
+                                   self->message_class)
+      ->AsPyObject();
 }
 
-PyObject* NewMessageMapContainer(
+MessageMapContainer* NewMessageMapContainer(
     CMessage* parent, const google::protobuf::FieldDescriptor* parent_field_descriptor,
     CMessageClass* message_class) {
   if (!CheckFieldBelongsToMessage(parent_field_descriptor, parent->message)) {
@@ -712,16 +645,15 @@
 
   PyObject* obj = PyType_GenericAlloc(MessageMapContainer_Type, 0);
   if (obj == NULL) {
-    return PyErr_Format(PyExc_RuntimeError,
-                        "Could not allocate new container.");
+    PyErr_SetString(PyExc_RuntimeError, "Could not allocate new container.");
+    return NULL;
   }
 
   MessageMapContainer* self = GetMessageMap(obj);
 
-  self->message = parent->message;
+  Py_INCREF(parent);
   self->parent = parent;
   self->parent_field_descriptor = parent_field_descriptor;
-  self->owner = parent->owner;
   self->version = 0;
 
   self->key_field_descriptor =
@@ -729,23 +661,18 @@
   self->value_field_descriptor =
       parent_field_descriptor->message_type()->FindFieldByName("value");
 
-  self->message_dict = PyDict_New();
-  if (self->message_dict == NULL) {
-    return PyErr_Format(PyExc_RuntimeError,
-                        "Could not allocate message dict.");
-  }
-
   Py_INCREF(message_class);
   self->message_class = message_class;
 
   if (self->key_field_descriptor == NULL ||
       self->value_field_descriptor == NULL) {
-    Py_DECREF(obj);
-    return PyErr_Format(PyExc_KeyError,
-                        "Map entry descriptor did not have key/value fields");
+    Py_DECREF(self);
+    PyErr_SetString(PyExc_KeyError,
+                    "Map entry descriptor did not have key/value fields");
+    return NULL;
   }
 
-  return obj;
+  return self;
 }
 
 int MapReflectionFriend::MessageMapSetItem(PyObject* _self, PyObject* key,
@@ -777,22 +704,14 @@
     MapValueRef value;
     reflection->InsertOrLookupMapValue(message, self->parent_field_descriptor,
                                        map_key, &value);
-    ScopedPyObjectPtr key(PyLong_FromVoidPtr(value.MutableMessageValue()));
-
-    PyObject* cmsg_value = PyDict_GetItem(self->message_dict, key.get());
-    if (cmsg_value) {
-      // Need to keep CMessage stay alive if it is still referenced after
-      // deletion. Makes a new message and swaps values into CMessage
-      // instead of just removing.
-      CMessage* cmsg =  reinterpret_cast<CMessage*>(cmsg_value);
-      Message* msg = cmsg->message;
-      cmsg->owner.reset(msg->New());
-      cmsg->message = cmsg->owner.get();
-      cmsg->parent = NULL;
-      msg->GetReflection()->Swap(msg, cmsg->message);
-      if (PyDict_DelItem(self->message_dict, key.get()) < 0) {
-        return -1;
-      }
+    Message* sub_message = value.MutableMessageValue();
+    // If there is a living weak reference to an item, we "Release" it,
+    // otherwise we just discard the C++ value.
+    if (CMessage* released =
+            self->parent->MaybeReleaseSubMessage(sub_message)) {
+      Message* msg = released->message;
+      released->message = msg->New();
+      msg->GetReflection()->Swap(msg, released->message);
     }
 
     // Delete key from map.
@@ -823,7 +742,7 @@
     self->version++;
   }
 
-  return GetCMessage(self, value.MutableMessageValue(), true);
+  return GetCMessage(self, value.MutableMessageValue());
 }
 
 PyObject* MapReflectionFriend::MessageMapToStr(PyObject* _self) {
@@ -846,10 +765,7 @@
     if (key == NULL) {
       return NULL;
     }
-    // Do not insert the cmessage to self->message_dict because
-    // the returned CMessage will not escape this function.
-    value.reset(GetCMessage(
-        self, it.MutableValueRef()->MutableMessageValue(), false));
+    value.reset(GetCMessage(self, it.MutableValueRef()->MutableMessageValue()));
     if (value == NULL) {
       return NULL;
     }
@@ -886,8 +802,7 @@
 
 static void MessageMapDealloc(PyObject* _self) {
   MessageMapContainer* self = GetMessageMap(_self);
-  self->owner.reset();
-  Py_DECREF(self->message_dict);
+  self->RemoveFromParentCache();
   Py_DECREF(self->message_class);
   PyTypeObject *type = Py_TYPE(_self);
   type->tp_free(_self);
@@ -1005,7 +920,8 @@
   Py_INCREF(self);
   iter->container = self;
   iter->version = self->version;
-  iter->owner = self->owner;
+  Py_INCREF(self->parent);
+  iter->parent = self->parent;
 
   if (MapReflectionFriend::Length(_self) > 0) {
     Message* message = self->GetMutableMessage();
@@ -1027,6 +943,10 @@
     return PyErr_Format(PyExc_RuntimeError,
                         "Map modified during iteration.");
   }
+  if (self->parent != self->container->parent) {
+    return PyErr_Format(PyExc_RuntimeError,
+                        "Map cleared during iteration.");
+  }
 
   if (self->iter.get() == NULL) {
     return NULL;
@@ -1051,8 +971,8 @@
 static void DeallocMapIterator(PyObject* _self) {
   MapIterator* self = GetIter(_self);
   self->iter.reset();
-  self->owner.reset();
-  Py_XDECREF(self->container);
+  Py_CLEAR(self->container);
+  Py_CLEAR(self->parent);
   Py_TYPE(_self)->tp_free(_self);
 }
 
diff --git a/python/google/protobuf/pyext/map_container.h b/python/google/protobuf/pyext/map_container.h
index 7e77b02..2c9b323 100644
--- a/python/google/protobuf/pyext/map_container.h
+++ b/python/google/protobuf/pyext/map_container.h
@@ -50,55 +50,21 @@
 
 // This struct is used directly for ScalarMap, and is the base class of
 // MessageMapContainer, which is used for MessageMap.
-struct MapContainer {
-  PyObject_HEAD;
-
-  // This is the top-level C++ Message object that owns the whole
-  // proto tree.  Every Python MapContainer holds a
-  // reference to it in order to keep it alive as long as there's a
-  // Python object that references any part of the tree.
-  CMessage::OwnerRef owner;
-
-  // Pointer to the C++ Message that contains this container.  The
-  // MapContainer does not own this pointer.
-  const Message* message;
-
+struct MapContainer : public ContainerBase {
   // Use to get a mutable message when necessary.
   Message* GetMutableMessage();
 
-  // Weak reference to a parent CMessage object (i.e. may be NULL.)
-  //
-  // Used to make sure all ancestors are also mutable when first
-  // modifying the container.
-  CMessage* parent;
-
-  // Pointer to the parent's descriptor that describes this
-  // field.  Used together with the parent's message when making a
-  // default message instance mutable.
-  // The pointer is owned by the global DescriptorPool.
-  const FieldDescriptor* parent_field_descriptor;
+  // Cache some descriptors, used to convert keys and values.
   const FieldDescriptor* key_field_descriptor;
   const FieldDescriptor* value_field_descriptor;
-
   // We bump this whenever we perform a mutation, to invalidate existing
   // iterators.
   uint64 version;
-
-  // Releases the messages in the container to a new message.
-  //
-  // Returns 0 on success, -1 on failure.
-  int Release();
-
-  // Set the owner field of self and any children of self.
-  void SetOwner(const CMessage::OwnerRef& new_owner) { owner = new_owner; }
 };
 
 struct MessageMapContainer : public MapContainer {
   // The type used to create new child messages.
   CMessageClass* message_class;
-
-  // A dict mapping Message* -> CMessage.
-  PyObject* message_dict;
 };
 
 bool InitMapContainers();
@@ -109,12 +75,12 @@
 
 // Builds a MapContainer object, from a parent message and a
 // field descriptor.
-extern PyObject* NewScalarMapContainer(
+extern MapContainer* NewScalarMapContainer(
     CMessage* parent, const FieldDescriptor* parent_field_descriptor);
 
 // Builds a MessageMap object, from a parent message and a
 // field descriptor.
-extern PyObject* NewMessageMapContainer(
+extern MessageMapContainer* NewMessageMapContainer(
     CMessage* parent, const FieldDescriptor* parent_field_descriptor,
     CMessageClass* message_class);
 
diff --git a/python/google/protobuf/pyext/message.cc b/python/google/protobuf/pyext/message.cc
index 9a3caa4..ae0971d 100644
--- a/python/google/protobuf/pyext/message.cc
+++ b/python/google/protobuf/pyext/message.cc
@@ -68,6 +68,7 @@
 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
 #include <google/protobuf/util/message_differencer.h>
 #include <google/protobuf/stubs/strutil.h>
+#include <google/protobuf/stubs/map_util.h>
 
 #include <google/protobuf/port_def.inc>
 
@@ -531,101 +532,10 @@
 namespace cmessage {
 int InternalReleaseFieldByDescriptor(
     CMessage* self,
-    const FieldDescriptor* field_descriptor,
-    PyObject* composite_field);
+    const FieldDescriptor* field_descriptor);
 }  // namespace cmessage
 
 // ---------------------------------------------------------------------
-// Visiting the composite children of a CMessage
-
-struct ChildVisitor {
-  // Returns 0 on success, -1 on failure.
-  int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
-    return 0;
-  }
-
-  // Returns 0 on success, -1 on failure.
-  int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
-    return 0;
-  }
-
-  // Returns 0 on success, -1 on failure.
-  int VisitMapContainer(MapContainer* container) {
-    return 0;
-  }
-
-  // Returns 0 on success, -1 on failure.
-  int VisitCMessage(CMessage* cmessage,
-                    const FieldDescriptor* field_descriptor) {
-    return 0;
-  }
-
-  // Returns 0 on success, -1 on failure.
-  int VisitUnknownFieldSet(PyUnknownFields* unknown_field_set) {
-    return 0;
-  }
-};
-
-// Apply a function to a composite field.  Does nothing if child is of
-// non-composite type.
-template<class Visitor>
-static int VisitCompositeField(const FieldDescriptor* descriptor,
-                               PyObject* child,
-                               Visitor visitor) {
-  if (descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
-    if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      if (descriptor->is_map()) {
-        MapContainer* container = reinterpret_cast<MapContainer*>(child);
-        if (visitor.VisitMapContainer(container) == -1) {
-          return -1;
-        }
-      } else {
-        RepeatedCompositeContainer* container =
-          reinterpret_cast<RepeatedCompositeContainer*>(child);
-        if (visitor.VisitRepeatedCompositeContainer(container) == -1)
-          return -1;
-      }
-    } else {
-      RepeatedScalarContainer* container =
-        reinterpret_cast<RepeatedScalarContainer*>(child);
-      if (visitor.VisitRepeatedScalarContainer(container) == -1)
-        return -1;
-    }
-  } else if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-    CMessage* cmsg = reinterpret_cast<CMessage*>(child);
-    if (visitor.VisitCMessage(cmsg, descriptor) == -1)
-      return -1;
-  }
-  // The ExtensionDict might contain non-composite fields, which we
-  // skip here.
-  return 0;
-}
-
-// Visit each composite field and extension field of this CMessage.
-// Returns -1 on error and 0 on success.
-template<class Visitor>
-int ForEachCompositeField(CMessage* self, Visitor visitor) {
-  // Visit normal fields.
-  if (self->composite_fields) {
-    for (CMessage::CompositeFieldsMap::iterator it =
-             self->composite_fields->begin();
-         it != self->composite_fields->end(); it++) {
-      const FieldDescriptor* descriptor = it->first;
-      PyObject* field = it->second;
-      if (VisitCompositeField(descriptor, field, visitor) == -1) return -1;
-    }
-  }
-
-  if (self->unknown_field_set) {
-    PyUnknownFields* unknown_field_set =
-      reinterpret_cast<PyUnknownFields*>(self->unknown_field_set);
-    visitor.VisitUnknownFieldSet(unknown_field_set);
-  }
-
-  return 0;
-}
-
-// ---------------------------------------------------------------------
 
 PyObject* EncodeError_class;
 PyObject* DecodeError_class;
@@ -941,139 +851,79 @@
     // Non-message fields don't need to be released.
     return 0;
   }
-  if (cmessage->composite_fields) {
-    CMessage::CompositeFieldsMap::iterator iterator =
-        cmessage->composite_fields->find(existing_field);
-    if (iterator != cmessage->composite_fields->end()) {
-      if (InternalReleaseFieldByDescriptor(cmessage, existing_field,
-                                           iterator->second) < 0) {
-        return -1;
-      }
-      Py_DECREF(iterator->second);
-      cmessage->composite_fields->erase(iterator);
-    }
+  if (InternalReleaseFieldByDescriptor(cmessage, existing_field) < 0) {
+    return -1;
   }
 #endif
   return 0;
 }
 
+// After a Merge, visit every sub-message that was read-only, and
+// eventually update their pointer if the Merge operation modified them.
+int FixupMessageAfterMerge(CMessage* self) {
+  if (!self->composite_fields) {
+    return 0;
+  }
+  for (const auto& item : *self->composite_fields) {
+    const FieldDescriptor* descriptor = item.first;
+    if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
+        !descriptor->is_repeated()) {
+      CMessage* cmsg = reinterpret_cast<CMessage*>(item.second);
+      if (cmsg->read_only == false) {
+        return 0;
+      }
+      Message* message = self->message;
+      const Reflection* reflection = message->GetReflection();
+      if (reflection->HasField(*message, descriptor)) {
+        // Message used to be read_only, but is no longer. Get the new pointer
+        // and record it.
+        Message* mutable_message =
+            reflection->MutableMessage(message, descriptor, nullptr);
+        cmsg->message = mutable_message;
+        cmsg->read_only = false;
+        if (FixupMessageAfterMerge(cmsg) < 0) {
+          return -1;
+        }
+      }
+    }
+  }
+
+  return 0;
+}
+
 // ---------------------------------------------------------------------
 // Making a message writable
 
-static Message* GetMutableMessage(
-    CMessage* parent,
-    const FieldDescriptor* parent_field) {
-  Message* parent_message = parent->message;
-  const Reflection* reflection = parent_message->GetReflection();
-  if (MaybeReleaseOverlappingOneofField(parent, parent_field) < 0) {
-    return NULL;
-  }
-  return reflection->MutableMessage(
-      parent_message, parent_field,
-      GetFactoryForMessage(parent)->message_factory);
-}
-
-struct FixupMessageReference : public ChildVisitor {
-  // message must outlive this object.
-  explicit FixupMessageReference(Message* message) :
-      message_(message) {}
-
-  int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
-    container->message = message_;
-    return 0;
-  }
-
-  int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
-    container->message = message_;
-    return 0;
-  }
-
-  int VisitMapContainer(MapContainer* container) {
-    container->message = message_;
-    return 0;
-  }
-
-  int VisitUnknownFieldSet(PyUnknownFields* unknown_field_set) {
-    const Reflection* reflection = message_->GetReflection();
-    unknown_field_set->fields = &reflection->GetUnknownFields(*message_);
-    return 0;
-  }
-
- private:
-  Message* message_;
-};
-
-// After a Merge, visit every sub-message that was read-only, and
-// eventually update their pointer if the Merge operation modified them.
-struct FixupMessageAfterMerge : public FixupMessageReference {
-  explicit FixupMessageAfterMerge(CMessage* parent) :
-      FixupMessageReference(parent->message),
-      parent_cmessage(parent), message(parent->message) {}
-
-  int VisitCMessage(CMessage* cmessage,
-                    const FieldDescriptor* field_descriptor) {
-    if (cmessage->read_only == false) {
-      return 0;
-    }
-    if (message->GetReflection()->HasField(*message, field_descriptor)) {
-      Message* mutable_message = GetMutableMessage(
-          parent_cmessage, field_descriptor);
-      if (mutable_message == NULL) {
-        return -1;
-      }
-      cmessage->message = mutable_message;
-      cmessage->read_only = false;
-      if (ForEachCompositeField(
-              cmessage, FixupMessageAfterMerge(cmessage)) == -1) {
-        return -1;
-      }
-    }
-    return 0;
-  }
-
- private:
-  CMessage* parent_cmessage;
-  Message* message;
-};
-
 int AssureWritable(CMessage* self) {
   if (self == NULL || !self->read_only) {
     return 0;
   }
 
-  if (self->parent == NULL) {
-    // If parent is NULL but we are trying to modify a read-only message, this
-    // is a reference to a constant default instance that needs to be replaced
-    // with a mutable top-level message.
-    self->message = self->message->New();
-    self->owner.reset(self->message);
-    // Cascade the new owner to eventual children: even if this message is
-    // empty, some submessages or repeated containers might exist already.
-    SetOwner(self, self->owner);
-  } else {
-    // Otherwise, we need a mutable child message.
-    if (AssureWritable(self->parent) == -1)
-      return -1;
+  // Toplevel messages are always mutable.
+  GOOGLE_DCHECK(self->parent);
 
-    // Make self->message writable.
-    Message* mutable_message = GetMutableMessage(
-        self->parent,
-        self->parent_field_descriptor);
-    if (mutable_message == NULL) {
-      return -1;
-    }
-    self->message = mutable_message;
-  }
-  self->read_only = false;
-
-  // When a CMessage is made writable its Message pointer is updated
-  // to point to a new mutable Message.  When that happens we need to
-  // update any references to the old, read-only CMessage.  There are
-  // three places such references occur: RepeatedScalarContainer,
-  // RepeatedCompositeContainer, and MapContainer.
-  if (ForEachCompositeField(self, FixupMessageReference(self->message)) == -1)
+  if (AssureWritable(self->parent) == -1)
     return -1;
 
+  // If this message is part of a oneof, there might be a field to release in
+  // the parent.
+  if (MaybeReleaseOverlappingOneofField(self->parent,
+                                        self->parent_field_descriptor) < 0) {
+    return -1;
+  }
+
+  // Make self->message writable.
+  Message* parent_message = self->parent->message;
+  const Reflection* reflection = parent_message->GetReflection();
+  Message* mutable_message = reflection->MutableMessage(
+      parent_message, self->parent_field_descriptor,
+      GetFactoryForMessage(self->parent)->message_factory);
+  if (mutable_message == NULL) {
+    return -1;
+  }
+  self->message = mutable_message;
+  self->read_only = false;
+
   return 0;
 }
 
@@ -1119,16 +969,16 @@
   return value;
 }
 
-// If cmessage_list is not NULL, this function releases values into the
-// container CMessages instead of just removing. Repeated composite container
-// needs to do this to make sure CMessages stay alive if they're still
-// referenced after deletion. Repeated scalar container doesn't need to worry.
-int InternalDeleteRepeatedField(
-    Message* message,
+// Delete a slice from a repeated field.
+// The only way to remove items in C++ protos is to delete the last one,
+// so we swap items to move the deleted ones at the end, and then strip the
+// sequence.
+int DeleteRepeatedField(
+    CMessage* self,
     const FieldDescriptor* field_descriptor,
-    PyObject* slice,
-    PyObject* cmessage_list) {
+    PyObject* slice) {
   Py_ssize_t length, from, to, step, slice_length;
+  Message* message = self->message;
   const Reflection* reflection = message->GetReflection();
   int min, max;
   length = reflection->FieldSize(*message, field_descriptor);
@@ -1178,39 +1028,31 @@
     i += step;
   }
 
+  // Swap elements so that items to delete are at the end.
   to = 0;
   for (i = 0; i < length; ++i) {
     if (!to_delete[i]) {
       if (i != to) {
         reflection->SwapElements(message, field_descriptor, i, to);
-        if (cmessage_list != NULL) {
-          // If a list of cmessages is passed in (i.e. from a repeated
-          // composite container), swap those as well to correspond to the
-          // swaps in the underlying message so they're in the right order
-          // when we start releasing.
-          PyObject* tmp = PyList_GET_ITEM(cmessage_list, i);
-          PyList_SET_ITEM(cmessage_list, i,
-                          PyList_GET_ITEM(cmessage_list, to));
-          PyList_SET_ITEM(cmessage_list, to, tmp);
-        }
       }
       ++to;
     }
   }
 
-  while (i > to) {
-    if (cmessage_list == NULL) {
-      reflection->RemoveLast(message, field_descriptor);
-    } else {
-      CMessage* last_cmessage = reinterpret_cast<CMessage*>(
-          PyList_GET_ITEM(cmessage_list, PyList_GET_SIZE(cmessage_list) - 1));
-      repeated_composite_container::ReleaseLastTo(
-          message, field_descriptor, last_cmessage);
-      if (PySequence_DelItem(cmessage_list, -1) < 0) {
-        return -1;
+  // Remove items, starting from the end.
+  for (; length > to; length--) {
+    // If there is a living weak reference to a deleted item, we "Release" it,
+    if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
+        self->child_submessages) {
+      Message* sub_message = reflection->MutableRepeatedMessage(
+          message, field_descriptor, length - 1);
+      if (CMessage* released = self->MaybeReleaseSubMessage(sub_message)) {
+        released->message = reflection->ReleaseLast(message, field_descriptor);
+        continue;
       }
     }
-    --i;
+    // No Python object refers to this item, discard the value.
+    reflection->RemoveLast(message, field_descriptor);
   }
 
   return 0;
@@ -1384,8 +1226,8 @@
   return 0;
 }
 
-// Allocates an incomplete Python Message: the caller must fill self->message,
-// self->owner and eventually self->parent.
+// Allocates an incomplete Python Message: the caller must fill self->message
+// and eventually self->parent.
 CMessage* NewEmptyMessage(CMessageClass* type) {
   CMessage* self = reinterpret_cast<CMessage*>(
       PyType_GenericAlloc(&type->super.ht_type, 0));
@@ -1393,14 +1235,13 @@
     return NULL;
   }
 
-  // Use "placement new" syntax to initialize the C++ object.
-  new (&self->owner) CMessage::OwnerRef(NULL);
   self->message = NULL;
   self->parent = NULL;
   self->parent_field_descriptor = NULL;
   self->read_only = false;
 
   self->composite_fields = NULL;
+  self->child_submessages = NULL;
 
   self->unknown_field_set = NULL;
 
@@ -1420,9 +1261,10 @@
   if (message_descriptor == NULL) {
     return NULL;
   }
-  const Message* default_message = type->py_message_factory->message_factory
-                                   ->GetPrototype(message_descriptor);
-  if (default_message == NULL) {
+  const Message* prototype =
+      type->py_message_factory->message_factory->GetPrototype(
+          message_descriptor);
+  if (prototype == NULL) {
     PyErr_SetString(PyExc_TypeError, message_descriptor->full_name().c_str());
     return NULL;
   }
@@ -1431,8 +1273,8 @@
   if (self == NULL) {
     return NULL;
   }
-  self->message = default_message->New();
-  self->owner.reset(self->message);
+  self->message = prototype->New();
+  self->parent = nullptr;  // This message owns its data.
   return reinterpret_cast<PyObject*>(self);
 }
 
@@ -1444,63 +1286,39 @@
 
 // ---------------------------------------------------------------------
 // Deallocating a CMessage
-//
-// Deallocating a CMessage requires that we clear any weak references
-// from children to the message being deallocated.
-
-// Clear the weak reference from the child to the parent.
-struct ClearWeakReferences : public ChildVisitor {
-  int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
-    container->parent = NULL;
-    // The elements in the container have the same parent as the
-    // container itself, so NULL out that pointer as well.
-    const Py_ssize_t n = PyList_GET_SIZE(container->child_messages);
-    for (Py_ssize_t i = 0; i < n; ++i) {
-      CMessage* child_cmessage = reinterpret_cast<CMessage*>(
-          PyList_GET_ITEM(container->child_messages, i));
-      child_cmessage->parent = NULL;
-    }
-    return 0;
-  }
-
-  int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
-    container->parent = NULL;
-    return 0;
-  }
-
-  int VisitMapContainer(MapContainer* container) {
-    container->parent = NULL;
-    return 0;
-  }
-
-  int VisitCMessage(CMessage* cmessage,
-                    const FieldDescriptor* field_descriptor) {
-    cmessage->parent = NULL;
-    return 0;
-  }
-};
 
 static void Dealloc(CMessage* self) {
   if (self->weakreflist) {
     PyObject_ClearWeakRefs(reinterpret_cast<PyObject*>(self));
   }
-  // Null out all weak references from children to this message.
-  GOOGLE_CHECK_EQ(0, ForEachCompositeField(self, ClearWeakReferences()));
-
-  if (self->composite_fields) {
-    for (CMessage::CompositeFieldsMap::iterator it =
-             self->composite_fields->begin();
-         it != self->composite_fields->end(); it++) {
-      Py_DECREF(it->second);
-    }
-    delete self->composite_fields;
-  }
+  // At this point all dependent objects have been removed.
+  GOOGLE_DCHECK(!self->child_submessages || self->child_submessages->empty());
+  GOOGLE_DCHECK(!self->composite_fields || self->composite_fields->empty());
+  delete self->child_submessages;
+  delete self->composite_fields;
   if (self->unknown_field_set) {
     unknown_fields::Clear(
         reinterpret_cast<PyUnknownFields*>(self->unknown_field_set));
-    Py_CLEAR(self->unknown_field_set);
   }
-  self->owner.~ThreadUnsafeSharedPtr<Message>();
+
+  CMessage* parent = self->parent;
+  if (!parent) {
+    // No parent, we own the message.
+    delete self->message;
+  } else if (parent->AsPyObject() == Py_None) {
+    // Message owned externally: Nothing to dealloc
+    Py_CLEAR(self->parent);
+  } else {
+    // Clear this message from its parent's map.
+    if (self->parent_field_descriptor->is_repeated()) {
+      if (parent->child_submessages)
+        parent->child_submessages->erase(self->message);
+    } else {
+      if (parent->composite_fields)
+        parent->composite_fields->erase(self->parent_field_descriptor);
+    }
+    Py_CLEAR(self->parent);
+  }
   Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
 }
 
@@ -1652,17 +1470,8 @@
   if (descriptor == NULL) {
     return NULL;
   }
-  if (self->composite_fields != NULL) {
-    CMessage::CompositeFieldsMap::iterator iterator =
-        self->composite_fields->find(descriptor);
-    if (iterator != self->composite_fields->end()) {
-      if (InternalReleaseFieldByDescriptor(self, descriptor,
-                                           iterator->second) < 0) {
-        return NULL;
-      }
-      Py_DECREF(iterator->second);
-      self->composite_fields->erase(iterator);
-    }
+  if (InternalReleaseFieldByDescriptor(self, descriptor) < 0) {
+    return NULL;
   }
   return ClearFieldByDescriptor(self, descriptor);
 }
@@ -1680,141 +1489,107 @@
 //
 // The Python API's ClearField() and Clear() methods behave
 // differently than their C++ counterparts.  While the C++ versions
-// clears the children the Python versions detaches the children,
+// clears the children, the Python versions detaches the children,
 // without touching their content.  This impedance mismatch causes
 // some complexity in the implementation, which is captured in this
 // section.
 //
-// When a CMessage field is cleared we need to:
+// When one or multiple fields are cleared we need to:
 //
-// * Release the Message used as the backing store for the CMessage
-//   from its parent.
+// * Gather all child objects that need to be detached from the message.
+//   In composite_fields and child_submessages.
 //
-// * Change the owner field of the released CMessage and all of its
-//   children to point to the newly released Message.
+// * Create a new Python message of the same kind. Use SwapFields() to move
+//   data from the original message.
 //
-// * Clear the weak references from the released CMessage to the
-//   parent.
-//
-// When a RepeatedCompositeContainer field is cleared we need to:
-//
-// * Release all the Message used as the backing store for the
-//   CMessages stored in the container.
-//
-// * Change the owner field of all the released CMessage and all of
-//   their children to point to the newly released Messages.
-//
-// * Clear the weak references from the released container to the
-//   parent.
+// * Change the parent of all child objects: update their strong reference
+//   to their parent, and move their presence in composite_fields and
+//   child_submessages.
 
-class SetOwnerVisitor : public ChildVisitor {
- public:
-  // new_owner must outlive this object.
-  explicit SetOwnerVisitor(const CMessage::OwnerRef& new_owner)
-      : new_owner_(new_owner) {}
+// ---------------------------------------------------------------------
+// Release a composite child of a CMessage
 
-  int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
-    repeated_composite_container::SetOwner(container, new_owner_);
+static int InternalReparentFields(
+    CMessage* self, const std::vector<CMessage*>& messages_to_release,
+    const std::vector<ContainerBase*>& containers_to_release) {
+  if (messages_to_release.empty() && containers_to_release.empty()) {
     return 0;
   }
 
-  int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
-    repeated_scalar_container::SetOwner(container, new_owner_);
-    return 0;
-  }
-
-  int VisitMapContainer(MapContainer* container) {
-    container->SetOwner(new_owner_);
-    return 0;
-  }
-
-  int VisitCMessage(CMessage* cmessage,
-                    const FieldDescriptor* field_descriptor) {
-    return SetOwner(cmessage, new_owner_);
-  }
-
- private:
-  const CMessage::OwnerRef& new_owner_;
-};
-
-// Change the owner of this CMessage and all its children, recursively.
-int SetOwner(CMessage* self, const CMessage::OwnerRef& new_owner) {
-  self->owner = new_owner;
-  if (ForEachCompositeField(self, SetOwnerVisitor(new_owner)) == -1)
+  // Move all the passed sub_messages to another message.
+  CMessage* new_message = cmessage::NewEmptyMessage(self->GetMessageClass());
+  if (new_message == nullptr) {
     return -1;
+  }
+  new_message->message = self->message->New();
+  ScopedPyObjectPtr holder(reinterpret_cast<PyObject*>(new_message));
+  new_message->child_submessages = new CMessage::SubMessagesMap();
+  new_message->composite_fields = new CMessage::CompositeFieldsMap();
+  std::set<const FieldDescriptor*> fields_to_swap;
+
+  // In case this the removed fields are the last reference to a message, keep
+  // a reference.
+  Py_INCREF(self);
+
+  for (const auto& to_release : messages_to_release) {
+    fields_to_swap.insert(to_release->parent_field_descriptor);
+    // Reparent
+    Py_INCREF(new_message);
+    Py_DECREF(to_release->parent);
+    to_release->parent = new_message;
+    self->child_submessages->erase(to_release->message);
+    new_message->child_submessages->emplace(to_release->message, to_release);
+  }
+
+  for (const auto& to_release : containers_to_release) {
+    fields_to_swap.insert(to_release->parent_field_descriptor);
+    Py_INCREF(new_message);
+    Py_DECREF(to_release->parent);
+    to_release->parent = new_message;
+    self->composite_fields->erase(to_release->parent_field_descriptor);
+    new_message->composite_fields->emplace(to_release->parent_field_descriptor,
+                                           to_release);
+  }
+
+  self->message->GetReflection()->SwapFields(
+      self->message, new_message->message,
+      std::vector<const FieldDescriptor*>(fields_to_swap.begin(),
+                                          fields_to_swap.end()));
+
+  // This might delete the Python message completely if all children were moved.
+  Py_DECREF(self);
+
   return 0;
 }
 
-// Releases the message specified by 'field' and returns the
-// pointer. If the field does not exist a new message is created using
-// 'descriptor'. The caller takes ownership of the returned pointer.
-Message* ReleaseMessage(CMessage* self,
-                        const Descriptor* descriptor,
-                        const FieldDescriptor* field_descriptor) {
-  MessageFactory* message_factory = GetFactoryForMessage(self)->message_factory;
-  Message* released_message = self->message->GetReflection()->ReleaseMessage(
-      self->message, field_descriptor, message_factory);
-  // ReleaseMessage will return NULL which differs from
-  // child_cmessage->message, if the field does not exist.  In this case,
-  // the latter points to the default instance via a const_cast<>, so we
-  // have to reset it to a new mutable object since we are taking ownership.
-  if (released_message == NULL) {
-    const Message* prototype = message_factory->GetPrototype(descriptor);
-    GOOGLE_DCHECK(prototype != NULL);
-    released_message = prototype->New();
-  }
-
-  return released_message;
-}
-
-int ReleaseSubMessage(CMessage* self,
-                      const FieldDescriptor* field_descriptor,
-                      CMessage* child_cmessage) {
-  // Release the Message
-  CMessage::OwnerRef released_message(ReleaseMessage(
-      self, child_cmessage->message->GetDescriptor(), field_descriptor));
-  child_cmessage->message = released_message.get();
-  child_cmessage->owner.swap(released_message);
-  child_cmessage->parent = NULL;
-  child_cmessage->parent_field_descriptor = NULL;
-  child_cmessage->read_only = false;
-  return ForEachCompositeField(child_cmessage,
-                               SetOwnerVisitor(child_cmessage->owner));
-}
-
-struct ReleaseChild : public ChildVisitor {
-  // message must outlive this object.
-  explicit ReleaseChild(CMessage* parent) :
-      parent_(parent) {}
-
-  int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
-    return repeated_composite_container::Release(container);
-  }
-
-  int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
-    return repeated_scalar_container::Release(container);
-  }
-
-  int VisitMapContainer(MapContainer* container) {
-    return container->Release();
-  }
-
-  int VisitCMessage(CMessage* cmessage,
-                    const FieldDescriptor* field_descriptor) {
-    return ReleaseSubMessage(parent_, field_descriptor, cmessage);
-  }
-
-  CMessage* parent_;
-};
-
 int InternalReleaseFieldByDescriptor(
     CMessage* self,
-    const FieldDescriptor* field_descriptor,
-    PyObject* composite_field) {
-  return VisitCompositeField(
-      field_descriptor,
-      composite_field,
-      ReleaseChild(self));
+    const FieldDescriptor* field_descriptor) {
+  if (!field_descriptor->is_repeated() &&
+      field_descriptor->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
+    // Single scalars are not in any cache.
+    return 0;
+  }
+  std::vector<CMessage*> messages_to_release;
+  std::vector<ContainerBase*> containers_to_release;
+  if (self->child_submessages && field_descriptor->is_repeated() &&
+      field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+    for (const auto& child_item : *self->child_submessages) {
+      if (child_item.second->parent_field_descriptor == field_descriptor) {
+        messages_to_release.push_back(child_item.second);
+      }
+    }
+  }
+  if (self->composite_fields) {
+    CMessage::CompositeFieldsMap::iterator it =
+        self->composite_fields->find(field_descriptor);
+    if (it != self->composite_fields->end()) {
+      containers_to_release.push_back(it->second);
+    }
+  }
+
+  return InternalReparentFields(self, messages_to_release,
+                                containers_to_release);
 }
 
 PyObject* ClearFieldByDescriptor(
@@ -1864,37 +1639,35 @@
     arg = arg_in_oneof.get();
   }
 
-  if (self->composite_fields) {
-    CMessage::CompositeFieldsMap::iterator iterator =
-        self->composite_fields->find(field_descriptor);
-    if (iterator != self->composite_fields->end()) {
-      if (InternalReleaseFieldByDescriptor(self, field_descriptor,
-                                           iterator->second) < 0) {
-        return NULL;
-      }
-      Py_DECREF(iterator->second);
-      self->composite_fields->erase(iterator);
-    }
+  if (InternalReleaseFieldByDescriptor(self, field_descriptor) < 0) {
+    return NULL;
   }
   return ClearFieldByDescriptor(self, field_descriptor);
 }
 
 PyObject* Clear(CMessage* self) {
   AssureWritable(self);
-  if (ForEachCompositeField(self, ReleaseChild(self)) == -1)
-    return NULL;
-  if (self->composite_fields) {
-    for (CMessage::CompositeFieldsMap::iterator it =
-             self->composite_fields->begin();
-         it != self->composite_fields->end(); it++) {
-      Py_DECREF(it->second);
+  // Detach all current fields of this message
+  std::vector<CMessage*> messages_to_release;
+  std::vector<ContainerBase*> containers_to_release;
+  if (self->child_submessages) {
+    for (const auto& item : *self->child_submessages) {
+      messages_to_release.push_back(item.second);
     }
-    self->composite_fields->clear();
+  }
+  if (self->composite_fields) {
+    for (const auto& item : *self->composite_fields) {
+      containers_to_release.push_back(item.second);
+    }
+  }
+  if (InternalReparentFields(self, messages_to_release, containers_to_release) <
+      0) {
+    return NULL;
   }
   if (self->unknown_field_set) {
     unknown_fields::Clear(
         reinterpret_cast<PyUnknownFields*>(self->unknown_field_set));
-    Py_CLEAR(self->unknown_field_set);
+    self->unknown_field_set = nullptr;
   }
   self->message->Clear();
   Py_RETURN_NONE;
@@ -2075,7 +1848,7 @@
   self->message->MergeFrom(*other_message->message);
   // Child message might be lazily created before MergeFrom. Make sure they
   // are mutable at this point if child messages are really created.
-  if (ForEachCompositeField(self, FixupMessageAfterMerge(self)) == -1) {
+  if (FixupMessageAfterMerge(self) < 0) {
     return NULL;
   }
 
@@ -2168,7 +1941,7 @@
   bool success = self->message->MergePartialFromCodedStream(&input);
   // Child message might be lazily created before MergeFrom. Make sure they
   // are mutable at this point if child messages are really created.
-  if (ForEachCompositeField(self, FixupMessageAfterMerge(self)) == -1) {
+  if (FixupMessageAfterMerge(self) < 0) {
     return NULL;
   }
 
@@ -2458,7 +2231,7 @@
   return result;
 }
 
-PyObject* InternalGetSubMessage(
+CMessage* InternalGetSubMessage(
     CMessage* self, const FieldDescriptor* field_descriptor) {
   const Reflection* reflection = self->message->GetReflection();
   PyMessageFactory* factory = GetFactoryForMessage(self);
@@ -2467,7 +2240,7 @@
 
   CMessageClass* message_class = message_factory::GetOrCreateMessageClass(
       factory, field_descriptor->message_type());
-  ScopedPyObjectPtr message_class_handler(
+  ScopedPyObjectPtr message_class_owner(
       reinterpret_cast<PyObject*>(message_class));
   if (message_class == NULL) {
     return NULL;
@@ -2478,13 +2251,12 @@
     return NULL;
   }
 
-  cmsg->owner = self->owner;
+  Py_INCREF(self);
   cmsg->parent = self;
   cmsg->parent_field_descriptor = field_descriptor;
   cmsg->read_only = !reflection->HasField(*self->message, field_descriptor);
   cmsg->message = const_cast<Message*>(&sub_message);
-
-  return reinterpret_cast<PyObject*>(cmsg);
+  return cmsg;
 }
 
 int InternalSetNonOneofScalar(
@@ -2680,6 +2452,13 @@
   if (serialized == NULL) {
     return NULL;
   }
+#if PY_MAJOR_VERSION >= 3
+  // On Python 3, using encoding='latin1' is required for unpickling
+  // protos pickled by Python 2.
+  if (!PyBytes_Check(serialized)) {
+    serialized = PyUnicode_AsEncodedString(serialized, "latin1", NULL);
+  }
+#endif
   if (ScopedPyObjectPtr(ParseFromString(self, serialized)) == NULL) {
     return NULL;
   }
@@ -2719,8 +2498,9 @@
 static PyObject* UnknownFieldSet(CMessage* self) {
   if (self->unknown_field_set == NULL) {
     self->unknown_field_set = unknown_fields::NewPyUnknownFields(self);
+  } else {
+    Py_INCREF(self->unknown_field_set);
   }
-  Py_INCREF(self->unknown_field_set);
   return self->unknown_field_set;
 }
 
@@ -2805,17 +2585,23 @@
   { NULL, NULL}
 };
 
-static bool SetCompositeField(CMessage* self, const FieldDescriptor* field,
-                              PyObject* value) {
+bool SetCompositeField(CMessage* self, const FieldDescriptor* field,
+                       ContainerBase* value) {
   if (self->composite_fields == NULL) {
     self->composite_fields = new CMessage::CompositeFieldsMap();
   }
-  Py_INCREF(value);
-  Py_XDECREF((*self->composite_fields)[field]);
   (*self->composite_fields)[field] = value;
   return true;
 }
 
+bool SetSubmessage(CMessage* self, CMessage* submessage) {
+  if (self->child_submessages == NULL) {
+    self->child_submessages = new CMessage::SubMessagesMap();
+  }
+  (*self->child_submessages)[submessage->message] = submessage;
+  return true;
+}
+
 PyObject* GetAttr(PyObject* pself, PyObject* name) {
   CMessage* self = reinterpret_cast<CMessage*>(pself);
   PyObject* result = PyObject_GenericGetAttr(
@@ -2838,9 +2624,9 @@
     CMessage::CompositeFieldsMap::iterator it =
         self->composite_fields->find(field_descriptor);
     if (it != self->composite_fields->end()) {
-      PyObject* value = it->second;
+      ContainerBase* value = it->second;
       Py_INCREF(value);
-      return value;
+      return value->AsPyObject();
     }
   }
 
@@ -2852,8 +2638,13 @@
     return NULL;
   }
 
+  if (!field_descriptor->is_repeated() &&
+      field_descriptor->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
+    return InternalGetScalar(self->message, field_descriptor);
+  }
+
+  ContainerBase* py_container = nullptr;
   if (field_descriptor->is_map()) {
-    PyObject* py_container = NULL;
     const Descriptor* entry_type = field_descriptor->message_type();
     const FieldDescriptor* value_type = entry_type->FindFieldByName("value");
     if (value_type->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
@@ -2867,18 +2658,7 @@
     } else {
       py_container = NewScalarMapContainer(self, field_descriptor);
     }
-    if (py_container == NULL) {
-      return NULL;
-    }
-    if (!SetCompositeField(self, field_descriptor, py_container)) {
-      Py_DECREF(py_container);
-      return NULL;
-    }
-    return py_container;
-  }
-
-  if (field_descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
-    PyObject* py_container = NULL;
+  } else if (field_descriptor->is_repeated()) {
     if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
       CMessageClass* message_class = message_factory::GetMessageClass(
           GetFactoryForMessage(self), field_descriptor->message_type());
@@ -2888,32 +2668,24 @@
       py_container = repeated_composite_container::NewContainer(
           self, field_descriptor, message_class);
     } else {
-      py_container = repeated_scalar_container::NewContainer(
-          self, field_descriptor);
+      py_container =
+          repeated_scalar_container::NewContainer(self, field_descriptor);
     }
-    if (py_container == NULL) {
-      return NULL;
-    }
-    if (!SetCompositeField(self, field_descriptor, py_container)) {
-      Py_DECREF(py_container);
-      return NULL;
-    }
-    return py_container;
+  } else if (field_descriptor->cpp_type() ==
+             FieldDescriptor::CPPTYPE_MESSAGE) {
+    py_container = InternalGetSubMessage(self, field_descriptor);
+  } else {
+    PyErr_SetString(PyExc_SystemError, "Should never happen");
   }
 
-  if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-    PyObject* sub_message = InternalGetSubMessage(self, field_descriptor);
-    if (sub_message == NULL) {
-      return NULL;
-    }
-    if (!SetCompositeField(self, field_descriptor, sub_message)) {
-      Py_DECREF(sub_message);
-      return NULL;
-    }
-    return sub_message;
+  if (py_container == NULL) {
+    return NULL;
   }
-
-  return InternalGetScalar(self->message, field_descriptor);
+  if (!SetCompositeField(self, field_descriptor, py_container)) {
+    Py_DECREF(py_container);
+    return NULL;
+  }
+  return py_container->AsPyObject();
 }
 
 int SetFieldValue(CMessage* self, const FieldDescriptor* field_descriptor,
@@ -2941,8 +2713,82 @@
     return InternalSetScalar(self, field_descriptor, value);
   }
 }
+
 }  // namespace cmessage
 
+// All containers which are not messages:
+// - Make a new parent message
+// - Copy the field
+// - return the field.
+PyObject* ContainerBase::DeepCopy() {
+  CMessage* new_parent =
+      cmessage::NewEmptyMessage(this->parent->GetMessageClass());
+  new_parent->message = this->parent->message->New();
+
+  // Copy the map field into the new message.
+  this->parent->message->GetReflection()->SwapFields(
+      this->parent->message, new_parent->message,
+      {this->parent_field_descriptor});
+  this->parent->message->MergeFrom(*new_parent->message);
+
+  PyObject* result =
+      cmessage::GetFieldValue(new_parent, this->parent_field_descriptor);
+  Py_DECREF(new_parent);
+  return result;
+}
+
+void ContainerBase::RemoveFromParentCache() {
+  CMessage* parent = this->parent;
+  if (parent) {
+    if (parent->composite_fields)
+      parent->composite_fields->erase(this->parent_field_descriptor);
+    Py_CLEAR(parent);
+  }
+}
+
+CMessage* CMessage::BuildSubMessageFromPointer(
+    const FieldDescriptor* field_descriptor, Message* sub_message,
+    CMessageClass* message_class) {
+  if (!this->child_submessages) {
+    this->child_submessages = new CMessage::SubMessagesMap();
+  }
+  CMessage* cmsg = FindPtrOrNull(
+      *this->child_submessages, sub_message);
+  if (cmsg) {
+    Py_INCREF(cmsg);
+  } else {
+    cmsg = cmessage::NewEmptyMessage(message_class);
+
+    if (cmsg == NULL) {
+      return NULL;
+    }
+    cmsg->message = sub_message;
+    Py_INCREF(this);
+    cmsg->parent = this;
+    cmsg->parent_field_descriptor = field_descriptor;
+    cmessage::SetSubmessage(this, cmsg);
+  }
+  return cmsg;
+}
+
+CMessage* CMessage::MaybeReleaseSubMessage(Message* sub_message) {
+  if (!this->child_submessages) {
+    return nullptr;
+  }
+  CMessage* released = FindPtrOrNull(
+      *this->child_submessages, sub_message);
+  if (!released) {
+    return nullptr;
+  }
+  // The target message will now own its content.
+  Py_CLEAR(released->parent);
+  released->parent_field_descriptor = nullptr;
+  released->read_only = false;
+  // Delete it from the cache.
+  this->child_submessages->erase(sub_message);
+  return released;
+}
+
 static CMessageClass _CMessage_Type = { { {
   PyVarObject_HEAD_INIT(&_CMessageClass_Type, 0)
   FULL_MODULE_NAME ".CMessage",        // tp_name
@@ -3023,10 +2869,11 @@
     PyErr_SetString(PyExc_TypeError, "Not a Message instance");
     return NULL;
   }
-
-
   CMessage* cmsg = reinterpret_cast<CMessage*>(msg);
-  if (cmsg->composite_fields && !cmsg->composite_fields->empty()) {
+
+
+  if ((cmsg->composite_fields && !cmsg->composite_fields->empty()) ||
+      (cmsg->child_submessages && !cmsg->child_submessages->empty())) {
     // There is currently no way of accurately syncing arbitrary changes to
     // the underlying C++ message back to the CMessage (e.g. removed repeated
     // composite containers). We only allow direct mutation of the underlying
@@ -3040,6 +2887,34 @@
   return cmsg->message;
 }
 
+PyObject* PyMessage_NewMessageOwnedExternally(Message* message,
+                                              PyObject* message_factory) {
+  if (message_factory) {
+    PyErr_SetString(PyExc_NotImplementedError,
+                    "Default message_factory=NULL is the only supported value");
+    return NULL;
+  }
+  if (message->GetReflection()->GetMessageFactory() !=
+      MessageFactory::generated_factory()) {
+    PyErr_SetString(PyExc_TypeError,
+                    "Message pointer was not created from the default factory");
+    return NULL;
+  }
+
+  CMessageClass* message_class = message_factory::GetOrCreateMessageClass(
+      GetDefaultDescriptorPool()->py_message_factory, message->GetDescriptor());
+
+  CMessage* self = cmessage::NewEmptyMessage(message_class);
+  if (self == NULL) {
+    return NULL;
+  }
+  Py_DECREF(message_class);
+  self->message = message;
+  Py_INCREF(Py_None);
+  self->parent = reinterpret_cast<CMessage*>(Py_None);
+  return self->AsPyObject();
+}
+
 void InitGlobals() {
   // TODO(gps): Check all return values in this function for NULL and propagate
   // the error (MemoryError) on up to result in an import failure.  These should
@@ -3168,6 +3043,11 @@
   PyModule_AddObject(
       m, "ExtensionDict",
       reinterpret_cast<PyObject*>(&ExtensionDict_Type));
+  if (PyType_Ready(&ExtensionIterator_Type) < 0) {
+    return false;
+  }
+  PyModule_AddObject(m, "ExtensionIterator",
+                     reinterpret_cast<PyObject*>(&ExtensionIterator_Type));
 
   // Expose the DescriptorPool used to hold all descriptors added from generated
   // pb2.py files.
diff --git a/python/google/protobuf/pyext/message.h b/python/google/protobuf/pyext/message.h
index 64aafaf..55be297 100644
--- a/python/google/protobuf/pyext/message.h
+++ b/python/google/protobuf/pyext/message.h
@@ -41,7 +41,6 @@
 #include <unordered_map>
 
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/pyext/thread_unsafe_shared_ptr.h>
 
 namespace google {
 namespace protobuf {
@@ -57,39 +56,51 @@
 
 struct ExtensionDict;
 struct PyMessageFactory;
+struct CMessageClass;
 
-typedef struct CMessage {
+// Most of the complexity of the Message class comes from the "Release"
+// behavior:
+//
+// When a field is cleared, it is only detached from its message. Existing
+// references to submessages, to repeated container etc. won't see any change,
+// as if the data was effectively managed by these containers.
+//
+// ExtensionDicts and UnknownFields containers do NOT follow this rule. They
+// don't store any data, and always refer to their parent message.
+
+struct ContainerBase {
   PyObject_HEAD;
 
-  // This is the top-level C++ Message object that owns the whole
-  // proto tree.  Every Python CMessage holds a reference to it in
-  // order to keep it alive as long as there's a Python object that
-  // references any part of the tree.
-
-  typedef ThreadUnsafeSharedPtr<Message> OwnerRef;
-  OwnerRef owner;
-
-  // Weak reference to a parent CMessage object. This is NULL for any top-level
-  // message and is set for any child message (i.e. a child submessage or a
-  // part of a repeated composite field).
+  // Strong reference to a parent message object. For a CMessage there are three
+  // cases:
+  // - For a top-level message, this pointer is NULL.
+  // - For a sub-message, this points to the parent message.
+  // - For a message managed externally, this is a owned reference to Py_None.
   //
-  // Used to make sure all ancestors are also mutable when first modifying
-  // a child submessage (in other words, turning a default message instance
-  // into a mutable one).
-  //
-  // If a submessage is released (becomes a new top-level message), this field
-  // MUST be set to NULL. The parent may get deallocated and further attempts
-  // to use this pointer will result in a crash.
+  // For all other types: repeated containers, maps, it always point to a
+  // valid parent CMessage.
   struct CMessage* parent;
 
-  // Pointer to the parent's descriptor that describes this submessage.
-  // Used together with the parent's message when making a default message
-  // instance mutable.
-  // The pointer is owned by the global DescriptorPool.
+  // If this object belongs to a parent message, describes which field it comes
+  // from.
+  // The pointer is owned by the DescriptorPool (which is kept alive
+  // through the message's Python class)
   const FieldDescriptor* parent_field_descriptor;
 
-  // Pointer to the C++ Message object for this CMessage.  The
-  // CMessage does not own this pointer.
+  PyObject* AsPyObject() { return reinterpret_cast<PyObject*>(this); }
+
+  // The Three methods below are only used by Repeated containers, and Maps.
+
+  // This implementation works for all containers which have a parent.
+  PyObject* DeepCopy();
+  // Delete this container object from its parent. Does not work for messages.
+  void RemoveFromParentCache();
+};
+
+typedef struct CMessage : public ContainerBase {
+  // Pointer to the C++ Message object for this CMessage.
+  // - If this object has no parent, we own this pointer.
+  // - If this object has a parent message, the parent owns this pointer.
   Message* message;
 
   // Indicates this submessage is pointing to a default instance of a message.
@@ -97,23 +108,37 @@
   // made writable, at which point this field is set to false.
   bool read_only;
 
-  // A mapping indexed by field, containing CMessage,
-  // RepeatedCompositeContainer, and RepeatedScalarContainer
-  // objects. Used as a cache to make sure we don't have to make a
-  // Python wrapper for the C++ Message objects on every access, or
-  // deal with the synchronization nightmare that could create.
-  // Also cache extension fields.
-  // The FieldDescriptor is owned by the message's pool; PyObject references
-  // are owned.
-  typedef std::unordered_map<const FieldDescriptor*, PyObject*>
+  // A mapping indexed by field, containing weak references to contained objects
+  // which need to implement the "Release" mechanism:
+  // direct submessages, RepeatedCompositeContainer, RepeatedScalarContainer
+  // and MapContainer.
+  typedef std::unordered_map<const FieldDescriptor*, ContainerBase*>
       CompositeFieldsMap;
   CompositeFieldsMap* composite_fields;
 
+  // A mapping containing weak references to indirect child messages, accessed
+  // through containers: repeated messages, and values of message maps.
+  // This avoid the creation of similar maps in each of those containers.
+  typedef std::unordered_map<const Message*, CMessage*> SubMessagesMap;
+  SubMessagesMap* child_submessages;
+
   // A reference to PyUnknownFields.
   PyObject* unknown_field_set;
 
   // Implements the "weakref" protocol for this object.
   PyObject* weakreflist;
+
+  // Return a *borrowed* reference to the message class.
+  CMessageClass* GetMessageClass() {
+    return reinterpret_cast<CMessageClass*>(Py_TYPE(this));
+  }
+
+  // For container containing messages, return a Python object for the given
+  // pointer to a message.
+  CMessage* BuildSubMessageFromPointer(const FieldDescriptor* field_descriptor,
+                                       Message* sub_message,
+                                       CMessageClass* message_class);
+  CMessage* MaybeReleaseSubMessage(Message* sub_message);
 } CMessage;
 
 // The (meta) type of all Messages classes.
@@ -161,21 +186,16 @@
 // submessage as the result is cached in composite_fields.
 //
 // Corresponds to reflection api method GetMessage.
-PyObject* InternalGetSubMessage(
+CMessage* InternalGetSubMessage(
     CMessage* self, const FieldDescriptor* field_descriptor);
 
-// Deletes a range of C++ submessages in a repeated field (following a
+// Deletes a range of items in a repeated field (following a
 // removal in a RepeatedCompositeContainer).
 //
-// Releases submessages to the provided cmessage_list if it is not NULL rather
-// than just removing them from the underlying proto. This cmessage_list must
-// have a CMessage for each underlying submessage. The CMessages referred to
-// by slice will be removed from cmessage_list by this function.
-//
 // Corresponds to reflection api method RemoveLast.
-int InternalDeleteRepeatedField(Message* message,
-                                const FieldDescriptor* field_descriptor,
-                                PyObject* slice, PyObject* cmessage_list);
+int DeleteRepeatedField(CMessage* self,
+                        const FieldDescriptor* field_descriptor,
+                        PyObject* slice);
 
 // Sets the specified scalar value to the message.
 int InternalSetScalar(CMessage* self,
@@ -193,6 +213,11 @@
 PyObject* InternalGetScalar(const Message* message,
                             const FieldDescriptor* field_descriptor);
 
+bool SetCompositeField(CMessage* self, const FieldDescriptor* field,
+                       ContainerBase* value);
+
+bool SetSubmessage(CMessage* self, CMessage* submessage);
+
 // Clears the message, removing all contained data. Extension dictionary and
 // submessages are released first if there are remaining external references.
 //
@@ -248,11 +273,6 @@
 
 PyObject* FindInitializationErrors(CMessage* self);
 
-// Set the owner field of self and any children of self, recursively.
-// Used when self is being released and thus has a new owner (the
-// released Message.)
-int SetOwner(CMessage* self, const CMessage::OwnerRef& new_owner);
-
 int AssureWritable(CMessage* self);
 
 // Returns the message factory for the given message.
@@ -344,6 +364,8 @@
 
 const Message* PyMessage_GetMessagePointer(PyObject* msg);
 Message* PyMessage_GetMutableMessagePointer(PyObject* msg);
+PyObject* PyMessage_NewMessageOwnedExternally(Message* message,
+                                              PyObject* message_factory);
 
 bool InitProto2MessageModule(PyObject *m);
 
diff --git a/python/google/protobuf/pyext/repeated_composite_container.cc b/python/google/protobuf/pyext/repeated_composite_container.cc
index d8088a1..4188b5f 100644
--- a/python/google/protobuf/pyext/repeated_composite_container.cc
+++ b/python/google/protobuf/pyext/repeated_composite_container.cc
@@ -46,6 +46,7 @@
 #include <google/protobuf/pyext/message_factory.h>
 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
 #include <google/protobuf/reflection.h>
+#include <google/protobuf/stubs/map_util.h>
 
 #if PY_MAJOR_VERSION >= 3
   #define PyInt_Check PyLong_Check
@@ -59,22 +60,6 @@
 
 namespace repeated_composite_container {
 
-// TODO(tibell): We might also want to check:
-//   GOOGLE_CHECK_NOTNULL((self)->owner.get());
-#define GOOGLE_CHECK_ATTACHED(self)                           \
-  do {                                                 \
-    GOOGLE_CHECK_NOTNULL((self)->message);                 \
-    GOOGLE_CHECK_NOTNULL((self)->parent_field_descriptor); \
-  } while (0);
-
-#define GOOGLE_CHECK_RELEASED(self)             \
-  do {                                   \
-    GOOGLE_CHECK((self)->owner.get() == NULL);  \
-    GOOGLE_CHECK((self)->message == NULL);      \
-    GOOGLE_CHECK((self)->parent_field_descriptor == NULL); \
-    GOOGLE_CHECK((self)->parent == NULL);       \
-  } while (0);
-
 // ---------------------------------------------------------------------
 // len()
 
@@ -82,75 +67,28 @@
   RepeatedCompositeContainer* self =
       reinterpret_cast<RepeatedCompositeContainer*>(pself);
 
-  Message* message = self->message;
-  if (message != NULL) {
-    return message->GetReflection()->FieldSize(*message,
-                                               self->parent_field_descriptor);
-  } else {
-    // The container has been released (i.e. by a call to Clear() or
-    // ClearField() on the parent) and thus there's no message.
-    return PyList_GET_SIZE(self->child_messages);
-  }
-}
-
-// Returns 0 if successful; returns -1 and sets an exception if
-// unsuccessful.
-static int UpdateChildMessages(RepeatedCompositeContainer* self) {
-  if (self->message == NULL)
-    return 0;
-
-  // A MergeFrom on a parent message could have caused extra messages to be
-  // added in the underlying protobuf so add them to our list. They can never
-  // be removed in such a way so there's no need to worry about that.
-  Py_ssize_t message_length = Length(reinterpret_cast<PyObject*>(self));
-  Py_ssize_t child_length = PyList_GET_SIZE(self->child_messages);
-  Message* message = self->message;
-  const Reflection* reflection = message->GetReflection();
-  for (Py_ssize_t i = child_length; i < message_length; ++i) {
-    const Message& sub_message = reflection->GetRepeatedMessage(
-        *(self->message), self->parent_field_descriptor, i);
-    CMessage* cmsg = cmessage::NewEmptyMessage(self->child_message_class);
-    ScopedPyObjectPtr py_cmsg(reinterpret_cast<PyObject*>(cmsg));
-    if (cmsg == NULL) {
-      return -1;
-    }
-    cmsg->owner = self->owner;
-    cmsg->message = const_cast<Message*>(&sub_message);
-    cmsg->parent = self->parent;
-    if (PyList_Append(self->child_messages, py_cmsg.get()) < 0) {
-      return -1;
-    }
-  }
-  return 0;
+  Message* message = self->parent->message;
+  return message->GetReflection()->FieldSize(*message,
+                                             self->parent_field_descriptor);
 }
 
 // ---------------------------------------------------------------------
 // add()
 
-static PyObject* AddToAttached(RepeatedCompositeContainer* self,
-                               PyObject* args,
-                               PyObject* kwargs) {
-  GOOGLE_CHECK_ATTACHED(self);
-
-  if (UpdateChildMessages(self) < 0) {
-    return NULL;
-  }
+PyObject* Add(RepeatedCompositeContainer* self, PyObject* args,
+              PyObject* kwargs) {
   if (cmessage::AssureWritable(self->parent) == -1)
     return NULL;
-  Message* message = self->message;
+  Message* message = self->parent->message;
 
   Message* sub_message =
       message->GetReflection()->AddMessage(
           message,
           self->parent_field_descriptor,
           self->child_message_class->py_message_factory->message_factory);
-  CMessage* cmsg = cmessage::NewEmptyMessage(self->child_message_class);
-  if (cmsg == NULL)
-    return NULL;
+  CMessage* cmsg = self->parent->BuildSubMessageFromPointer(
+      self->parent_field_descriptor, sub_message, self->child_message_class);
 
-  cmsg->owner = self->owner;
-  cmsg->message = sub_message;
-  cmsg->parent = self->parent;
   if (cmessage::InitAttributes(cmsg, args, kwargs) < 0) {
     message->GetReflection()->RemoveLast(
         message, self->parent_field_descriptor);
@@ -158,38 +96,7 @@
     return NULL;
   }
 
-  PyObject* py_cmsg = reinterpret_cast<PyObject*>(cmsg);
-  return py_cmsg;
-}
-
-static PyObject* AddToReleased(RepeatedCompositeContainer* self,
-                               PyObject* args,
-                               PyObject* kwargs) {
-  GOOGLE_CHECK_RELEASED(self);
-
-  // Create a new Message detached from the rest.
-  PyObject* py_cmsg = PyEval_CallObjectWithKeywords(
-      self->child_message_class->AsPyObject(), args, kwargs);
-  return py_cmsg;
-}
-
-PyObject* Add(RepeatedCompositeContainer* self,
-              PyObject* args,
-              PyObject* kwargs) {
-  PyObject* py_cmsg;
-  if (self->message == nullptr)
-    py_cmsg = AddToReleased(self, args, kwargs);
-  else
-    py_cmsg = AddToAttached(self, args, kwargs);
-
-  if (py_cmsg == NULL)
-    return NULL;
-
-  if (PyList_Append(self->child_messages, py_cmsg) < 0) {
-    Py_DECREF(py_cmsg);
-    return NULL;
-  }
-  return py_cmsg;
+  return cmsg->AsPyObject();
 }
 
 static PyObject* AddMethod(PyObject* self, PyObject* args, PyObject* kwargs) {
@@ -201,31 +108,17 @@
 
 static PyObject* AddMessage(RepeatedCompositeContainer* self, PyObject* value) {
   cmessage::AssureWritable(self->parent);
-  if (UpdateChildMessages(self) < 0) {
-    return nullptr;
-  }
-
   PyObject* py_cmsg;
-  if (self->message == nullptr) {
-    py_cmsg = AddToReleased(self, nullptr, nullptr);
-    if (py_cmsg == nullptr) return nullptr;
-    CMessage* cmsg = reinterpret_cast<CMessage*>(py_cmsg);
-    if (ScopedPyObjectPtr(cmessage::MergeFrom(cmsg, value)) == nullptr) {
-      Py_DECREF(cmsg);
-      return nullptr;
-    }
-  } else {
-    Message* message = self->message;
-    const Reflection* reflection = message->GetReflection();
-    py_cmsg = AddToAttached(self, nullptr, nullptr);
-    if (py_cmsg == nullptr) return nullptr;
-    CMessage* cmsg = reinterpret_cast<CMessage*>(py_cmsg);
-    if (ScopedPyObjectPtr(cmessage::MergeFrom(cmsg, value)) == nullptr) {
-      reflection->RemoveLast(
-          message, self->parent_field_descriptor);
-      Py_DECREF(cmsg);
-      return nullptr;
-    }
+  Message* message = self->parent->message;
+  const Reflection* reflection = message->GetReflection();
+  py_cmsg = Add(self, nullptr, nullptr);
+  if (py_cmsg == nullptr) return nullptr;
+  CMessage* cmsg = reinterpret_cast<CMessage*>(py_cmsg);
+  if (ScopedPyObjectPtr(cmessage::MergeFrom(cmsg, value)) == nullptr) {
+    reflection->RemoveLast(
+        message, self->parent_field_descriptor);
+    Py_DECREF(cmsg);
+    return nullptr;
   }
   return py_cmsg;
 }
@@ -238,10 +131,6 @@
     return nullptr;
   }
 
-  if (PyList_Append(self->child_messages, py_cmsg.get()) < 0) {
-    return nullptr;
-  }
-
   Py_RETURN_NONE;
 }
 
@@ -262,23 +151,18 @@
     return nullptr;
   }
 
-  if (self->message != nullptr) {
-    // Swap the element to right position.
-    Message* message = self->message;
-    const Reflection* reflection = message->GetReflection();
-    const FieldDescriptor* field_descriptor = self->parent_field_descriptor;
-    Py_ssize_t length = reflection->FieldSize(*message, field_descriptor) - 1;
-    Py_ssize_t end_index = index;
-    if (end_index < 0) end_index += length;
-    if (end_index < 0) end_index = 0;
-    for (Py_ssize_t i = length; i > end_index; i --) {
-      reflection->SwapElements(message, field_descriptor, i, i - 1);
-    }
+  // Swap the element to right position.
+  Message* message = self->parent->message;
+  const Reflection* reflection = message->GetReflection();
+  const FieldDescriptor* field_descriptor = self->parent_field_descriptor;
+  Py_ssize_t length = reflection->FieldSize(*message, field_descriptor) - 1;
+  Py_ssize_t end_index = index;
+  if (end_index < 0) end_index += length;
+  if (end_index < 0) end_index = 0;
+  for (Py_ssize_t i = length; i > end_index; i --) {
+    reflection->SwapElements(message, field_descriptor, i, i - 1);
   }
 
-  if (PyList_Insert(self->child_messages, index, py_cmsg.get()) < 0) {
-    return nullptr;
-  }
   Py_RETURN_NONE;
 }
 
@@ -287,9 +171,6 @@
 
 PyObject* Extend(RepeatedCompositeContainer* self, PyObject* value) {
   cmessage::AssureWritable(self->parent);
-  if (UpdateChildMessages(self) < 0) {
-    return NULL;
-  }
   ScopedPyObjectPtr iter(PyObject_GetIter(value));
   if (iter == NULL) {
     PyErr_SetString(PyExc_TypeError, "Value must be iterable");
@@ -322,9 +203,6 @@
 }
 
 PyObject* MergeFrom(RepeatedCompositeContainer* self, PyObject* other) {
-  if (UpdateChildMessages(self) < 0) {
-    return NULL;
-  }
   return Extend(self, other);
 }
 
@@ -332,13 +210,70 @@
   return MergeFrom(reinterpret_cast<RepeatedCompositeContainer*>(self), other);
 }
 
-PyObject* Subscript(RepeatedCompositeContainer* self, PyObject* slice) {
-  if (UpdateChildMessages(self) < 0) {
+// This function does not check the bounds.
+static PyObject* GetItem(RepeatedCompositeContainer* self, Py_ssize_t index,
+                         Py_ssize_t length = -1) {
+  if (length == -1) {
+    Message* message = self->parent->message;
+    const Reflection* reflection = message->GetReflection();
+    length = reflection->FieldSize(*message, self->parent_field_descriptor);
+  }
+  if (index < 0 || index >= length) {
+    PyErr_Format(PyExc_IndexError, "list index (%zd) out of range", index);
     return NULL;
   }
-  // Just forward the call to the subscript-handling function of the
-  // list containing the child messages.
-  return PyObject_GetItem(self->child_messages, slice);
+  Message* message = self->parent->message;
+  Message* sub_message = message->GetReflection()->MutableRepeatedMessage(
+      message, self->parent_field_descriptor, index);
+  return self->parent
+      ->BuildSubMessageFromPointer(self->parent_field_descriptor, sub_message,
+                                   self->child_message_class)
+      ->AsPyObject();
+}
+
+PyObject* Subscript(RepeatedCompositeContainer* self, PyObject* item) {
+  Message* message = self->parent->message;
+  const Reflection* reflection = message->GetReflection();
+  Py_ssize_t length =
+      reflection->FieldSize(*message, self->parent_field_descriptor);
+
+  if (PyIndex_Check(item)) {
+    Py_ssize_t index;
+    index = PyNumber_AsSsize_t(item, PyExc_IndexError);
+    if (index == -1 && PyErr_Occurred()) return NULL;
+    if (index < 0) index += length;
+    return GetItem(self, index, length);
+  } else if (PySlice_Check(item)) {
+    Py_ssize_t from, to, step, slicelength, cur, i;
+    PyObject* result;
+
+#if PY_MAJOR_VERSION >= 3
+    if (PySlice_GetIndicesEx(item,
+                             length, &from, &to, &step, &slicelength) == -1) {
+#else
+    if (PySlice_GetIndicesEx(reinterpret_cast<PySliceObject*>(item),
+                             length, &from, &to, &step, &slicelength) == -1) {
+#endif
+      return NULL;
+    }
+
+    if (slicelength <= 0) {
+      return PyList_New(0);
+    } else {
+      result = PyList_New(slicelength);
+      if (!result) return NULL;
+
+      for (cur = from, i = 0; i < slicelength; cur += step, i++) {
+        PyList_SET_ITEM(result, i, GetItem(self, cur, length));
+      }
+
+      return result;
+    }
+  } else {
+    PyErr_Format(PyExc_TypeError, "indices must be integers, not %.200s",
+                 item->ob_type->tp_name);
+    return NULL;
+  }
 }
 
 static PyObject* SubscriptMethod(PyObject* self, PyObject* slice) {
@@ -348,49 +283,13 @@
 int AssignSubscript(RepeatedCompositeContainer* self,
                     PyObject* slice,
                     PyObject* value) {
-  if (UpdateChildMessages(self) < 0) {
-    return -1;
-  }
   if (value != NULL) {
     PyErr_SetString(PyExc_TypeError, "does not support assignment");
     return -1;
   }
 
-  // Delete from the underlying Message, if any.
-  if (self->message != nullptr) {
-    if (cmessage::InternalDeleteRepeatedField(self->message,
-                                              self->parent_field_descriptor,
-                                              slice,
-                                              self->child_messages) < 0) {
-      return -1;
-    }
-  } else {
-    Py_ssize_t from;
-    Py_ssize_t to;
-    Py_ssize_t step;
-    Py_ssize_t length = Length(reinterpret_cast<PyObject*>(self));
-    Py_ssize_t slicelength;
-    if (PySlice_Check(slice)) {
-#if PY_MAJOR_VERSION >= 3
-      if (PySlice_GetIndicesEx(slice,
-                               length, &from, &to, &step, &slicelength) == -1) {
-#else
-      if (PySlice_GetIndicesEx(reinterpret_cast<PySliceObject*>(slice),
-                               length, &from, &to, &step, &slicelength) == -1) {
-#endif
-        return -1;
-      }
-      return PySequence_DelSlice(self->child_messages, from, to);
-    } else if (PyInt_Check(slice) || PyLong_Check(slice)) {
-      from = to = PyLong_AsLong(slice);
-      if (from < 0) {
-        from = to = length + from;
-      }
-      return PySequence_DelItem(self->child_messages, from);
-    }
-  }
-
-  return 0;
+  return cmessage::DeleteRepeatedField(self->parent,
+                                       self->parent_field_descriptor, slice);
 }
 
 static int AssignSubscriptMethod(PyObject* self, PyObject* slice,
@@ -402,28 +301,33 @@
 static PyObject* Remove(PyObject* pself, PyObject* value) {
   RepeatedCompositeContainer* self =
       reinterpret_cast<RepeatedCompositeContainer*>(pself);
+  Py_ssize_t len = Length(reinterpret_cast<PyObject*>(self));
 
-  if (UpdateChildMessages(self) < 0) {
-    return NULL;
+  for (Py_ssize_t i = 0; i < len; i++) {
+    ScopedPyObjectPtr item(GetItem(self, i, len));
+    if (item == NULL) {
+      return NULL;
+    }
+    int result = PyObject_RichCompareBool(item.get(), value, Py_EQ);
+    if (result < 0) {
+      return NULL;
+    }
+    if (result) {
+      ScopedPyObjectPtr py_index(PyLong_FromSsize_t(i));
+      if (AssignSubscript(self, py_index.get(), NULL) < 0) {
+        return NULL;
+      }
+      Py_RETURN_NONE;
+    }
   }
-  Py_ssize_t index = PySequence_Index(self->child_messages, value);
-  if (index == -1) {
-    return NULL;
-  }
-  ScopedPyObjectPtr py_index(PyLong_FromLong(index));
-  if (AssignSubscript(self, py_index.get(), NULL) < 0) {
-    return NULL;
-  }
-  Py_RETURN_NONE;
+  PyErr_SetString(PyExc_ValueError, "Item to delete not in list");
+  return NULL;
 }
 
 static PyObject* RichCompare(PyObject* pself, PyObject* other, int opid) {
   RepeatedCompositeContainer* self =
       reinterpret_cast<RepeatedCompositeContainer*>(pself);
 
-  if (UpdateChildMessages(self) < 0) {
-    return NULL;
-  }
   if (!PyObject_TypeCheck(other, &RepeatedCompositeContainer_Type)) {
     PyErr_SetString(PyExc_TypeError,
                     "Can only compare repeated composite fields "
@@ -469,8 +373,9 @@
 // ---------------------------------------------------------------------
 // sort()
 
-static void ReorderAttached(RepeatedCompositeContainer* self) {
-  Message* message = self->message;
+static void ReorderAttached(RepeatedCompositeContainer* self,
+                            PyObject* child_list) {
+  Message* message = self->parent->message;
   const Reflection* reflection = message->GetReflection();
   const FieldDescriptor* descriptor = self->parent_field_descriptor;
   const Py_ssize_t length = Length(reinterpret_cast<PyObject*>(self));
@@ -483,7 +388,7 @@
 
   for (Py_ssize_t i = 0; i < length; ++i) {
     CMessage* py_cmsg = reinterpret_cast<CMessage*>(
-        PyList_GET_ITEM(self->child_messages, i));
+        PyList_GET_ITEM(child_list, i));
     reflection->AddAllocatedMessage(message, descriptor, py_cmsg->message);
   }
 }
@@ -493,14 +398,17 @@
 static int SortPythonMessages(RepeatedCompositeContainer* self,
                                PyObject* args,
                                PyObject* kwds) {
-  ScopedPyObjectPtr m(PyObject_GetAttrString(self->child_messages, "sort"));
+  ScopedPyObjectPtr child_list(
+      PySequence_List(reinterpret_cast<PyObject*>(self)));
+  if (child_list == NULL) {
+    return -1;
+  }
+  ScopedPyObjectPtr m(PyObject_GetAttrString(child_list.get(), "sort"));
   if (m == NULL)
     return -1;
   if (ScopedPyObjectPtr(PyObject_Call(m.get(), args, kwds)) == NULL)
     return -1;
-  if (self->message != NULL) {
-    ReorderAttached(self);
-  }
+  ReorderAttached(self, child_list.get());
   return 0;
 }
 
@@ -520,9 +428,6 @@
     }
   }
 
-  if (UpdateChildMessages(self) < 0) {
-    return NULL;
-  }
   if (SortPythonMessages(self, args, kwds) < 0) {
     return NULL;
   }
@@ -534,20 +439,7 @@
 static PyObject* Item(PyObject* pself, Py_ssize_t index) {
   RepeatedCompositeContainer* self =
       reinterpret_cast<RepeatedCompositeContainer*>(pself);
-
-  if (UpdateChildMessages(self) < 0) {
-    return NULL;
-  }
-  Py_ssize_t length = Length(pself);
-  if (index < 0) {
-    index = length + index;
-  }
-  PyObject* item = PyList_GetItem(self->child_messages, index);
-  if (item == NULL) {
-    return NULL;
-  }
-  Py_INCREF(item);
-  return item;
+  return GetItem(self, index);
 }
 
 static PyObject* Pop(PyObject* pself, PyObject* args) {
@@ -558,9 +450,10 @@
   if (!PyArg_ParseTuple(args, "|n", &index)) {
     return NULL;
   }
-  PyObject* item = Item(pself, index);
+  Py_ssize_t length = Length(pself);
+  if (index < 0) index += length;
+  PyObject* item = GetItem(self, index, length);
   if (item == NULL) {
-    PyErr_Format(PyExc_IndexError, "list index (%zd) out of range", index);
     return NULL;
   }
   ScopedPyObjectPtr py_index(PyLong_FromSsize_t(index));
@@ -570,106 +463,15 @@
   return item;
 }
 
-// Release field of parent message and transfer the ownership to target.
-void ReleaseLastTo(Message* message,
-                   const FieldDescriptor* field,
-                   CMessage* target) {
-  GOOGLE_CHECK(message != nullptr);
-  GOOGLE_CHECK(field != nullptr);
-  GOOGLE_CHECK(target != nullptr);
-
-  CMessage::OwnerRef released_message(
-      message->GetReflection()->ReleaseLast(message, field));
-  // TODO(tibell): Deal with proto1.
-
-  target->parent = NULL;
-  target->parent_field_descriptor = NULL;
-  target->message = released_message.get();
-  target->read_only = false;
-  cmessage::SetOwner(target, released_message);
-}
-
-// Called to release a container using
-// ClearField('container_field_name') on the parent.
-int Release(RepeatedCompositeContainer* self) {
-  if (UpdateChildMessages(self) < 0) {
-    PyErr_WriteUnraisable(PyBytes_FromString("Failed to update released "
-                                             "messages"));
-    return -1;
-  }
-
-  Message* message = self->message;
-  const FieldDescriptor* field = self->parent_field_descriptor;
-
-  // The reflection API only lets us release the last message in a
-  // repeated field.  Therefore we iterate through the children
-  // starting with the last one.
-  const Py_ssize_t size = PyList_GET_SIZE(self->child_messages);
-  GOOGLE_DCHECK_EQ(size, message->GetReflection()->FieldSize(*message, field));
-  for (Py_ssize_t i = size - 1; i >= 0; --i) {
-    CMessage* child_cmessage = reinterpret_cast<CMessage*>(
-        PyList_GET_ITEM(self->child_messages, i));
-    ReleaseLastTo(message, field, child_cmessage);
-  }
-
-  // Detach from containing message.
-  self->parent = NULL;
-  self->parent_field_descriptor = NULL;
-  self->message = NULL;
-  self->owner.reset();
-
-  return 0;
-}
-
 PyObject* DeepCopy(PyObject* pself, PyObject* arg) {
-  RepeatedCompositeContainer* self =
-      reinterpret_cast<RepeatedCompositeContainer*>(pself);
-
-  ScopedPyObjectPtr cloneObj(
-      PyType_GenericAlloc(&RepeatedCompositeContainer_Type, 0));
-  if (cloneObj == NULL) {
-    return NULL;
-  }
-  RepeatedCompositeContainer* clone =
-      reinterpret_cast<RepeatedCompositeContainer*>(cloneObj.get());
-
-  Message* new_message = self->message->New();
-  clone->parent = NULL;
-  clone->parent_field_descriptor = self->parent_field_descriptor;
-  clone->message = new_message;
-  clone->owner.reset(new_message);
-  Py_INCREF(self->child_message_class);
-  clone->child_message_class = self->child_message_class;
-  clone->child_messages = PyList_New(0);
-
-  new_message->GetReflection()
-      ->GetMutableRepeatedFieldRef<Message>(new_message,
-                                            self->parent_field_descriptor)
-      .MergeFrom(self->message->GetReflection()->GetRepeatedFieldRef<Message>(
-          *self->message, self->parent_field_descriptor));
-  return cloneObj.release();
-}
-
-int SetOwner(RepeatedCompositeContainer* self,
-             const CMessage::OwnerRef& new_owner) {
-  GOOGLE_CHECK_ATTACHED(self);
-
-  self->owner = new_owner;
-  const Py_ssize_t n = PyList_GET_SIZE(self->child_messages);
-  for (Py_ssize_t i = 0; i < n; ++i) {
-    PyObject* msg = PyList_GET_ITEM(self->child_messages, i);
-    if (cmessage::SetOwner(reinterpret_cast<CMessage*>(msg), new_owner) == -1) {
-      return -1;
-    }
-  }
-  return 0;
+  return reinterpret_cast<RepeatedCompositeContainer*>(pself)->DeepCopy();
 }
 
 // The private constructor of RepeatedCompositeContainer objects.
-PyObject *NewContainer(
+RepeatedCompositeContainer *NewContainer(
     CMessage* parent,
     const FieldDescriptor* parent_field_descriptor,
-    CMessageClass* concrete_class) {
+    CMessageClass* child_message_class) {
   if (!CheckFieldBelongsToMessage(parent_field_descriptor, parent->message)) {
     return NULL;
   }
@@ -681,27 +483,19 @@
     return NULL;
   }
 
-  self->message = parent->message;
+  Py_INCREF(parent);
   self->parent = parent;
   self->parent_field_descriptor = parent_field_descriptor;
-  self->owner = parent->owner;
-  Py_INCREF(concrete_class);
-  self->child_message_class = concrete_class;
-  self->child_messages = PyList_New(0);
-
-  return reinterpret_cast<PyObject*>(self);
+  Py_INCREF(child_message_class);
+  self->child_message_class = child_message_class;
+  return self;
 }
 
 static void Dealloc(PyObject* pself) {
   RepeatedCompositeContainer* self =
       reinterpret_cast<RepeatedCompositeContainer*>(pself);
-
-  Py_CLEAR(self->child_messages);
+  self->RemoveFromParentCache();
   Py_CLEAR(self->child_message_class);
-  // TODO(tibell): Do we need to call delete on these objects to make
-  // sure their destructors are called?
-  self->owner.reset();
-
   Py_TYPE(self)->tp_free(pself);
 }
 
diff --git a/python/google/protobuf/pyext/repeated_composite_container.h b/python/google/protobuf/pyext/repeated_composite_container.h
index d075577..e241827 100644
--- a/python/google/protobuf/pyext/repeated_composite_container.h
+++ b/python/google/protobuf/pyext/repeated_composite_container.h
@@ -52,46 +52,11 @@
 
 struct CMessageClass;
 
-// A RepeatedCompositeContainer can be in one of two states: attached
-// or released.
-//
-// When in the attached state all modifications to the container are
-// done both on the 'message' and on the 'child_messages'
-// list.  In this state all Messages referred to by the children in
-// 'child_messages' are owner by the 'owner'.
-//
-// When in the released state 'message', 'owner', 'parent', and
-// 'parent_field_descriptor' are NULL.
-typedef struct RepeatedCompositeContainer {
-  PyObject_HEAD;
-
-  // This is the top-level C++ Message object that owns the whole
-  // proto tree.  Every Python RepeatedCompositeContainer holds a
-  // reference to it in order to keep it alive as long as there's a
-  // Python object that references any part of the tree.
-  CMessage::OwnerRef owner;
-
-  // Weak reference to parent object. May be NULL. Used to make sure
-  // the parent is writable before modifying the
-  // RepeatedCompositeContainer.
-  CMessage* parent;
-
-  // A descriptor used to modify the underlying 'message'.
-  // The pointer is owned by the global DescriptorPool.
-  const FieldDescriptor* parent_field_descriptor;
-
-  // Pointer to the C++ Message that contains this container.  The
-  // RepeatedCompositeContainer does not own this pointer.
-  //
-  // If NULL, this message has been released from its parent (by
-  // calling Clear() or ClearField() on the parent.
-  Message* message;
-
+// A RepeatedCompositeContainer always has a parent message.
+// The parent message also caches reference to items of the container.
+typedef struct RepeatedCompositeContainer : public ContainerBase {
   // The type used to create new child messages.
   CMessageClass* child_message_class;
-
-  // A list of child messages.
-  PyObject* child_messages;
 } RepeatedCompositeContainer;
 
 extern PyTypeObject RepeatedCompositeContainer_Type;
@@ -100,7 +65,7 @@
 
 // Builds a RepeatedCompositeContainer object, from a parent message and a
 // field descriptor.
-PyObject *NewContainer(
+RepeatedCompositeContainer* NewContainer(
     CMessage* parent,
     const FieldDescriptor* parent_field_descriptor,
     CMessageClass *child_message_class);
@@ -139,25 +104,6 @@
 int AssignSubscript(RepeatedCompositeContainer* self,
                     PyObject* slice,
                     PyObject* value);
-
-// Releases the messages in the container to a new message.
-//
-// Returns 0 on success, -1 on failure.
-int Release(RepeatedCompositeContainer* self);
-
-// Returns 0 on success, -1 on failure.
-int SetOwner(RepeatedCompositeContainer* self,
-             const CMessage::OwnerRef& new_owner);
-
-// Removes the last element of the repeated message field 'field' on
-// the Message 'parent', and transfers the ownership of the released
-// Message to 'target'.
-//
-// Corresponds to reflection api method ReleaseMessage.
-void ReleaseLastTo(Message* message,
-                   const FieldDescriptor* field,
-                   CMessage* target);
-
 }  // namespace repeated_composite_container
 }  // namespace python
 }  // namespace protobuf
diff --git a/python/google/protobuf/pyext/repeated_scalar_container.cc b/python/google/protobuf/pyext/repeated_scalar_container.cc
index ac06cff..07ac602 100644
--- a/python/google/protobuf/pyext/repeated_scalar_container.cc
+++ b/python/google/protobuf/pyext/repeated_scalar_container.cc
@@ -63,8 +63,8 @@
 
 static int InternalAssignRepeatedField(
     RepeatedScalarContainer* self, PyObject* list) {
-  self->message->GetReflection()->ClearField(self->message,
-                                             self->parent_field_descriptor);
+  Message* message = self->parent->message;
+  message->GetReflection()->ClearField(message, self->parent_field_descriptor);
   for (Py_ssize_t i = 0; i < PyList_GET_SIZE(list); ++i) {
     PyObject* value = PyList_GET_ITEM(list, i);
     if (ScopedPyObjectPtr(Append(self, value)) == NULL) {
@@ -77,7 +77,7 @@
 static Py_ssize_t Len(PyObject* pself) {
   RepeatedScalarContainer* self =
       reinterpret_cast<RepeatedScalarContainer*>(pself);
-  Message* message = self->message;
+  Message* message = self->parent->message;
   return message->GetReflection()->FieldSize(*message,
                                              self->parent_field_descriptor);
 }
@@ -87,7 +87,7 @@
       reinterpret_cast<RepeatedScalarContainer*>(pself);
 
   cmessage::AssureWritable(self->parent);
-  Message* message = self->message;
+  Message* message = self->parent->message;
   const FieldDescriptor* field_descriptor = self->parent_field_descriptor;
 
   const Reflection* reflection = message->GetReflection();
@@ -104,9 +104,8 @@
 
   if (arg == NULL) {
     ScopedPyObjectPtr py_index(PyLong_FromLong(index));
-    return cmessage::InternalDeleteRepeatedField(self->message,
-                                                 field_descriptor,
-                                                 py_index.get(), NULL);
+    return cmessage::DeleteRepeatedField(self->parent, field_descriptor,
+                                         py_index.get());
   }
 
   if (PySequence_Check(arg) && !(PyBytes_Check(arg) || PyUnicode_Check(arg))) {
@@ -193,7 +192,7 @@
   RepeatedScalarContainer* self =
       reinterpret_cast<RepeatedScalarContainer*>(pself);
 
-  Message* message = self->message;
+  Message* message = self->parent->message;
   const FieldDescriptor* field_descriptor = self->parent_field_descriptor;
   const Reflection* reflection = message->GetReflection();
 
@@ -343,7 +342,7 @@
 
 PyObject* Append(RepeatedScalarContainer* self, PyObject* item) {
   cmessage::AssureWritable(self->parent);
-  Message* message = self->message;
+  Message* message = self->parent->message;
   const FieldDescriptor* field_descriptor = self->parent_field_descriptor;
 
   const Reflection* reflection = message->GetReflection();
@@ -437,7 +436,7 @@
   bool create_list = false;
 
   cmessage::AssureWritable(self->parent);
-  Message* message = self->message;
+  Message* message = self->parent->message;
   const FieldDescriptor* field_descriptor =
       self->parent_field_descriptor;
 
@@ -467,8 +466,7 @@
   }
 
   if (value == NULL) {
-    return cmessage::InternalDeleteRepeatedField(
-        self->message, field_descriptor, slice, nullptr);
+    return cmessage::DeleteRepeatedField(self->parent, field_descriptor, slice);
   }
 
   if (!create_list) {
@@ -669,7 +667,7 @@
 }
 
 // The private constructor of RepeatedScalarContainer objects.
-PyObject *NewContainer(
+RepeatedScalarContainer* NewContainer(
     CMessage* parent, const FieldDescriptor* parent_field_descriptor) {
   if (!CheckFieldBelongsToMessage(parent_field_descriptor, parent->message)) {
     return NULL;
@@ -681,72 +679,20 @@
     return NULL;
   }
 
-  self->message = parent->message;
+  Py_INCREF(parent);
   self->parent = parent;
   self->parent_field_descriptor = parent_field_descriptor;
-  self->owner = parent->owner;
 
-  return reinterpret_cast<PyObject*>(self);
-}
-
-// Initializes the underlying Message object of "to" so it becomes a new parent
-// repeated scalar, and copies all the values from "from" to it. A child scalar
-// container can be released by passing it as both from and to (e.g. making it
-// the recipient of the new parent message and copying the values from itself).
-static int InitializeAndCopyToParentContainer(
-    RepeatedScalarContainer* from,
-    RepeatedScalarContainer* to) {
-  ScopedPyObjectPtr full_slice(PySlice_New(NULL, NULL, NULL));
-  if (full_slice == NULL) {
-    return -1;
-  }
-  ScopedPyObjectPtr values(
-      Subscript(reinterpret_cast<PyObject*>(from), full_slice.get()));
-  if (values == NULL) {
-    return -1;
-  }
-  Message* new_message = from->message->New();
-  to->parent = NULL;
-  to->parent_field_descriptor = from->parent_field_descriptor;
-  to->message = new_message;
-  to->owner.reset(new_message);
-  if (InternalAssignRepeatedField(to, values.get()) < 0) {
-    return -1;
-  }
-  return 0;
-}
-
-int Release(RepeatedScalarContainer* self) {
-  return InitializeAndCopyToParentContainer(self, self);
+  return self;
 }
 
 PyObject* DeepCopy(PyObject* pself, PyObject* arg) {
-  RepeatedScalarContainer* self =
-      reinterpret_cast<RepeatedScalarContainer*>(pself);
-
-  RepeatedScalarContainer* clone = reinterpret_cast<RepeatedScalarContainer*>(
-      PyType_GenericAlloc(&RepeatedScalarContainer_Type, 0));
-  if (clone == NULL) {
-    return NULL;
-  }
-
-  if (InitializeAndCopyToParentContainer(self, clone) < 0) {
-    Py_DECREF(clone);
-    return NULL;
-  }
-  return reinterpret_cast<PyObject*>(clone);
+  return reinterpret_cast<RepeatedScalarContainer*>(pself)->DeepCopy();
 }
 
 static void Dealloc(PyObject* pself) {
-  RepeatedScalarContainer* self =
-      reinterpret_cast<RepeatedScalarContainer*>(pself);
-  self->owner.reset();
-  Py_TYPE(self)->tp_free(pself);
-}
-
-void SetOwner(RepeatedScalarContainer* self,
-              const CMessage::OwnerRef& new_owner) {
-  self->owner = new_owner;
+  reinterpret_cast<RepeatedScalarContainer*>(pself)->RemoveFromParentCache();
+  Py_TYPE(pself)->tp_free(pself);
 }
 
 static PySequenceMethods SqMethods = {
diff --git a/python/google/protobuf/pyext/repeated_scalar_container.h b/python/google/protobuf/pyext/repeated_scalar_container.h
index 4dcecba..f9f0ea8 100644
--- a/python/google/protobuf/pyext/repeated_scalar_container.h
+++ b/python/google/protobuf/pyext/repeated_scalar_container.h
@@ -45,30 +45,7 @@
 namespace protobuf {
 namespace python {
 
-typedef struct RepeatedScalarContainer {
-  PyObject_HEAD;
-
-  // This is the top-level C++ Message object that owns the whole
-  // proto tree.  Every Python RepeatedScalarContainer holds a
-  // reference to it in order to keep it alive as long as there's a
-  // Python object that references any part of the tree.
-  CMessage::OwnerRef owner;
-
-  // Pointer to the C++ Message that contains this container.  The
-  // RepeatedScalarContainer does not own this pointer.
-  Message* message;
-
-  // Weak reference to a parent CMessage object (i.e. may be NULL.)
-  //
-  // Used to make sure all ancestors are also mutable when first
-  // modifying the container.
-  CMessage* parent;
-
-  // Pointer to the parent's descriptor that describes this
-  // field.  Used together with the parent's message when making a
-  // default message instance mutable.
-  // The pointer is owned by the global DescriptorPool.
-  const FieldDescriptor* parent_field_descriptor;
+typedef struct RepeatedScalarContainer : public ContainerBase {
 } RepeatedScalarContainer;
 
 extern PyTypeObject RepeatedScalarContainer_Type;
@@ -77,7 +54,7 @@
 
 // Builds a RepeatedScalarContainer object, from a parent message and a
 // field descriptor.
-extern PyObject *NewContainer(
+extern RepeatedScalarContainer* NewContainer(
     CMessage* parent, const FieldDescriptor* parent_field_descriptor);
 
 // Appends the scalar 'item' to the end of the container 'self'.
@@ -86,21 +63,12 @@
 // unsuccessful.
 PyObject* Append(RepeatedScalarContainer* self, PyObject* item);
 
-// Releases the messages in the container to a new message.
-//
-// Returns 0 on success, -1 on failure.
-int Release(RepeatedScalarContainer* self);
-
 // Appends all the elements in the input iterator to the container.
 //
 // Returns None if successful; returns NULL and sets an exception if
 // unsuccessful.
 PyObject* Extend(RepeatedScalarContainer* self, PyObject* value);
 
-// Set the owner field of self and any children of self.
-void SetOwner(RepeatedScalarContainer* self,
-              const CMessage::OwnerRef& new_owner);
-
 }  // namespace repeated_scalar_container
 }  // namespace python
 }  // namespace protobuf
diff --git a/python/google/protobuf/pyext/thread_unsafe_shared_ptr.h b/python/google/protobuf/pyext/thread_unsafe_shared_ptr.h
deleted file mode 100644
index 79fa9e3..0000000
--- a/python/google/protobuf/pyext/thread_unsafe_shared_ptr.h
+++ /dev/null
@@ -1,104 +0,0 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-// ThreadUnsafeSharedPtr<T> is the same as shared_ptr<T> without the locking
-// overhread (and thread-safety).
-#ifndef GOOGLE_PROTOBUF_PYTHON_CPP_THREAD_UNSAFE_SHARED_PTR_H__
-#define GOOGLE_PROTOBUF_PYTHON_CPP_THREAD_UNSAFE_SHARED_PTR_H__
-
-#include <algorithm>
-#include <utility>
-
-#include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/stubs/common.h>
-
-namespace google {
-namespace protobuf {
-namespace python {
-
-template <typename T>
-class ThreadUnsafeSharedPtr {
- public:
-  // Takes ownership.
-  explicit ThreadUnsafeSharedPtr(T* ptr)
-      : ptr_(ptr), refcount_(ptr ? new RefcountT(1) : nullptr) {
-  }
-
-  ThreadUnsafeSharedPtr(const ThreadUnsafeSharedPtr& other)
-      : ThreadUnsafeSharedPtr(nullptr) {
-    *this = other;
-  }
-
-  ThreadUnsafeSharedPtr& operator=(const ThreadUnsafeSharedPtr& other) {
-    if (other.refcount_ == refcount_) {
-      return *this;
-    }
-    this->~ThreadUnsafeSharedPtr();
-    ptr_ = other.ptr_;
-    refcount_ = other.refcount_;
-    if (refcount_) {
-      ++*refcount_;
-    }
-    return *this;
-  }
-
-  ~ThreadUnsafeSharedPtr() {
-    if (refcount_ == nullptr) {
-      GOOGLE_DCHECK(ptr_ == nullptr);
-      return;
-    }
-    if (--*refcount_ == 0) {
-      delete refcount_;
-      delete ptr_;
-    }
-  }
-
-  void reset(T* ptr = nullptr) { *this = ThreadUnsafeSharedPtr(ptr); }
-
-  T* get() { return ptr_; }
-  const T* get() const { return ptr_; }
-
-  void swap(ThreadUnsafeSharedPtr& other) {
-    using std::swap;
-    swap(ptr_, other.ptr_);
-    swap(refcount_, other.refcount_);
-  }
-
- private:
-  typedef int RefcountT;
-  T* ptr_;
-  RefcountT* refcount_;
-};
-
-}  // namespace python
-}  // namespace protobuf
-}  // namespace google
-
-#endif  // GOOGLE_PROTOBUF_PYTHON_CPP_THREAD_UNSAFE_SHARED_PTR_H__
diff --git a/python/google/protobuf/pyext/unknown_fields.cc b/python/google/protobuf/pyext/unknown_fields.cc
index 760452f..c3679c0 100755
--- a/python/google/protobuf/pyext/unknown_fields.cc
+++ b/python/google/protobuf/pyext/unknown_fields.cc
@@ -137,6 +137,8 @@
   if (PyObject_TypeCheck(self->parent, &PyUnknownFields_Type)) {
     reinterpret_cast<PyUnknownFields*>(
         self->parent)->sub_unknown_fields.erase(self);
+  } else {
+    reinterpret_cast<CMessage*>(self->parent)->unknown_field_set = nullptr;
   }
   Py_CLEAR(self->parent);
   self->~PyUnknownFields();
diff --git a/python/google/protobuf/text_format.py b/python/google/protobuf/text_format.py
index 557c7e2..7211662 100755
--- a/python/google/protobuf/text_format.py
+++ b/python/google/protobuf/text_format.py
@@ -584,7 +584,8 @@
           message,
           allow_unknown_extension=False,
           allow_field_number=False,
-          descriptor_pool=None):
+          descriptor_pool=None,
+          allow_unknown_field=False):
   """Parses a text representation of a protocol message into a message.
 
   NOTE: for historical reasons this function does not clear the input
@@ -610,6 +611,9 @@
       parsing
     allow_field_number: if True, both field number and field name are allowed.
     descriptor_pool: A DescriptorPool used to resolve Any types.
+    allow_unknown_field: if True, skip over unknown field and keep
+      parsing. Avoid to use this option if possible. It may hide some
+      errors (e.g. spelling error on field name)
 
   Returns:
     The same message passed as argument.
@@ -621,14 +625,16 @@
                     message,
                     allow_unknown_extension,
                     allow_field_number,
-                    descriptor_pool=descriptor_pool)
+                    descriptor_pool=descriptor_pool,
+                    allow_unknown_field=allow_unknown_field)
 
 
 def Merge(text,
           message,
           allow_unknown_extension=False,
           allow_field_number=False,
-          descriptor_pool=None):
+          descriptor_pool=None,
+          allow_unknown_field=False):
   """Parses a text representation of a protocol message into a message.
 
   Like Parse(), but allows repeated values for a non-repeated field, and uses
@@ -641,6 +647,9 @@
       parsing
     allow_field_number: if True, both field number and field name are allowed.
     descriptor_pool: A DescriptorPool used to resolve Any types.
+    allow_unknown_field: if True, skip over unknown field and keep
+      parsing. Avoid to use this option if possible. It may hide some
+      errors (e.g. spelling error on field name)
 
   Returns:
     The same message passed as argument.
@@ -653,14 +662,16 @@
       message,
       allow_unknown_extension,
       allow_field_number,
-      descriptor_pool=descriptor_pool)
+      descriptor_pool=descriptor_pool,
+      allow_unknown_field=allow_unknown_field)
 
 
 def ParseLines(lines,
                message,
                allow_unknown_extension=False,
                allow_field_number=False,
-               descriptor_pool=None):
+               descriptor_pool=None,
+               allow_unknown_field=False):
   """Parses a text representation of a protocol message into a message.
 
   Args:
@@ -670,6 +681,9 @@
       parsing
     allow_field_number: if True, both field number and field name are allowed.
     descriptor_pool: A DescriptorPool used to resolve Any types.
+    allow_unknown_field: if True, skip over unknown field and keep
+      parsing. Avoid to use this option if possible. It may hide some
+      errors (e.g. spelling error on field name)
 
   Returns:
     The same message passed as argument.
@@ -679,7 +693,8 @@
   """
   parser = _Parser(allow_unknown_extension,
                    allow_field_number,
-                   descriptor_pool=descriptor_pool)
+                   descriptor_pool=descriptor_pool,
+                   allow_unknown_field=allow_unknown_field)
   return parser.ParseLines(lines, message)
 
 
@@ -687,7 +702,8 @@
                message,
                allow_unknown_extension=False,
                allow_field_number=False,
-               descriptor_pool=None):
+               descriptor_pool=None,
+               allow_unknown_field=False):
   """Parses a text representation of a protocol message into a message.
 
   Like ParseLines(), but allows repeated values for a non-repeated field, and
@@ -700,6 +716,9 @@
       parsing
     allow_field_number: if True, both field number and field name are allowed.
     descriptor_pool: A DescriptorPool used to resolve Any types.
+    allow_unknown_field: if True, skip over unknown field and keep
+      parsing. Avoid to use this option if possible. It may hide some
+      errors (e.g. spelling error on field name)
 
   Returns:
     The same message passed as argument.
@@ -709,7 +728,8 @@
   """
   parser = _Parser(allow_unknown_extension,
                    allow_field_number,
-                   descriptor_pool=descriptor_pool)
+                   descriptor_pool=descriptor_pool,
+                   allow_unknown_field=allow_unknown_field)
   return parser.MergeLines(lines, message)
 
 
@@ -719,10 +739,12 @@
   def __init__(self,
                allow_unknown_extension=False,
                allow_field_number=False,
-               descriptor_pool=None):
+               descriptor_pool=None,
+               allow_unknown_field=False):
     self.allow_unknown_extension = allow_unknown_extension
     self.allow_field_number = allow_field_number
     self.descriptor_pool = descriptor_pool
+    self.allow_unknown_field = allow_unknown_field
 
   def ParseLines(self, lines, message):
     """Parses a text representation of a protocol message into a message."""
@@ -844,7 +866,7 @@
             field.message_type.name != name):
           field = None
 
-      if not field:
+      if not field and not self.allow_unknown_field:
         raise tokenizer.ParseErrorPreviousToken(
             'Message type "%s" has no field named "%s".' %
             (message_descriptor.full_name, name))
@@ -883,7 +905,7 @@
         merger(tokenizer, message, field)
 
     else:  # Proto field is unknown.
-      assert self.allow_unknown_extension
+      assert (self.allow_unknown_extension or self.allow_unknown_field)
       _SkipFieldContents(tokenizer)
 
     # For historical reasons, fields may optionally be separated by commas or
diff --git a/src/Makefile.am b/src/Makefile.am
index 6f64b96..fabc23a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -182,8 +182,8 @@
   google/protobuf/stubs/hash.h                                 \
   google/protobuf/stubs/int128.cc                              \
   google/protobuf/stubs/int128.h                               \
-  google/protobuf/stubs/io_win32.cc                            \
-  google/protobuf/stubs/io_win32.h                             \
+  google/protobuf/io/io_win32.cc                               \
+  google/protobuf/io/io_win32.h                                \
   google/protobuf/stubs/map_util.h                             \
   google/protobuf/stubs/mathutil.h                             \
   google/protobuf/stubs/status.cc                              \
@@ -730,7 +730,7 @@
   google/protobuf/stubs/bytestream_unittest.cc                 \
   google/protobuf/stubs/common_unittest.cc                     \
   google/protobuf/stubs/int128_unittest.cc                     \
-  google/protobuf/stubs/io_win32_unittest.cc                   \
+  google/protobuf/io/io_win32_unittest.cc                      \
   google/protobuf/stubs/statusor_test.cc                       \
   google/protobuf/stubs/status_test.cc                         \
   google/protobuf/stubs/stringpiece_unittest.cc                \
diff --git a/src/google/protobuf/any.cc b/src/google/protobuf/any.cc
index 4b3cce6..a79214b 100644
--- a/src/google/protobuf/any.cc
+++ b/src/google/protobuf/any.cc
@@ -64,16 +64,16 @@
 bool GetAnyFieldDescriptors(const Message& message,
                             const FieldDescriptor** type_url_field,
                             const FieldDescriptor** value_field) {
-    const Descriptor* descriptor = message.GetDescriptor();
-    if (descriptor->full_name() != kAnyFullTypeName) {
-      return false;
-    }
-    *type_url_field = descriptor->FindFieldByNumber(1);
-    *value_field = descriptor->FindFieldByNumber(2);
-    return (*type_url_field != NULL &&
-            (*type_url_field)->type() == FieldDescriptor::TYPE_STRING &&
-            *value_field != NULL &&
-            (*value_field)->type() == FieldDescriptor::TYPE_BYTES);
+  const Descriptor* descriptor = message.GetDescriptor();
+  if (descriptor->full_name() != kAnyFullTypeName) {
+    return false;
+  }
+  *type_url_field = descriptor->FindFieldByNumber(1);
+  *value_field = descriptor->FindFieldByNumber(2);
+  return (*type_url_field != NULL &&
+          (*type_url_field)->type() == FieldDescriptor::TYPE_STRING &&
+          *value_field != NULL &&
+          (*value_field)->type() == FieldDescriptor::TYPE_BYTES);
 }
 
 }  // namespace internal
diff --git a/src/google/protobuf/any.pb.cc b/src/google/protobuf/any.pb.cc
index 3515411..404de6f 100644
--- a/src/google/protobuf/any.pb.cc
+++ b/src/google/protobuf/any.pb.cc
@@ -36,10 +36,6 @@
 PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Any_google_2fprotobuf_2fany_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsAny_google_2fprotobuf_2fany_2eproto}, {}};
 
-void InitDefaults_google_2fprotobuf_2fany_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Any_google_2fprotobuf_2fany_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2fany_2eproto[1];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fany_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fany_2eproto = nullptr;
@@ -76,8 +72,7 @@
   "roto3"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fany_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2fany_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2fany_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2fany_2eproto,
   "google/protobuf/any.proto", &assign_descriptors_table_google_2fprotobuf_2fany_2eproto, 205,
 };
 
@@ -85,6 +80,7 @@
   static constexpr ::PROTOBUF_NAMESPACE_ID::internal::InitFunc deps[1] =
   {
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Any_google_2fprotobuf_2fany_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2fany_2eproto, deps, 0);
 }
 
@@ -190,38 +186,44 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Any::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // string type_url = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_type_url(), ptr, ctx, "google.protobuf.Any.type_url");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // bytes value = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(mutable_value(), ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Any::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/any_test.cc b/src/google/protobuf/any_test.cc
index 72bd5e0..4fbf0b6 100644
--- a/src/google/protobuf/any_test.cc
+++ b/src/google/protobuf/any_test.cc
@@ -166,4 +166,3 @@
 }  // namespace
 }  // namespace protobuf
 }  // namespace google
-
diff --git a/src/google/protobuf/api.pb.cc b/src/google/protobuf/api.pb.cc
index 1b56305..c9e2123 100644
--- a/src/google/protobuf/api.pb.cc
+++ b/src/google/protobuf/api.pb.cc
@@ -81,12 +81,6 @@
 PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Mixin_google_2fprotobuf_2fapi_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsMixin_google_2fprotobuf_2fapi_2eproto}, {}};
 
-void InitDefaults_google_2fprotobuf_2fapi_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Api_google_2fprotobuf_2fapi_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Method_google_2fprotobuf_2fapi_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Mixin_google_2fprotobuf_2fapi_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2fapi_2eproto[3];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fapi_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fapi_2eproto = nullptr;
@@ -164,8 +158,7 @@
   "rotobuf.WellKnownTypesb\006proto3"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fapi_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2fapi_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2fapi_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2fapi_2eproto,
   "google/protobuf/api.proto", &assign_descriptors_table_google_2fprotobuf_2fapi_2eproto, 750,
 };
 
@@ -175,6 +168,9 @@
     ::AddDescriptors_google_2fprotobuf_2fsource_5fcontext_2eproto,
     ::AddDescriptors_google_2fprotobuf_2ftype_2eproto,
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Api_google_2fprotobuf_2fapi_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Method_google_2fprotobuf_2fapi_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Mixin_google_2fprotobuf_2fapi_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2fapi_2eproto, deps, 2);
 }
 
@@ -296,67 +292,74 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Api::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_name(), ptr, ctx, "google.protobuf.Api.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.Method methods = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_methods(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 18 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 18) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.Option options = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_options(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 26 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 26) break;
+          ptr += 1;
+        }
         break;
       }
       // string version = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_version(), ptr, ctx, "google.protobuf.Api.version");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // .google.protobuf.SourceContext source_context = 5;
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 42) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_source_context(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.Mixin mixins = 6;
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 50) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_mixins(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 50 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 50) break;
+          ptr += 1;
+        }
         break;
       }
       // .google.protobuf.Syntax syntax = 7;
       case 7: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 56) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         set_syntax(static_cast<PROTOBUF_NAMESPACE_ID::Syntax>(val));
         break;
       }
@@ -364,15 +367,20 @@
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Api::MergePartialFromCodedStream(
@@ -898,61 +906,64 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Method::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_name(), ptr, ctx, "google.protobuf.Method.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // string request_type_url = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_request_type_url(), ptr, ctx, "google.protobuf.Method.request_type_url");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // bool request_streaming = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 24) goto handle_unusual;
-        set_request_streaming(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        request_streaming_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // string response_type_url = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_response_type_url(), ptr, ctx, "google.protobuf.Method.response_type_url");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // bool response_streaming = 5;
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 40) goto handle_unusual;
-        set_response_streaming(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        response_streaming_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.Option options = 6;
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 50) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_options(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 50 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 50) break;
+          ptr += 1;
+        }
         break;
       }
       // .google.protobuf.Syntax syntax = 7;
       case 7: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 56) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         set_syntax(static_cast<PROTOBUF_NAMESPACE_ID::Syntax>(val));
         break;
       }
@@ -960,15 +971,20 @@
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Method::MergePartialFromCodedStream(
@@ -1464,38 +1480,44 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Mixin::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_name(), ptr, ctx, "google.protobuf.Mixin.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // string root = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_root(), ptr, ctx, "google.protobuf.Mixin.root");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Mixin::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/arena.cc b/src/google/protobuf/arena.cc
index eb3a1dd..0171c56 100644
--- a/src/google/protobuf/arena.cc
+++ b/src/google/protobuf/arena.cc
@@ -31,6 +31,7 @@
 #include <google/protobuf/arena.h>
 
 #include <algorithm>
+#include <atomic>
 #include <limits>
 
 #include <google/protobuf/stubs/mutex.h>
@@ -49,7 +50,7 @@
 namespace internal {
 
 
-std::atomic<int64> ArenaImpl::lifecycle_id_generator_;
+std::atomic<LifecycleId> ArenaImpl::lifecycle_id_generator_;
 #if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL)
 ArenaImpl::ThreadCache& ArenaImpl::thread_cache() {
   static internal::ThreadLocalStorage<ThreadCache>* thread_cache_ =
@@ -58,7 +59,7 @@
 }
 #elif defined(PROTOBUF_USE_DLLS)
 ArenaImpl::ThreadCache& ArenaImpl::thread_cache() {
-  static GOOGLE_THREAD_LOCAL ThreadCache thread_cache_ = { -1, NULL };
+  static GOOGLE_THREAD_LOCAL ThreadCache thread_cache_ = {-1, NULL};
   return thread_cache_;
 }
 #else
@@ -242,7 +243,7 @@
 uint64 ArenaImpl::SpaceUsed() const {
   SerialArena* serial = threads_.load(std::memory_order_acquire);
   uint64 space_used = 0;
-  for ( ; serial; serial = serial->next()) {
+  for (; serial; serial = serial->next()) {
     space_used += serial->SpaceUsed();
   }
   return space_used;
@@ -286,7 +287,7 @@
   // We have to be careful in this function, since we will be freeing the Block
   // that contains this SerialArena.  Be careful about accessing |serial|.
 
-  for (Block* b = serial->head_; b; ) {
+  for (Block* b = serial->head_; b;) {
     // This is inside the block we are freeing, so we need to read it now.
     Block* next_block = b->next();
     space_allocated += (b->size());
@@ -312,7 +313,7 @@
   // properly synchronize Reset() or the destructor will throw a TSAN warning.
   SerialArena* serial = threads_.load(std::memory_order_relaxed);
 
-  for ( ; serial; serial = serial->next()) {
+  for (; serial; serial = serial->next()) {
     serial->CleanupList();
   }
 }
@@ -365,7 +366,7 @@
 ArenaImpl::SerialArena* ArenaImpl::GetSerialArenaFallback(void* me) {
   // Look for this SerialArena in our linked list.
   SerialArena* serial = threads_.load(std::memory_order_acquire);
-  for ( ; serial; serial = serial->next()) {
+  for (; serial; serial = serial->next()) {
     if (serial->owner() == me) {
       break;
     }
diff --git a/src/google/protobuf/arena.h b/src/google/protobuf/arena.h
index 3a9feb5..52f3fb9 100644
--- a/src/google/protobuf/arena.h
+++ b/src/google/protobuf/arena.h
@@ -72,8 +72,8 @@
 namespace google {
 namespace protobuf {
 
-class Arena;          // defined below
-class Message;        // defined in message.h
+class Arena;    // defined below
+class Message;  // defined in message.h
 class MessageLite;
 
 namespace arena_metrics {
@@ -84,8 +84,8 @@
 
 namespace internal {
 
-struct ArenaStringPtr;     // defined in arenastring.h
-class LazyField;           // defined in lazy_field.h
+struct ArenaStringPtr;  // defined in arenastring.h
+class LazyField;        // defined in lazy_field.h
 
 template <typename Type>
 class GenericTypeHandler;  // defined in repeated_field.h
@@ -402,8 +402,8 @@
   // will be manually called when the arena is destroyed or reset. This differs
   // from OwnDestructor() in that any member function may be specified, not only
   // the class destructor.
-  PROTOBUF_NOINLINE void OwnCustomDestructor(
-      void* object, void (*destruct)(void*)) {
+  PROTOBUF_NOINLINE void OwnCustomDestructor(void* object,
+                                             void (*destruct)(void*)) {
     impl_.AddCleanup(object, destruct);
   }
 
diff --git a/src/google/protobuf/arena_impl.h b/src/google/protobuf/arena_impl.h
index 4ba5954..0beec17 100644
--- a/src/google/protobuf/arena_impl.h
+++ b/src/google/protobuf/arena_impl.h
@@ -55,6 +55,8 @@
   return (n + 7) & static_cast<size_t>(-8);
 }
 
+using LifecycleId = int64_t;
+
 // This class provides the core Arena memory allocation library. Different
 // implementations only need to implement the public interface below.
 // Arena is not a template type as that would only be useful if all protos
@@ -73,12 +75,12 @@
 
     template <typename O>
     explicit Options(const O& options)
-      : start_block_size(options.start_block_size),
-        max_block_size(options.max_block_size),
-        initial_block(options.initial_block),
-        initial_block_size(options.initial_block_size),
-        block_alloc(options.block_alloc),
-        block_dealloc(options.block_dealloc) {}
+        : start_block_size(options.start_block_size),
+          max_block_size(options.max_block_size),
+          initial_block(options.initial_block),
+          initial_block_size(options.initial_block_size),
+          block_alloc(options.block_alloc),
+          block_dealloc(options.block_dealloc) {}
   };
 
   template <typename O>
@@ -193,11 +195,11 @@
     void AddCleanupFallback(void* elem, void (*cleanup)(void*));
     void CleanupListFallback();
 
-    ArenaImpl* arena_;        // Containing arena.
-    void* owner_;             // &ThreadCache of this thread;
-    Block* head_;             // Head of linked list of blocks.
-    CleanupChunk* cleanup_;   // Head of cleanup list.
-    SerialArena* next_;       // Next SerialArena in this linked list.
+    ArenaImpl* arena_;       // Containing arena.
+    void* owner_;            // &ThreadCache of this thread;
+    Block* head_;            // Head of linked list of blocks.
+    CleanupChunk* cleanup_;  // Head of cleanup list.
+    SerialArena* next_;      // Next SerialArena in this linked list.
 
     // Next pointer to allocate from.  Always 8-byte aligned.  Points inside
     // head_ (and head_->pos will always be non-canonical).  We keep these
@@ -227,7 +229,7 @@
     void set_pos(size_t pos) { pos_ = pos; }
 
    private:
-    Block* next_;   // Next block for this thread.
+    Block* next_;  // Next block for this thread.
     size_t pos_;
     size_t size_;
     // data follows
@@ -243,10 +245,10 @@
 
     // The ThreadCache is considered valid as long as this matches the
     // lifecycle_id of the arena being used.
-    int64 last_lifecycle_id_seen;
+    LifecycleId last_lifecycle_id_seen;
     SerialArena* last_serial_arena;
   };
-  static std::atomic<int64> lifecycle_id_generator_;
+  static std::atomic<LifecycleId> lifecycle_id_generator_;
 #if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL)
   // Android ndk does not support GOOGLE_THREAD_LOCAL keyword so we use a custom thread
   // local storage class we implemented.
@@ -279,21 +281,20 @@
     hint_.store(serial, std::memory_order_release);
   }
 
-
   std::atomic<SerialArena*>
       threads_;                     // Pointer to a linked list of SerialArena.
   std::atomic<SerialArena*> hint_;  // Fast thread-local block access
   std::atomic<size_t> space_allocated_;  // Total size of all allocated blocks.
 
-  Block *initial_block_;     // If non-NULL, points to the block that came from
-                             // user data.
+  Block* initial_block_;  // If non-NULL, points to the block that came from
+                          // user data.
 
   Block* NewBlock(Block* last_block, size_t min_bytes);
 
   SerialArena* GetSerialArena();
   bool GetSerialArenaFast(SerialArena** arena);
   SerialArena* GetSerialArenaFallback(void* me);
-  int64 lifecycle_id_;  // Unique for each arena. Changes on Reset().
+  LifecycleId lifecycle_id_;  // Unique for each arena. Changes on Reset().
 
   Options options_;
 
diff --git a/src/google/protobuf/arena_test_util.cc b/src/google/protobuf/arena_test_util.cc
index df9c5bd..da32960 100644
--- a/src/google/protobuf/arena_test_util.cc
+++ b/src/google/protobuf/arena_test_util.cc
@@ -28,9 +28,9 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+#include <google/protobuf/arena_test_util.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
-#include <google/protobuf/arena_test_util.h>
 
 
 #define EXPECT_EQ GOOGLE_CHECK_EQ
diff --git a/src/google/protobuf/arena_test_util.h b/src/google/protobuf/arena_test_util.h
index fdbaca0..84df349 100644
--- a/src/google/protobuf/arena_test_util.h
+++ b/src/google/protobuf/arena_test_util.h
@@ -78,10 +78,9 @@
 
 class NoHeapChecker {
  public:
-  NoHeapChecker() {
-    capture_alloc.Hook();
-  }
+  NoHeapChecker() { capture_alloc.Hook(); }
   ~NoHeapChecker();
+
  private:
   class NewDeleteCapture {
    public:
diff --git a/src/google/protobuf/arena_unittest.cc b/src/google/protobuf/arena_unittest.cc
index a682a9c..6ef3094 100644
--- a/src/google/protobuf/arena_unittest.cc
+++ b/src/google/protobuf/arena_unittest.cc
@@ -71,12 +71,8 @@
 class Notifier {
  public:
   Notifier() : count_(0) {}
-  void Notify() {
-    count_++;
-  }
-  int GetCount() {
-    return count_;
-  }
+  void Notify() { count_++; }
+  int GetCount() { return count_; }
 
  private:
   int count_;
@@ -85,14 +81,13 @@
 class SimpleDataType {
  public:
   SimpleDataType() : notifier_(NULL) {}
-  void SetNotifier(Notifier* notifier) {
-    notifier_ = notifier;
-  }
+  void SetNotifier(Notifier* notifier) { notifier_ = notifier; }
   virtual ~SimpleDataType() {
     if (notifier_ != NULL) {
       notifier_->Notify();
     }
   };
+
  private:
   Notifier* notifier_;
 };
@@ -227,8 +222,8 @@
   const std::string three("3");
   const PleaseDontCopyMe four(4);
   const MustBeConstructedWithOneThroughFour* new_object =
-      Arena::Create<MustBeConstructedWithOneThroughFour>(
-          &arena, 1, "2", three, &four);
+      Arena::Create<MustBeConstructedWithOneThroughFour>(&arena, 1, "2", three,
+                                                         &four);
   EXPECT_TRUE(new_object != NULL);
   ASSERT_EQ(1, new_object->one_);
   ASSERT_STREQ("2", new_object->two_);
@@ -462,7 +457,7 @@
 
 TEST(ArenaTest, SetAllocatedMessage) {
   Arena arena;
-  TestAllTypes *arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
+  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
   TestAllTypes::NestedMessage* nested = new TestAllTypes::NestedMessage;
   nested->set_bb(118);
   arena_message->set_allocated_optional_nested_message(nested);
@@ -620,8 +615,7 @@
   heap_submessage->set_bb(42);
   arena1_message->set_allocated_optional_nested_message(heap_submessage);
   // Should keep same object and add to arena's Own()-list.
-  EXPECT_EQ(heap_submessage,
-            arena1_message->mutable_optional_nested_message());
+  EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message());
   {
     Arena arena2;
     TestAllTypes::NestedMessage* arena2_submessage =
@@ -637,8 +631,7 @@
   arena1_submessage->set_bb(42);
   TestAllTypes* heap_message = new TestAllTypes;
   heap_message->set_allocated_optional_nested_message(arena1_submessage);
-  EXPECT_NE(arena1_submessage,
-            heap_message->mutable_optional_nested_message());
+  EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message());
   delete heap_message;
 }
 
@@ -648,15 +641,14 @@
   TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
   const Reflection* r = arena1_message->GetReflection();
   const Descriptor* d = arena1_message->GetDescriptor();
-  const FieldDescriptor* msg_field = d->FindFieldByName(
-      "optional_nested_message");
+  const FieldDescriptor* msg_field =
+      d->FindFieldByName("optional_nested_message");
   TestAllTypes::NestedMessage* heap_submessage =
       new TestAllTypes::NestedMessage();
   heap_submessage->set_bb(42);
   r->SetAllocatedMessage(arena1_message, heap_submessage, msg_field);
   // Should keep same object and add to arena's Own()-list.
-  EXPECT_EQ(heap_submessage,
-            arena1_message->mutable_optional_nested_message());
+  EXPECT_EQ(heap_submessage, arena1_message->mutable_optional_nested_message());
   {
     Arena arena2;
     TestAllTypes::NestedMessage* arena2_submessage =
@@ -672,8 +664,7 @@
   arena1_submessage->set_bb(42);
   TestAllTypes* heap_message = new TestAllTypes;
   r->SetAllocatedMessage(heap_message, arena1_submessage, msg_field);
-  EXPECT_NE(arena1_submessage,
-            heap_message->mutable_optional_nested_message());
+  EXPECT_NE(arena1_submessage, heap_message->mutable_optional_nested_message());
   delete heap_message;
 }
 
@@ -728,11 +719,10 @@
     TestAllTypes::NestedMessage* heap_submessage =
         new TestAllTypes::NestedMessage();
     heap_submessage->set_bb(42);
-    arena1_message->mutable_repeated_nested_message()->
-        AddAllocated(heap_submessage);
+    arena1_message->mutable_repeated_nested_message()->AddAllocated(
+        heap_submessage);
     // Should not copy object -- will use arena_->Own().
-    EXPECT_EQ(heap_submessage,
-              &arena1_message->repeated_nested_message(i));
+    EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(i));
     EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
   }
 
@@ -743,11 +733,10 @@
     TestAllTypes::NestedMessage* arena2_submessage =
         Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
     arena2_submessage->set_bb(42);
-    arena1_message->mutable_repeated_nested_message()->
-        AddAllocated(arena2_submessage);
+    arena1_message->mutable_repeated_nested_message()->AddAllocated(
+        arena2_submessage);
     // Should copy object.
-    EXPECT_NE(arena2_submessage,
-              &arena1_message->repeated_nested_message(i));
+    EXPECT_NE(arena2_submessage, &arena1_message->repeated_nested_message(i));
     EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
   }
 
@@ -758,11 +747,10 @@
     TestAllTypes::NestedMessage* arena2_submessage =
         Arena::CreateMessage<TestAllTypes::NestedMessage>(&arena2);
     arena2_submessage->set_bb(42);
-    heap_message->mutable_repeated_nested_message()->
-        AddAllocated(arena2_submessage);
+    heap_message->mutable_repeated_nested_message()->AddAllocated(
+        arena2_submessage);
     // Should copy object.
-    EXPECT_NE(arena2_submessage,
-              &heap_message->repeated_nested_message(i));
+    EXPECT_NE(arena2_submessage, &heap_message->repeated_nested_message(i));
     EXPECT_EQ(42, heap_message->repeated_nested_message(i).bb());
   }
   delete heap_message;
@@ -771,8 +759,7 @@
   arena1_message->Clear();
   for (int i = 0; i < 10; i++) {
     std::string* s = new std::string("Test");
-    arena1_message->mutable_repeated_string()->
-        AddAllocated(s);
+    arena1_message->mutable_repeated_string()->AddAllocated(s);
     // Should not copy.
     EXPECT_EQ(s, &arena1_message->repeated_string(i));
     EXPECT_EQ("Test", arena1_message->repeated_string(i));
@@ -785,16 +772,14 @@
   TestAllTypes* arena1_message = Arena::CreateMessage<TestAllTypes>(&arena1);
   const Reflection* r = arena1_message->GetReflection();
   const Descriptor* d = arena1_message->GetDescriptor();
-  const FieldDescriptor* fd =
-      d->FindFieldByName("repeated_nested_message");
+  const FieldDescriptor* fd = d->FindFieldByName("repeated_nested_message");
   for (int i = 0; i < 10; i++) {
     TestAllTypes::NestedMessage* heap_submessage =
         new TestAllTypes::NestedMessage;
     heap_submessage->set_bb(42);
     r->AddAllocatedMessage(arena1_message, fd, heap_submessage);
     // Should not copy object -- will use arena_->Own().
-    EXPECT_EQ(heap_submessage,
-              &arena1_message->repeated_nested_message(i));
+    EXPECT_EQ(heap_submessage, &arena1_message->repeated_nested_message(i));
     EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
   }
 
@@ -807,8 +792,7 @@
     arena2_submessage->set_bb(42);
     r->AddAllocatedMessage(arena1_message, fd, arena2_submessage);
     // Should copy object.
-    EXPECT_NE(arena2_submessage,
-              &arena1_message->repeated_nested_message(i));
+    EXPECT_NE(arena2_submessage, &arena1_message->repeated_nested_message(i));
     EXPECT_EQ(42, arena1_message->repeated_nested_message(i).bb());
   }
 
@@ -821,8 +805,7 @@
     arena2_submessage->set_bb(42);
     r->AddAllocatedMessage(heap_message, fd, arena2_submessage);
     // Should copy object.
-    EXPECT_NE(arena2_submessage,
-              &heap_message->repeated_nested_message(i));
+    EXPECT_NE(arena2_submessage, &heap_message->repeated_nested_message(i));
     EXPECT_EQ(42, heap_message->repeated_nested_message(i).bb());
   }
   delete heap_message;
@@ -841,9 +824,9 @@
   }
 
   for (int i = 0; i < 10; i++) {
-    const TestAllTypes::NestedMessage *orig_submessage =
+    const TestAllTypes::NestedMessage* orig_submessage =
         &arena_message->repeated_nested_message(10 - 1 - i);  // last element
-    TestAllTypes::NestedMessage *released =
+    TestAllTypes::NestedMessage* released =
         arena_message->mutable_repeated_nested_message()->ReleaseLast();
     EXPECT_NE(released, orig_submessage);
     EXPECT_EQ(42, released->bb());
@@ -859,11 +842,11 @@
   }
 
   for (int i = 0; i < 10; i++) {
-    const TestAllTypes::NestedMessage *orig_submessage =
+    const TestAllTypes::NestedMessage* orig_submessage =
         &arena_message->repeated_nested_message(10 - 1 - i);  // last element
-    TestAllTypes::NestedMessage *released =
-        arena_message->mutable_repeated_nested_message()->
-        UnsafeArenaReleaseLast();
+    TestAllTypes::NestedMessage* released =
+        arena_message->mutable_repeated_nested_message()
+            ->UnsafeArenaReleaseLast();
     EXPECT_EQ(released, orig_submessage);
     EXPECT_EQ(42, released->bb());
     // no delete -- |released| is on the arena.
@@ -962,12 +945,10 @@
   const Descriptor* desc = message->GetDescriptor();
   const Reflection* refl = message->GetReflection();
 
-  const FieldDescriptor* string_field = desc->FindFieldByName(
-      "oneof_string");
-  const FieldDescriptor* msg_field = desc->FindFieldByName(
-      "oneof_nested_message");
-  const OneofDescriptor* oneof = desc->FindOneofByName(
-      "oneof_field");
+  const FieldDescriptor* string_field = desc->FindFieldByName("oneof_string");
+  const FieldDescriptor* msg_field =
+      desc->FindFieldByName("oneof_nested_message");
+  const OneofDescriptor* oneof = desc->FindOneofByName("oneof_field");
 
   refl->SetString(message, string_field, "Test value");
   EXPECT_TRUE(refl->HasOneof(*message, oneof));
@@ -1051,12 +1032,12 @@
   // Ensure no leaks.
   TestAllExtensions* message_ext =
       Arena::CreateMessage<TestAllExtensions>(&arena);
-  message_ext->SetExtension(
-      protobuf_unittest::optional_int32_extension, 42);
+  message_ext->SetExtension(protobuf_unittest::optional_int32_extension, 42);
   message_ext->SetExtension(protobuf_unittest::optional_string_extension,
                             std::string("test"));
-  message_ext->MutableExtension(
-      protobuf_unittest::optional_nested_message_extension)->set_bb(42);
+  message_ext
+      ->MutableExtension(protobuf_unittest::optional_nested_message_extension)
+      ->set_bb(42);
 }
 
 TEST(ArenaTest, RepeatedFieldOnArena) {
@@ -1119,7 +1100,7 @@
   // code that may allocate messages or repeated fields of messages on an arena.
   {
     RepeatedPtrField<TestAllTypes>* repeated_ptr_on_arena =
-        Arena::CreateMessage< RepeatedPtrField<TestAllTypes> >(&arena);
+        Arena::CreateMessage<RepeatedPtrField<TestAllTypes> >(&arena);
     for (int i = 0; i < 10; i++) {
       // Add some elements and let the leak-checker ensure that everything is
       // freed.
@@ -1127,7 +1108,7 @@
     }
 
     RepeatedField<int>* repeated_int_on_arena =
-        Arena::CreateMessage< RepeatedField<int> >(&arena);
+        Arena::CreateMessage<RepeatedField<int> >(&arena);
     for (int i = 0; i < 100; i++) {
       repeated_int_on_arena->Add(i);
     }
@@ -1154,7 +1135,8 @@
   EXPECT_EQ(submessage_expected, submessage);
   EXPECT_EQ(&arena, submessage->GetArena());
 
-  const FieldDescriptor* oneof_field = d->FindFieldByName("oneof_nested_message");
+  const FieldDescriptor* oneof_field =
+      d->FindFieldByName("oneof_nested_message");
   submessage = static_cast<TestAllTypes::NestedMessage*>(
       r->MutableMessage(message, oneof_field));
   submessage_expected = message->mutable_oneof_nested_message();
diff --git a/src/google/protobuf/arenastring_unittest.cc b/src/google/protobuf/arenastring_unittest.cc
index edb6f6c..70a3f76 100644
--- a/src/google/protobuf/arenastring_unittest.cc
+++ b/src/google/protobuf/arenastring_unittest.cc
@@ -40,10 +40,9 @@
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
-#include <gtest/gtest.h>
 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
-
+#include <gtest/gtest.h>
 
 
 namespace google {
diff --git a/src/google/protobuf/compiler/code_generator.cc b/src/google/protobuf/compiler/code_generator.cc
index 3319d5c..428ec46 100644
--- a/src/google/protobuf/compiler/code_generator.cc
+++ b/src/google/protobuf/compiler/code_generator.cc
@@ -57,8 +57,9 @@
     const FileDescriptor* file = files[i];
     succeeded = Generate(file, parameter, generator_context, error);
     if (!succeeded && error && error->empty()) {
-      *error = "Code generator returned false but provided no error "
-               "description.";
+      *error =
+          "Code generator returned false but provided no error "
+          "description.";
     }
     if (error && !error->empty()) {
       *error = file->name() + ": " + *error;
diff --git a/src/google/protobuf/compiler/code_generator.h b/src/google/protobuf/compiler/code_generator.h
index b1eb61a..528dc76 100644
--- a/src/google/protobuf/compiler/code_generator.h
+++ b/src/google/protobuf/compiler/code_generator.h
@@ -38,17 +38,19 @@
 #ifndef GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__
 #define GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__
 
-#include <google/protobuf/stubs/common.h>
 #include <string>
-#include <vector>
 #include <utility>
+#include <vector>
+#include <google/protobuf/stubs/common.h>
 
 #include <google/protobuf/port_def.inc>
 
 namespace google {
 namespace protobuf {
 
-namespace io { class ZeroCopyOutputStream; }
+namespace io {
+class ZeroCopyOutputStream;
+}
 class FileDescriptor;
 
 namespace compiler {
diff --git a/src/google/protobuf/compiler/command_line_interface.cc b/src/google/protobuf/compiler/command_line_interface.cc
index 126c433..02987e3 100644
--- a/src/google/protobuf/compiler/command_line_interface.cc
+++ b/src/google/protobuf/compiler/command_line_interface.cc
@@ -45,17 +45,17 @@
 #ifdef minor
 #undef minor
 #endif
-#include <sys/stat.h>
 #include <fcntl.h>
+#include <sys/stat.h>
 #ifndef _MSC_VER
 #include <unistd.h>
 #endif
+#include <ctype.h>
 #include <errno.h>
 #include <fstream>
 #include <iostream>
-#include <ctype.h>
 
-#include <limits.h> //For PATH_MAX
+#include <limits.h>  //For PATH_MAX
 
 #include <memory>
 
@@ -71,6 +71,7 @@
 #include <google/protobuf/compiler/plugin.pb.h>
 #include <google/protobuf/compiler/code_generator.h>
 #include <google/protobuf/compiler/importer.h>
+#include <google/protobuf/io/io_win32.h>
 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
@@ -81,7 +82,6 @@
 #include <google/protobuf/stubs/substitute.h>
 #include <google/protobuf/stubs/map_util.h>
 #include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/stubs/io_win32.h>
 
 
 #include <google/protobuf/port_def.inc>
@@ -94,7 +94,7 @@
 #ifdef _O_BINARY
 #define O_BINARY _O_BINARY
 #else
-#define O_BINARY 0     // If this isn't defined, the platform doesn't need it.
+#define O_BINARY 0  // If this isn't defined, the platform doesn't need it.
 #endif
 #endif
 
@@ -102,12 +102,12 @@
 #if defined(_WIN32)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
-using google::protobuf::internal::win32::access;
-using google::protobuf::internal::win32::close;
-using google::protobuf::internal::win32::mkdir;
-using google::protobuf::internal::win32::open;
-using google::protobuf::internal::win32::setmode;
-using google::protobuf::internal::win32::write;
+using google::protobuf::io::win32::access;
+using google::protobuf::io::win32::close;
+using google::protobuf::io::win32::mkdir;
+using google::protobuf::io::win32::open;
+using google::protobuf::io::win32::setmode;
+using google::protobuf::io::win32::write;
 #endif
 
 static const char* kDefaultDirectDependenciesViolationMsg =
@@ -118,10 +118,8 @@
 // copy in importer.cc?
 static bool IsWindowsAbsolutePath(const std::string& text) {
 #if defined(_WIN32) || defined(__CYGWIN__)
-  return text.size() >= 3 && text[1] == ':' &&
-         isalpha(text[0]) &&
-         (text[2] == '/' || text[2] == '\\') &&
-         text.find_last_of(':') == 1;
+  return text.size() >= 3 && text[1] == ':' && isalpha(text[0]) &&
+         (text[2] == '/' || text[2] == '\\') && text.find_last_of(':') == 1;
 #else
   return false;
 #endif
@@ -281,8 +279,8 @@
       public io::ErrorCollector,
       public DescriptorPool::ErrorCollector {
  public:
-  ErrorPrinter(ErrorFormat format, DiskSourceTree *tree = NULL)
-    : format_(format), tree_(tree), found_errors_(false) {}
+  ErrorPrinter(ErrorFormat format, DiskSourceTree* tree = NULL)
+      : format_(format), tree_(tree), found_errors_(false) {}
   ~ErrorPrinter() {}
 
   // implements MultiFileErrorCollector ------------------------------
@@ -327,8 +325,7 @@
                          std::ostream& out) {
     // Print full path when running under MSVS
     std::string dfile;
-    if (format_ == CommandLineInterface::ERROR_FORMAT_MSVS &&
-        tree_ != NULL &&
+    if (format_ == CommandLineInterface::ERROR_FORMAT_MSVS && tree_ != NULL &&
         tree_->VirtualFileToDiskFile(filename, &dfile)) {
       out << dfile;
     } else {
@@ -344,8 +341,8 @@
           out << ":" << (line + 1) << ":" << (column + 1);
           break;
         case CommandLineInterface::ERROR_FORMAT_MSVS:
-          out << "(" << (line + 1) << ") : "
-              << type << " in column=" << (column + 1);
+          out << "(" << (line + 1) << ") : " << type
+              << " in column=" << (column + 1);
           break;
       }
     }
@@ -358,7 +355,7 @@
   }
 
   const ErrorFormat format_;
-  DiskSourceTree *tree_;
+  DiskSourceTree* tree_;
   bool found_errors_;
 };
 
@@ -417,8 +414,8 @@
 
   // implements ZeroCopyOutputStream ---------------------------------
   virtual bool Next(void** data, int* size) { return inner_->Next(data, size); }
-  virtual void BackUp(int count)            {        inner_->BackUp(count);    }
-  virtual int64 ByteCount() const           { return inner_->ByteCount();      }
+  virtual void BackUp(int count) { inner_->BackUp(count); }
+  virtual int64 ByteCount() const { return inner_->ByteCount(); }
 
  private:
   // Checks to see if "filename_.meta" exists in directory_; if so, fixes the
@@ -447,8 +444,7 @@
 
 CommandLineInterface::GeneratorContextImpl::GeneratorContextImpl(
     const std::vector<const FileDescriptor*>& parsed_files)
-    : parsed_files_(parsed_files),
-      had_error_(false) {}
+    : parsed_files_(parsed_files), had_error_(false) {}
 
 CommandLineInterface::GeneratorContextImpl::~GeneratorContextImpl() {
   STLDeleteValues(&files_);
@@ -480,7 +476,7 @@
     int file_descriptor;
     do {
       file_descriptor =
-        open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666);
+          open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666);
     } while (file_descriptor < 0 && errno == EINTR);
 
     if (file_descriptor < 0) {
@@ -540,7 +536,7 @@
   int file_descriptor;
   do {
     file_descriptor =
-      open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666);
+        open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666);
   } while (file_descriptor < 0 && errno == EINTR);
 
   if (file_descriptor < 0) {
@@ -794,7 +790,8 @@
           kDefaultDirectDependenciesViolationMsg),
       imports_in_descriptor_set_(false),
       source_info_in_descriptor_set_(false),
-      disallow_services_(false) {}
+      disallow_services_(false) {
+}
 CommandLineInterface::~CommandLineInterface() {}
 
 void CommandLineInterface::RegisterGenerator(const std::string& flag_name,
@@ -986,10 +983,10 @@
         break;
       case PRINT_NONE:
         GOOGLE_LOG(ERROR) << "If the code reaches here, it usually means a bug of "
-                     "flag parsing in the CommandLineInterface.";
+                      "flag parsing in the CommandLineInterface.";
         return 1;
 
-      // Do not add a default case.
+        // Do not add a default case.
     }
   }
 
@@ -1021,16 +1018,15 @@
       fd = open(descriptor_set_in_names_[i].c_str(), O_RDONLY | O_BINARY);
     } while (fd < 0 && errno == EINTR);
     if (fd < 0) {
-      std::cerr << descriptor_set_in_names_[i] << ": "
-                << strerror(ENOENT) << std::endl;
+      std::cerr << descriptor_set_in_names_[i] << ": " << strerror(ENOENT)
+                << std::endl;
       return false;
     }
 
     FileDescriptorSet file_descriptor_set;
     bool parsed = file_descriptor_set.ParseFromFileDescriptor(fd);
     if (close(fd) != 0) {
-      std::cerr << descriptor_set_in_names_[i] << ": close: "
-                << strerror(errno)
+      std::cerr << descriptor_set_in_names_[i] << ": close: " << strerror(errno)
                 << std::endl;
       return false;
     }
@@ -1095,8 +1091,10 @@
 
     // Enforce --disallow_services.
     if (disallow_services_ && parsed_file->service_count() > 0) {
-      std::cerr << parsed_file->name() << ": This file contains services, but "
-              "--disallow_services was used." << std::endl;
+      std::cerr << parsed_file->name()
+                << ": This file contains services, but "
+                   "--disallow_services was used."
+                << std::endl;
       return false;
     }
 
@@ -1168,18 +1166,18 @@
   }
 
   std::string virtual_file, shadowing_disk_file;
-  switch (source_tree->DiskFileToVirtualFile(
-      *proto, &virtual_file, &shadowing_disk_file)) {
+  switch (source_tree->DiskFileToVirtualFile(*proto, &virtual_file,
+                                             &shadowing_disk_file)) {
     case DiskSourceTree::SUCCESS:
       *proto = virtual_file;
       break;
     case DiskSourceTree::SHADOWED:
-      std::cerr << *proto
-                << ": Input is shadowed in the --proto_path by \""
+      std::cerr << *proto << ": Input is shadowed in the --proto_path by \""
                 << shadowing_disk_file
                 << "\".  Either use the latter file as your input or reorder "
                    "the --proto_path so that the former file's location "
-                   "comes first." << std::endl;
+                   "comes first."
+                << std::endl;
       return false;
     case DiskSourceTree::CANNOT_OPEN:
       if (in_fallback_database) {
@@ -1242,8 +1240,8 @@
   return true;
 }
 
-CommandLineInterface::ParseArgumentStatus
-CommandLineInterface::ParseArguments(int argc, const char* const argv[]) {
+CommandLineInterface::ParseArgumentStatus CommandLineInterface::ParseArguments(
+    int argc, const char* const argv[]) {
   executable_name_ = argv[0];
 
   std::vector<std::string> arguments;
@@ -1285,8 +1283,7 @@
     }
 
     ParseArgumentStatus status = InterpretArgument(name, value);
-    if (status != PARSE_ARGUMENT_DONE_AND_CONTINUE)
-      return status;
+    if (status != PARSE_ARGUMENT_DONE_AND_CONTINUE) return status;
   }
 
   // Make sure each plugin option has a matching plugin output.
@@ -1298,7 +1295,8 @@
       continue;
     }
     bool foundImplicitPlugin = false;
-    for (std::vector<OutputDirective>::const_iterator j = output_directives_.begin();
+    for (std::vector<OutputDirective>::const_iterator j =
+             output_directives_.begin();
          j != output_directives_.end(); ++j) {
       if (j->generator == NULL) {
         std::string plugin_name = PluginName(plugin_prefix_, j->name);
@@ -1357,11 +1355,13 @@
   }
   if (imports_in_descriptor_set_ && descriptor_set_out_name_.empty()) {
     std::cerr << "--include_imports only makes sense when combined with "
-                 "--descriptor_set_out." << std::endl;
+                 "--descriptor_set_out."
+              << std::endl;
   }
   if (source_info_in_descriptor_set_ && descriptor_set_out_name_.empty()) {
     std::cerr << "--include_source_info only makes sense when combined with "
-                 "--descriptor_set_out." << std::endl;
+                 "--descriptor_set_out."
+              << std::endl;
   }
 
   return PARSE_ARGUMENT_DONE_AND_CONTINUE;
@@ -1411,12 +1411,9 @@
     return false;
   }
 
-  if (*name == "-h" || *name == "--help" ||
-      *name == "--disallow_services" ||
-      *name == "--include_imports" ||
-      *name == "--include_source_info" ||
-      *name == "--version" ||
-      *name == "--decode_raw" ||
+  if (*name == "-h" || *name == "--help" || *name == "--disallow_services" ||
+      *name == "--include_imports" || *name == "--include_source_info" ||
+      *name == "--version" || *name == "--decode_raw" ||
       *name == "--print_free_field_numbers") {
     // HACK:  These are the only flags that don't take a value.
     //   They probably should not be hard-coded like this but for now it's
@@ -1436,10 +1433,12 @@
     if (value.empty()) {
       std::cerr
           << "You seem to have passed an empty string as one of the "
-             "arguments to " << executable_name_
+             "arguments to "
+          << executable_name_
           << ".  This is actually "
              "sort of hard to do.  Congrats.  Unfortunately it is not valid "
-             "input so the program is going to die now." << std::endl;
+             "input so the program is going to die now."
+          << std::endl;
       return PARSE_ARGUMENT_FAIL;
     }
 
@@ -1469,7 +1468,8 @@
       if (disk_path.empty()) {
         std::cerr
             << "--proto_path passed empty directory name.  (Use \".\" for "
-               "current directory.)" << std::endl;
+               "current directory.)"
+            << std::endl;
         return PARSE_ARGUMENT_FAIL;
       }
 
@@ -1494,9 +1494,10 @@
 
   } else if (name == "--direct_dependencies") {
     if (direct_dependencies_explicitly_set_) {
-      std::cerr << name << " may only be passed once. To specify multiple "
-                           "direct dependencies, pass them all as a single "
-                           "parameter separated by ':'."
+      std::cerr << name
+                << " may only be passed once. To specify multiple "
+                   "direct dependencies, pass them all as a single "
+                   "parameter separated by ':'."
                 << std::endl;
       return PARSE_ARGUMENT_FAIL;
     }
@@ -1512,11 +1513,11 @@
 
   } else if (name == "--descriptor_set_in") {
     if (!descriptor_set_in_names_.empty()) {
-      std::cerr << name << " may only be passed once. To specify multiple "
-                           "descriptor sets, pass them all as a single "
-                           "parameter separated by '"
-                << CommandLineInterface::kPathSeparator << "'."
-                << std::endl;
+      std::cerr << name
+                << " may only be passed once. To specify multiple "
+                   "descriptor sets, pass them all as a single "
+                   "parameter separated by '"
+                << CommandLineInterface::kPathSeparator << "'." << std::endl;
       return PARSE_ARGUMENT_FAIL;
     }
     if (value.empty()) {
@@ -1545,7 +1546,8 @@
     if (mode_ != MODE_COMPILE) {
       std::cerr
           << "Cannot use --encode or --decode and generate descriptors at the "
-             "same time." << std::endl;
+             "same time."
+          << std::endl;
       return PARSE_ARGUMENT_FAIL;
     }
     descriptor_set_out_name_ = value;
@@ -1588,9 +1590,8 @@
     if (!version_info_.empty()) {
       std::cout << version_info_ << std::endl;
     }
-    std::cout << "libprotoc "
-         << internal::VersionString(PROTOBUF_VERSION)
-         << std::endl;
+    std::cout << "libprotoc " << internal::VersionString(PROTOBUF_VERSION)
+              << std::endl;
     return PARSE_ARGUMENT_DONE_AND_EXIT;  // Exit without running compiler.
 
   } else if (name == "--disallow_services") {
@@ -1707,7 +1708,8 @@
       // It's an output flag.  Add it to the output directives.
       if (mode_ != MODE_COMPILE) {
         std::cerr << "Cannot use --encode, --decode or print .proto info and "
-                     "generate code at the same time." << std::endl;
+                     "generate code at the same time."
+                  << std::endl;
         return PARSE_ARGUMENT_FAIL;
       }
 
@@ -1743,71 +1745,120 @@
       <<
       "Usage: " << executable_name_
       << " [OPTION] PROTO_FILES\n"
-"Parse PROTO_FILES and generate output based on the options given:\n"
-"  -IPATH, --proto_path=PATH   Specify the directory in which to search for\n"
-"                              imports.  May be specified multiple times;\n"
-"                              directories will be searched in order.  If not\n"
-"                              given, the current working directory is used.\n"
-"                              If not found in any of the these directories,\n"
-"                              the --descriptor_set_in descriptors will be\n"
-"                              checked for required proto file.\n"
-"  --version                   Show version info and exit.\n"
-"  -h, --help                  Show this text and exit.\n"
-"  --encode=MESSAGE_TYPE       Read a text-format message of the given type\n"
-"                              from standard input and write it in binary\n"
-"                              to standard output.  The message type must\n"
-"                              be defined in PROTO_FILES or their imports.\n"
-"  --decode=MESSAGE_TYPE       Read a binary message of the given type from\n"
-"                              standard input and write it in text format\n"
-"                              to standard output.  The message type must\n"
-"                              be defined in PROTO_FILES or their imports.\n"
-"  --decode_raw                Read an arbitrary protocol message from\n"
-"                              standard input and write the raw tag/value\n"
-"                              pairs in text format to standard output.  No\n"
-"                              PROTO_FILES should be given when using this\n"
-"                              flag.\n"
-"  --descriptor_set_in=FILES   Specifies a delimited list of FILES\n"
-"                              each containing a FileDescriptorSet (a\n"
-"                              protocol buffer defined in descriptor.proto).\n"
-"                              The FileDescriptor for each of the PROTO_FILES\n"
-"                              provided will be loaded from these\n"
-"                              FileDescriptorSets. If a FileDescriptor\n"
-"                              appears multiple times, the first occurrence\n"
-"                              will be used.\n"
-"  -oFILE,                     Writes a FileDescriptorSet (a protocol buffer,\n"
-"    --descriptor_set_out=FILE defined in descriptor.proto) containing all of\n"
-"                              the input files to FILE.\n"
-"  --include_imports           When using --descriptor_set_out, also include\n"
-"                              all dependencies of the input files in the\n"
-"                              set, so that the set is self-contained.\n"
-"  --include_source_info       When using --descriptor_set_out, do not strip\n"
-"                              SourceCodeInfo from the FileDescriptorProto.\n"
-"                              This results in vastly larger descriptors that\n"
-"                              include information about the original\n"
-"                              location of each decl in the source file as\n"
-"                              well as surrounding comments.\n"
-"  --dependency_out=FILE       Write a dependency output file in the format\n"
-"                              expected by make. This writes the transitive\n"
-"                              set of input file paths to FILE\n"
-"  --error_format=FORMAT       Set the format in which to print errors.\n"
-"                              FORMAT may be 'gcc' (the default) or 'msvs'\n"
-"                              (Microsoft Visual Studio format).\n"
-"  --print_free_field_numbers  Print the free field numbers of the messages\n"
-"                              defined in the given proto files. Groups share\n"
-"                              the same field number space with the parent \n"
-"                              message. Extension ranges are counted as \n"
-"                              occupied fields numbers.\n"
+         "Parse PROTO_FILES and generate output based on the options given:\n"
+         "  -IPATH, --proto_path=PATH   Specify the directory in which to "
+         "search for\n"
+         "                              imports.  May be specified multiple "
+         "times;\n"
+         "                              directories will be searched in order. "
+         " If not\n"
+         "                              given, the current working directory "
+         "is used.\n"
+         "                              If not found in any of the these "
+         "directories,\n"
+         "                              the --descriptor_set_in descriptors "
+         "will be\n"
+         "                              checked for required proto file.\n"
+         "  --version                   Show version info and exit.\n"
+         "  -h, --help                  Show this text and exit.\n"
+         "  --encode=MESSAGE_TYPE       Read a text-format message of the "
+         "given type\n"
+         "                              from standard input and write it in "
+         "binary\n"
+         "                              to standard output.  The message type "
+         "must\n"
+         "                              be defined in PROTO_FILES or their "
+         "imports.\n"
+         "  --decode=MESSAGE_TYPE       Read a binary message of the given "
+         "type from\n"
+         "                              standard input and write it in text "
+         "format\n"
+         "                              to standard output.  The message type "
+         "must\n"
+         "                              be defined in PROTO_FILES or their "
+         "imports.\n"
+         "  --decode_raw                Read an arbitrary protocol message "
+         "from\n"
+         "                              standard input and write the raw "
+         "tag/value\n"
+         "                              pairs in text format to standard "
+         "output.  No\n"
+         "                              PROTO_FILES should be given when using "
+         "this\n"
+         "                              flag.\n"
+         "  --descriptor_set_in=FILES   Specifies a delimited list of FILES\n"
+         "                              each containing a FileDescriptorSet "
+         "(a\n"
+         "                              protocol buffer defined in "
+         "descriptor.proto).\n"
+         "                              The FileDescriptor for each of the "
+         "PROTO_FILES\n"
+         "                              provided will be loaded from these\n"
+         "                              FileDescriptorSets. If a "
+         "FileDescriptor\n"
+         "                              appears multiple times, the first "
+         "occurrence\n"
+         "                              will be used.\n"
+         "  -oFILE,                     Writes a FileDescriptorSet (a protocol "
+         "buffer,\n"
+         "    --descriptor_set_out=FILE defined in descriptor.proto) "
+         "containing all of\n"
+         "                              the input files to FILE.\n"
+         "  --include_imports           When using --descriptor_set_out, also "
+         "include\n"
+         "                              all dependencies of the input files in "
+         "the\n"
+         "                              set, so that the set is "
+         "self-contained.\n"
+         "  --include_source_info       When using --descriptor_set_out, do "
+         "not strip\n"
+         "                              SourceCodeInfo from the "
+         "FileDescriptorProto.\n"
+         "                              This results in vastly larger "
+         "descriptors that\n"
+         "                              include information about the "
+         "original\n"
+         "                              location of each decl in the source "
+         "file as\n"
+         "                              well as surrounding comments.\n"
+         "  --dependency_out=FILE       Write a dependency output file in the "
+         "format\n"
+         "                              expected by make. This writes the "
+         "transitive\n"
+         "                              set of input file paths to FILE\n"
+         "  --error_format=FORMAT       Set the format in which to print "
+         "errors.\n"
+         "                              FORMAT may be 'gcc' (the default) or "
+         "'msvs'\n"
+         "                              (Microsoft Visual Studio format).\n"
+         "  --print_free_field_numbers  Print the free field numbers of the "
+         "messages\n"
+         "                              defined in the given proto files. "
+         "Groups share\n"
+         "                              the same field number space with the "
+         "parent \n"
+         "                              message. Extension ranges are counted "
+         "as \n"
+         "                              occupied fields numbers.\n"
       << std::endl;
   if (!plugin_prefix_.empty()) {
-    std::cout <<
-"  --plugin=EXECUTABLE         Specifies a plugin executable to use.\n"
-"                              Normally, protoc searches the PATH for\n"
-"                              plugins, but you may specify additional\n"
-"                              executables not in the path using this flag.\n"
-"                              Additionally, EXECUTABLE may be of the form\n"
-"                              NAME=PATH, in which case the given plugin name\n"
-"                              is mapped to the given executable even if\n"
-"                              the executable's own name differs." << std::endl;
+    std::cout
+        << "  --plugin=EXECUTABLE         Specifies a plugin executable to "
+           "use.\n"
+           "                              Normally, protoc searches the PATH "
+           "for\n"
+           "                              plugins, but you may specify "
+           "additional\n"
+           "                              executables not in the path using "
+           "this flag.\n"
+           "                              Additionally, EXECUTABLE may be of "
+           "the form\n"
+           "                              NAME=PATH, in which case the given "
+           "plugin name\n"
+           "                              is mapped to the given executable "
+           "even if\n"
+           "                              the executable's own name differs."
+        << std::endl;
   }
 
   for (GeneratorMap::iterator iter = generators_by_flag_name_.begin();
@@ -1820,20 +1871,30 @@
                              ' ')  // Spaces for alignment.
               << iter->second.help_text << std::endl;
   }
-  std::cout <<
-"  @<filename>                 Read options and filenames from file. If a\n"
-"                              relative file path is specified, the file\n"
-"                              will be searched in the working directory.\n"
-"                              The --proto_path option will not affect how\n"
-"                              this argument file is searched. Content of\n"
-"                              the file will be expanded in the position of\n"
-"                              @<filename> as in the argument list. Note\n"
-"                              that shell expansion is not applied to the\n"
-"                              content of the file (i.e., you cannot use\n"
-"                              quotes, wildcards, escapes, commands, etc.).\n"
-"                              Each line corresponds to a single argument,\n"
-"                              even if it contains spaces."
-      << std::endl;
+  std::cout << "  @<filename>                 Read options and filenames from "
+               "file. If a\n"
+               "                              relative file path is specified, "
+               "the file\n"
+               "                              will be searched in the working "
+               "directory.\n"
+               "                              The --proto_path option will not "
+               "affect how\n"
+               "                              this argument file is searched. "
+               "Content of\n"
+               "                              the file will be expanded in the "
+               "position of\n"
+               "                              @<filename> as in the argument "
+               "list. Note\n"
+               "                              that shell expansion is not "
+               "applied to the\n"
+               "                              content of the file (i.e., you "
+               "cannot use\n"
+               "                              quotes, wildcards, escapes, "
+               "commands, etc.).\n"
+               "                              Each line corresponds to a "
+               "single argument,\n"
+               "                              even if it contains spaces."
+            << std::endl;
 }
 
 bool CommandLineInterface::GenerateOutput(
@@ -1856,8 +1917,7 @@
       }
       parameters.append(plugin_parameters_[plugin_name]);
     }
-    if (!GeneratePluginOutput(parsed_files, plugin_name,
-                              parameters,
+    if (!GeneratePluginOutput(parsed_files, plugin_name, parameters,
                               generator_context, &error)) {
       std::cerr << output_directive.name << ": " << error << std::endl;
       return false;
@@ -1871,8 +1931,8 @@
       }
       parameters.append(generator_parameters_[output_directive.name]);
     }
-    if (!output_directive.generator->GenerateAll(
-        parsed_files, parameters, generator_context, &error)) {
+    if (!output_directive.generator->GenerateAll(parsed_files, parameters,
+                                                 generator_context, &error)) {
       // Generator returned an error.
       std::cerr << output_directive.name << ": " << error << std::endl;
       return false;
@@ -1890,10 +1950,7 @@
 
   std::set<const FileDescriptor*> already_seen;
   for (int i = 0; i < parsed_files.size(); i++) {
-    GetTransitiveDependencies(parsed_files[i],
-                              false,
-                              false,
-                              &already_seen,
+    GetTransitiveDependencies(parsed_files[i], false, false, &already_seen,
                               file_set.mutable_file());
   }
 
@@ -2022,8 +2079,9 @@
       current_output.reset(generator_context->Open(output_file.name()));
     } else if (current_output == NULL) {
       *error = strings::Substitute(
-        "$0: First file chunk returned by plugin did not specify a file name.",
-        plugin_name);
+          "$0: First file chunk returned by plugin did not specify a file "
+          "name.",
+          plugin_name);
       return false;
     }
 
@@ -2132,8 +2190,8 @@
   for (int i = 0; i < parsed_files.size(); i++) {
     GetTransitiveDependencies(parsed_files[i],
                               true,  // Include json_name
-                              source_info_in_descriptor_set_,
-                              &already_seen, file_set.mutable_file());
+                              source_info_in_descriptor_set_, &already_seen,
+                              file_set.mutable_file());
   }
 
   int fd;
@@ -2164,8 +2222,7 @@
 }
 
 void CommandLineInterface::GetTransitiveDependencies(
-    const FileDescriptor* file,
-    bool include_json_name,
+    const FileDescriptor* file, bool include_json_name,
     bool include_source_code_info,
     std::set<const FileDescriptor*>* already_seen,
     RepeatedPtrField<FileDescriptorProto>* output) {
@@ -2176,10 +2233,8 @@
 
   // Add all dependencies.
   for (int i = 0; i < file->dependency_count(); i++) {
-    GetTransitiveDependencies(file->dependency(i),
-                              include_json_name,
-                              include_source_code_info,
-                              already_seen, output);
+    GetTransitiveDependencies(file->dependency(i), include_json_name,
+                              include_source_code_info, already_seen, output);
   }
 
   // Add this file.
@@ -2291,8 +2346,7 @@
 
 }  // namespace
 
-void CommandLineInterface::PrintFreeFieldNumbers(
-    const Descriptor* descriptor) {
+void CommandLineInterface::PrintFreeFieldNumbers(const Descriptor* descriptor) {
   std::set<FieldRange> ranges;
   std::vector<const Descriptor*> nested_messages;
   GatherOccupiedFieldRanges(descriptor, &ranges, &nested_messages);
@@ -2304,7 +2358,6 @@
 }
 
 
-
 }  // namespace compiler
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/compiler/command_line_interface.h b/src/google/protobuf/compiler/command_line_interface.h
index 520585c..6c9893f 100644
--- a/src/google/protobuf/compiler/command_line_interface.h
+++ b/src/google/protobuf/compiler/command_line_interface.h
@@ -52,14 +52,15 @@
 namespace google {
 namespace protobuf {
 
-class Descriptor;            // descriptor.h
-class DescriptorDatabase;    // descriptor_database.h
-class DescriptorPool;        // descriptor.h
-class FileDescriptor;        // descriptor.h
-class FileDescriptorSet;     // descriptor.h
-class FileDescriptorProto;   // descriptor.pb.h
-template<typename T> class RepeatedPtrField;  // repeated_field.h
-class SimpleDescriptorDatabase;               // descriptor_database.h
+class Descriptor;           // descriptor.h
+class DescriptorDatabase;   // descriptor_database.h
+class DescriptorPool;       // descriptor.h
+class FileDescriptor;       // descriptor.h
+class FileDescriptorSet;    // descriptor.h
+class FileDescriptorProto;  // descriptor.pb.h
+template <typename T>
+class RepeatedPtrField;          // repeated_field.h
+class SimpleDescriptorDatabase;  // descriptor_database.h
 
 namespace compiler {
 
@@ -307,8 +308,7 @@
   // If include_json_name is true, populate the json_name field of
   // FieldDescriptorProto for all fields.
   static void GetTransitiveDependencies(
-      const FileDescriptor* file,
-      bool include_json_name,
+      const FileDescriptor* file, bool include_json_name,
       bool include_source_code_info,
       std::set<const FileDescriptor*>* already_seen,
       RepeatedPtrField<FileDescriptorProto>* output);
@@ -374,15 +374,15 @@
   Mode mode_;
 
   enum PrintMode {
-    PRINT_NONE,               // Not in MODE_PRINT
-    PRINT_FREE_FIELDS,        // --print_free_fields
+    PRINT_NONE,         // Not in MODE_PRINT
+    PRINT_FREE_FIELDS,  // --print_free_fields
   };
 
   PrintMode print_mode_;
 
   enum ErrorFormat {
-    ERROR_FORMAT_GCC,   // GCC error output format (default).
-    ERROR_FORMAT_MSVS   // Visual Studio output (--error_format=msvs).
+    ERROR_FORMAT_GCC,  // GCC error output format (default).
+    ERROR_FORMAT_MSVS  // Visual Studio output (--error_format=msvs).
   };
 
   ErrorFormat error_format_;
@@ -403,8 +403,8 @@
   // output_directives_ lists all the files we are supposed to output and what
   // generator to use for each.
   struct OutputDirective {
-    std::string name;           // E.g. "--foo_out"
-    CodeGenerator* generator;   // NULL for plugins
+    std::string name;          // E.g. "--foo_out"
+    CodeGenerator* generator;  // NULL for plugins
     std::string parameter;
     std::string output_location;
   };
diff --git a/src/google/protobuf/compiler/command_line_interface_unittest.cc b/src/google/protobuf/compiler/command_line_interface_unittest.cc
index e4b393c..c6fad5f 100644
--- a/src/google/protobuf/compiler/command_line_interface_unittest.cc
+++ b/src/google/protobuf/compiler/command_line_interface_unittest.cc
@@ -51,6 +51,7 @@
 #include <google/protobuf/compiler/command_line_interface.h>
 #include <google/protobuf/test_util2.h>
 #include <google/protobuf/unittest.pb.h>
+#include <google/protobuf/io/io_win32.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/descriptor.pb.h>
@@ -62,7 +63,6 @@
 #include <gtest/gtest.h>
 
 #include <google/protobuf/stubs/strutil.h>
-#include <google/protobuf/stubs/io_win32.h>
 
 namespace google {
 namespace protobuf {
@@ -71,12 +71,12 @@
 #if defined(_WIN32)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
-using google::protobuf::internal::win32::access;
-using google::protobuf::internal::win32::dup;
-using google::protobuf::internal::win32::dup2;
-using google::protobuf::internal::win32::close;
-using google::protobuf::internal::win32::open;
-using google::protobuf::internal::win32::write;
+using google::protobuf::io::win32::access;
+using google::protobuf::io::win32::close;
+using google::protobuf::io::win32::dup;
+using google::protobuf::io::win32::dup2;
+using google::protobuf::io::win32::open;
+using google::protobuf::io::win32::write;
 #endif
 
 // Disable the whole test when we use tcmalloc for "draconian" heap checks, in
@@ -122,7 +122,7 @@
   void SwitchToTempDirectory() {
     File::ChangeWorkingDirectory(temp_directory_);
   }
-#else  // !PROTOBUF_OPENSOURCE
+#else   // !PROTOBUF_OPENSOURCE
   // TODO(teboring): Figure out how to change and get working directory in
   // google3.
 #endif  // !PROTOBUF_OPENSOURCE
@@ -303,21 +303,24 @@
     plugin_path = GOOGLE_PROTOBUF_TEST_PLUGIN_PATH;
 #else
     const char* possible_paths[] = {
-      // When building with shared libraries, libtool hides the real executable
-      // in .libs and puts a fake wrapper in the current directory.
-      // Unfortunately, due to an apparent bug on Cygwin/MinGW, if one program
-      // wrapped in this way (e.g. protobuf-tests.exe) tries to execute another
-      // program wrapped in this way (e.g. test_plugin.exe), the latter fails
-      // with error code 127 and no explanation message.  Presumably the problem
-      // is that the wrapper for protobuf-tests.exe set some environment
-      // variables that confuse the wrapper for test_plugin.exe.  Luckily, it
-      // turns out that if we simply invoke the wrapped test_plugin.exe
-      // directly, it works -- I guess the environment variables set by the
-      // protobuf-tests.exe wrapper happen to be correct for it too.  So we do
-      // that.
-      ".libs/test_plugin.exe",  // Win32 w/autotool (Cygwin / MinGW)
-      "test_plugin.exe",        // Other Win32 (MSVC)
-      "test_plugin",            // Unix
+        // When building with shared libraries, libtool hides the real
+        // executable
+        // in .libs and puts a fake wrapper in the current directory.
+        // Unfortunately, due to an apparent bug on Cygwin/MinGW, if one program
+        // wrapped in this way (e.g. protobuf-tests.exe) tries to execute
+        // another
+        // program wrapped in this way (e.g. test_plugin.exe), the latter fails
+        // with error code 127 and no explanation message.  Presumably the
+        // problem
+        // is that the wrapper for protobuf-tests.exe set some environment
+        // variables that confuse the wrapper for test_plugin.exe.  Luckily, it
+        // turns out that if we simply invoke the wrapped test_plugin.exe
+        // directly, it works -- I guess the environment variables set by the
+        // protobuf-tests.exe wrapper happen to be correct for it too.  So we do
+        // that.
+        ".libs/test_plugin.exe",  // Win32 w/autotool (Cygwin / MinGW)
+        "test_plugin.exe",        // Other Win32 (MSVC)
+        "test_plugin",            // Unix
     };
     for (int i = 0; i < GOOGLE_ARRAYSIZE(possible_paths); i++) {
       if (access(possible_paths[i], F_OK) == 0) {
@@ -335,7 +338,7 @@
     }
   }
 
-  std::unique_ptr<const char * []> argv(new const char* [args.size()]);
+  std::unique_ptr<const char*[]> argv(new const char*[args.size()]);
 
   for (int i = 0; i < args.size(); i++) {
     args[i] = StringReplace(args[i], "$tmpdir", temp_directory_, true);
@@ -419,36 +422,34 @@
 void CommandLineInterfaceTest::ExpectGenerated(
     const std::string& generator_name, const std::string& parameter,
     const std::string& proto_name, const std::string& message_name) {
-  MockCodeGenerator::ExpectGenerated(
-      generator_name, parameter, "", proto_name, message_name, proto_name,
-      temp_directory_);
+  MockCodeGenerator::ExpectGenerated(generator_name, parameter, "", proto_name,
+                                     message_name, proto_name, temp_directory_);
 }
 
 void CommandLineInterfaceTest::ExpectGenerated(
     const std::string& generator_name, const std::string& parameter,
     const std::string& proto_name, const std::string& message_name,
     const std::string& output_directory) {
-  MockCodeGenerator::ExpectGenerated(
-      generator_name, parameter, "", proto_name, message_name, proto_name,
-      temp_directory_ + "/" + output_directory);
+  MockCodeGenerator::ExpectGenerated(generator_name, parameter, "", proto_name,
+                                     message_name, proto_name,
+                                     temp_directory_ + "/" + output_directory);
 }
 
 void CommandLineInterfaceTest::ExpectGeneratedWithMultipleInputs(
     const std::string& generator_name, const std::string& all_proto_names,
     const std::string& proto_name, const std::string& message_name) {
-  MockCodeGenerator::ExpectGenerated(
-      generator_name, "", "", proto_name, message_name,
-      all_proto_names,
-      temp_directory_);
+  MockCodeGenerator::ExpectGenerated(generator_name, "", "", proto_name,
+                                     message_name, all_proto_names,
+                                     temp_directory_);
 }
 
 void CommandLineInterfaceTest::ExpectGeneratedWithInsertions(
     const std::string& generator_name, const std::string& parameter,
     const std::string& insertions, const std::string& proto_name,
     const std::string& message_name) {
-  MockCodeGenerator::ExpectGenerated(
-      generator_name, parameter, insertions, proto_name, message_name,
-      proto_name, temp_directory_);
+  MockCodeGenerator::ExpectGenerated(generator_name, parameter, insertions,
+                                     proto_name, message_name, proto_name,
+                                     temp_directory_);
 }
 
 void CommandLineInterfaceTest::CheckGeneratedAnnotations(
@@ -489,8 +490,8 @@
 void CommandLineInterfaceTest::ExpectCapturedStdoutSubstringWithZeroReturnCode(
     const std::string& expected_substring) {
   EXPECT_EQ(0, return_code_);
-  EXPECT_PRED_FORMAT2(
-      testing::IsSubstring, expected_substring, captured_stdout_);
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_substring,
+                      captured_stdout_);
 }
 
 void CommandLineInterfaceTest::ExpectFileContent(const std::string& filename,
@@ -509,8 +510,8 @@
   // Test that the common case works.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -539,8 +540,8 @@
   // Test that basic plugins work.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --plug_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -570,8 +571,8 @@
   // Invoke a generator and a plugin at the same time.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -603,11 +604,11 @@
   // Test parsing multiple input files.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "message Bar {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Bar {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto bar.proto");
@@ -655,17 +656,17 @@
   // Test parsing multiple input files with an import of a separate file.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "import \"baz.proto\";\n"
-    "message Bar {\n"
-    "  optional Baz a = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"baz.proto\";\n"
+                 "message Bar {\n"
+                 "  optional Baz a = 1;\n"
+                 "}\n");
   CreateTempFile("baz.proto",
-    "syntax = \"proto2\";\n"
-    "message Baz {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Baz {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto bar.proto");
@@ -841,8 +842,8 @@
   // Test that when we output to a sub-directory, it is created.
 
   CreateTempFile("bar/baz/foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempDir("out");
   CreateTempDir("plugout");
 
@@ -858,8 +859,8 @@
   // Test that generator parameters are correctly parsed from the command line.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --test_out=TestParameter:$tmpdir "
       "--plug_out=TestPluginParameter:$tmpdir "
@@ -875,8 +876,8 @@
   // correctly passed to the code generator.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   // Create the "a" and "b" sub-directories.
   CreateTempDir("a");
   CreateTempDir("b");
@@ -890,10 +891,10 @@
       "--proto_path=$tmpdir foo.proto");
 
   ExpectNoErrors();
-  ExpectGenerated(
-      "test_generator", "bar,foo1,foo2,foo3", "foo.proto", "Foo", "a");
-  ExpectGenerated(
-      "test_generator", "baz,foo1,foo2,foo3", "foo.proto", "Foo", "b");
+  ExpectGenerated("test_generator", "bar,foo1,foo2,foo3", "foo.proto", "Foo",
+                  "a");
+  ExpectGenerated("test_generator", "baz,foo1,foo2,foo3", "foo.proto", "Foo",
+                  "b");
 }
 
 TEST_F(CommandLineInterfaceTest, ExtraPluginParameters) {
@@ -901,8 +902,8 @@
   // correctly passed to the code generator.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   // Create the "a" and "b" sub-directories.
   CreateTempDir("a");
   CreateTempDir("b");
@@ -916,16 +917,14 @@
       "--proto_path=$tmpdir foo.proto");
 
   ExpectNoErrors();
-  ExpectGenerated(
-      "test_plugin", "bar,foo1,foo2,foo3", "foo.proto", "Foo", "a");
-  ExpectGenerated(
-      "test_plugin", "baz,foo1,foo2,foo3", "foo.proto", "Foo", "b");
+  ExpectGenerated("test_plugin", "bar,foo1,foo2,foo3", "foo.proto", "Foo", "a");
+  ExpectGenerated("test_plugin", "baz,foo1,foo2,foo3", "foo.proto", "Foo", "b");
 }
 
 TEST_F(CommandLineInterfaceTest, UnrecognizedExtraParameters) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --plug_out=TestParameter:$tmpdir "
       "--unknown_plug_a_opt=Foo "
@@ -948,8 +947,8 @@
   // directives appear, they both are reported.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --plug_out=TestParameter:$tmpdir "
       "--xyz_opt=foo=bar --xyz_out=$tmpdir "
@@ -964,8 +963,8 @@
   // Test running a generator that inserts code into another's output.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler "
       "--test_out=TestParameter:$tmpdir "
@@ -975,12 +974,12 @@
       "--proto_path=$tmpdir foo.proto");
 
   ExpectNoErrors();
-  ExpectGeneratedWithInsertions(
-      "test_generator", "TestParameter", "test_generator,test_plugin",
-      "foo.proto", "Foo");
-  ExpectGeneratedWithInsertions(
-      "test_plugin", "TestPluginParameter", "test_generator,test_plugin",
-      "foo.proto", "Foo");
+  ExpectGeneratedWithInsertions("test_generator", "TestParameter",
+                                "test_generator,test_plugin", "foo.proto",
+                                "Foo");
+  ExpectGeneratedWithInsertions("test_plugin", "TestPluginParameter",
+                                "test_generator,test_plugin", "foo.proto",
+                                "Foo");
 }
 
 TEST_F(CommandLineInterfaceTest, InsertWithAnnotationFixup) {
@@ -1007,8 +1006,7 @@
 TEST_F(CommandLineInterfaceTest, WindowsOutputPath) {
   // Test that the output path can be a Windows-style path.
 
-  CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n");
+  CreateTempFile("foo.proto", "syntax = \"proto2\";\n");
 
   Run("protocol_compiler --null_out=C:\\ "
       "--proto_path=$tmpdir foo.proto");
@@ -1020,8 +1018,7 @@
 TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) {
   // Test that we can have a windows-style output path and a parameter.
 
-  CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n");
+  CreateTempFile("foo.proto", "syntax = \"proto2\";\n");
 
   Run("protocol_compiler --null_out=bar:C:\\ "
       "--proto_path=$tmpdir foo.proto");
@@ -1035,8 +1032,8 @@
   // doesn't work on their system.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir\\ "
       "--proto_path=$tmpdir\\ foo.proto");
@@ -1056,14 +1053,14 @@
   // Test that specifying multiple directories in the proto search path works.
 
   CreateTempFile("b/bar.proto",
-    "syntax = \"proto2\";\n"
-    "message Bar {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Bar {}\n");
   CreateTempFile("a/foo.proto",
-    "syntax = \"proto2\";\n"
-    "import \"bar.proto\";\n"
-    "message Foo {\n"
-    "  optional Bar a = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"bar.proto\";\n"
+                 "message Foo {\n"
+                 "  optional Bar a = 1;\n"
+                 "}\n");
   CreateTempFile("b/foo.proto", "this should not be parsed\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
@@ -1077,14 +1074,14 @@
   // Same as PathLookup, but we provide the proto_path in a single flag.
 
   CreateTempFile("b/bar.proto",
-    "syntax = \"proto2\";\n"
-    "message Bar {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Bar {}\n");
   CreateTempFile("a/foo.proto",
-    "syntax = \"proto2\";\n"
-    "import \"bar.proto\";\n"
-    "message Foo {\n"
-    "  optional Bar a = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"bar.proto\";\n"
+                 "message Foo {\n"
+                 "  optional Bar a = 1;\n"
+                 "}\n");
   CreateTempFile("b/foo.proto", "this should not be parsed\n");
 
   Run(strings::Substitute(
@@ -1100,8 +1097,8 @@
   // Test setting up a search path mapping a directory to a non-root location.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=bar=$tmpdir bar/foo.proto");
@@ -1115,8 +1112,8 @@
 
   CreateTempDir("with=sign");
   CreateTempFile("with=sign/foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir/with=sign foo.proto");
@@ -1130,8 +1127,8 @@
   // each with a different output directory.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   // Create the "a" and "b" sub-directories.
   CreateTempDir("a");
   CreateTempDir("b");
@@ -1151,8 +1148,8 @@
   // services.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --disallow_services --test_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -1165,9 +1162,9 @@
   // Test that --disallow_services produces an error when there are services.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n"
-    "service Bar {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n"
+                 "service Bar {}\n");
 
   Run("protocol_compiler --disallow_services --test_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -1179,9 +1176,9 @@
   // Test that services work fine as long as --disallow_services is not used.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n"
-    "service Bar {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n"
+                 "service Bar {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -1263,8 +1260,7 @@
 }
 
 TEST_F(CommandLineInterfaceTest, DirectDependencies_ProvidedMultipleTimes) {
-  CreateTempFile("foo.proto",
-                 "syntax = \"proto2\";\n");
+  CreateTempFile("foo.proto", "syntax = \"proto2\";\n");
 
   Run("protocol_compiler --test_out=$tmpdir --proto_path=$tmpdir "
       "--direct_dependencies=bar.proto --direct_dependencies=bla.proto "
@@ -1301,8 +1297,8 @@
   // Test that we can accept working-directory-relative input files.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir $tmpdir/foo.proto");
@@ -1313,14 +1309,14 @@
 
 TEST_F(CommandLineInterfaceTest, WriteDescriptorSet) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "import \"foo.proto\";\n"
-    "message Bar {\n"
-    "  optional Foo foo = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"foo.proto\";\n"
+                 "message Bar {\n"
+                 "  optional Foo foo = 1;\n"
+                 "}\n");
 
   Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set "
       "--proto_path=$tmpdir bar.proto");
@@ -1342,20 +1338,20 @@
 
 TEST_F(CommandLineInterfaceTest, WriteDescriptorSetWithDuplicates) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "import \"foo.proto\";\n"
-    "message Bar {\n"
-    "  optional Foo foo = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"foo.proto\";\n"
+                 "message Bar {\n"
+                 "  optional Foo foo = 1;\n"
+                 "}\n");
   CreateTempFile("baz.proto",
-    "syntax = \"proto2\";\n"
-    "import \"foo.proto\";\n"
-    "message Baz {\n"
-    "  optional Foo foo = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"foo.proto\";\n"
+                 "message Baz {\n"
+                 "  optional Foo foo = 1;\n"
+                 "}\n");
 
   Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set "
       "--proto_path=$tmpdir bar.proto foo.proto bar.proto baz.proto");
@@ -1381,14 +1377,14 @@
 
 TEST_F(CommandLineInterfaceTest, WriteDescriptorSetWithSourceInfo) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "import \"foo.proto\";\n"
-    "message Bar {\n"
-    "  optional Foo foo = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"foo.proto\";\n"
+                 "message Bar {\n"
+                 "  optional Foo foo = 1;\n"
+                 "}\n");
 
   Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set "
       "--include_source_info --proto_path=$tmpdir bar.proto");
@@ -1406,14 +1402,14 @@
 
 TEST_F(CommandLineInterfaceTest, WriteTransitiveDescriptorSet) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "import \"foo.proto\";\n"
-    "message Bar {\n"
-    "  optional Foo foo = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"foo.proto\";\n"
+                 "message Bar {\n"
+                 "  optional Foo foo = 1;\n"
+                 "}\n");
 
   Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set "
       "--include_imports --proto_path=$tmpdir bar.proto");
@@ -1437,14 +1433,14 @@
 
 TEST_F(CommandLineInterfaceTest, WriteTransitiveDescriptorSetWithSourceInfo) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "import \"foo.proto\";\n"
-    "message Bar {\n"
-    "  optional Foo foo = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"foo.proto\";\n"
+                 "message Bar {\n"
+                 "  optional Foo foo = 1;\n"
+                 "}\n");
 
   Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set "
       "--include_imports --include_source_info --proto_path=$tmpdir bar.proto");
@@ -1471,14 +1467,14 @@
 #else
 TEST_F(CommandLineInterfaceTest, WriteDependencyManifestFileGivenTwoInputs) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "import \"foo.proto\";\n"
-    "message Bar {\n"
-    "  optional Foo foo = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"foo.proto\";\n"
+                 "message Bar {\n"
+                 "  optional Foo foo = 1;\n"
+                 "}\n");
 
   Run("protocol_compiler --dependency_out=$tmpdir/manifest "
       "--test_out=$tmpdir --proto_path=$tmpdir bar.proto foo.proto");
@@ -1490,14 +1486,14 @@
 #ifdef PROTOBUF_OPENSOURCE
 TEST_F(CommandLineInterfaceTest, WriteDependencyManifestFile) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "import \"foo.proto\";\n"
-    "message Bar {\n"
-    "  optional Foo foo = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"foo.proto\";\n"
+                 "message Bar {\n"
+                 "  optional Foo foo = 1;\n"
+                 "}\n");
 
   std::string current_working_directory = getcwd(NULL, 0);
   SwitchToTempDirectory();
@@ -1520,14 +1516,14 @@
 
 TEST_F(CommandLineInterfaceTest, WriteDependencyManifestFileForAbsolutePath) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "import \"foo.proto\";\n"
-    "message Bar {\n"
-    "  optional Foo foo = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"foo.proto\";\n"
+                 "message Bar {\n"
+                 "  optional Foo foo = 1;\n"
+                 "}\n");
 
   Run("protocol_compiler --dependency_out=$tmpdir/manifest "
       "--test_out=$tmpdir --proto_path=$tmpdir bar.proto");
@@ -1544,11 +1540,11 @@
   // Test parsing multiple input files using an argument file.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "message Bar {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Bar {}\n");
   CreateTempFile("arguments.txt",
                  "--test_out=$tmpdir\n"
                  "--plug_out=$tmpdir\n"
@@ -1577,14 +1573,14 @@
   // Test that parse errors are reported.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "badsyntax\n");
+                 "syntax = \"proto2\";\n"
+                 "badsyntax\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
 
   ExpectErrorText(
-    "foo.proto:2:1: Expected top-level statement (e.g. \"message\").\n");
+      "foo.proto:2:1: Expected top-level statement (e.g. \"message\").\n");
 }
 
 TEST_F(CommandLineInterfaceTest, ParseErrors_DescriptorSetIn) {
@@ -1594,8 +1590,7 @@
   Run("protocol_compiler --test_out=$tmpdir "
       "--descriptor_set_in=$tmpdir/foo.bin foo.proto");
 
-  ExpectErrorText(
-    "$tmpdir/foo.bin: Unable to parse.\n");
+  ExpectErrorText("$tmpdir/foo.bin: Unable to parse.\n");
 }
 
 TEST_F(CommandLineInterfaceTest, ParseErrorsMultipleFiles) {
@@ -1605,37 +1600,38 @@
   // two ways:  Directly and through baz.proto.  bar.proto's errors should
   // only be reported once.
   CreateTempFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "badsyntax\n");
+                 "syntax = \"proto2\";\n"
+                 "badsyntax\n");
   CreateTempFile("baz.proto",
-    "syntax = \"proto2\";\n"
-    "import \"bar.proto\";\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"bar.proto\";\n");
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "import \"bar.proto\";\n"
-    "import \"baz.proto\";\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"bar.proto\";\n"
+                 "import \"baz.proto\";\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
 
   ExpectErrorText(
-    "bar.proto:2:1: Expected top-level statement (e.g. \"message\").\n"
-    "baz.proto: Import \"bar.proto\" was not found or had errors.\n"
-    "foo.proto: Import \"bar.proto\" was not found or had errors.\n"
-    "foo.proto: Import \"baz.proto\" was not found or had errors.\n");
+      "bar.proto:2:1: Expected top-level statement (e.g. \"message\").\n"
+      "baz.proto:2:1: Import \"bar.proto\" was not found or had errors.\n"
+      "foo.proto:2:1: Import \"bar.proto\" was not found or had errors.\n"
+      "foo.proto:3:1: Import \"baz.proto\" was not found or had errors.\n");
 }
 
 TEST_F(CommandLineInterfaceTest, RecursiveImportFails) {
   // Create a proto file that imports itself.
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "import \"foo.proto\";\n");
+                 "syntax = \"proto2\";\n"
+                 "import \"foo.proto\";\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
 
   ExpectErrorSubstring(
-    "foo.proto: File recursively imports itself: foo.proto -> foo.proto\n");
+      "foo.proto:2:1: File recursively imports itself: "
+      "foo.proto -> foo.proto\n");
 }
 
 TEST_F(CommandLineInterfaceTest, InputNotFoundError) {
@@ -1653,8 +1649,7 @@
   Run("protocol_compiler --test_out=$tmpdir "
       "--descriptor_set_in=$tmpdir/foo.bin foo.proto");
 
-  ExpectErrorText(
-    "$tmpdir/foo.bin: No such file or directory\n");
+  ExpectErrorText("$tmpdir/foo.bin: No such file or directory\n");
 }
 
 TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotFoundError) {
@@ -1664,8 +1659,7 @@
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir $tmpdir/foo.proto");
 
-  ExpectErrorText(
-    "$tmpdir/foo.proto: No such file or directory\n");
+  ExpectErrorText("$tmpdir/foo.proto: No such file or directory\n");
 }
 
 TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotMappedError) {
@@ -1673,8 +1667,8 @@
   // mapped to a virtual path.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   // Create a directory called "bar" so that we can point --proto_path at it.
   CreateTempFile("bar/dummy", "");
@@ -1683,7 +1677,7 @@
       "--proto_path=$tmpdir/bar $tmpdir/foo.proto");
 
   ExpectErrorText(
-    "$tmpdir/foo.proto: File does not reside within any path "
+      "$tmpdir/foo.proto: File does not reside within any path "
       "specified using --proto_path (or -I).  You must specify a "
       "--proto_path which encompasses this file.  Note that the "
       "proto_path must be an exact prefix of the .proto file "
@@ -1702,8 +1696,7 @@
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir/bar $tmpdir/foo.proto");
 
-  ExpectErrorText(
-    "$tmpdir/foo.proto: No such file or directory\n");
+  ExpectErrorText("$tmpdir/foo.proto: No such file or directory\n");
 }
 
 TEST_F(CommandLineInterfaceTest, CwdRelativeInputShadowedError) {
@@ -1711,21 +1704,21 @@
   // by another file in the virtual path.
 
   CreateTempFile("foo/foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
   CreateTempFile("bar/foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Bar {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Bar {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir/foo --proto_path=$tmpdir/bar "
       "$tmpdir/bar/foo.proto");
 
   ExpectErrorText(
-    "$tmpdir/bar/foo.proto: Input is shadowed in the --proto_path "
-    "by \"$tmpdir/foo/foo.proto\".  Either use the latter "
-    "file as your input or reorder the --proto_path so that the "
-    "former file's location comes first.\n");
+      "$tmpdir/bar/foo.proto: Input is shadowed in the --proto_path "
+      "by \"$tmpdir/foo/foo.proto\".  Either use the latter "
+      "file as your input or reorder the --proto_path so that the "
+      "former file's location comes first.\n");
 }
 
 TEST_F(CommandLineInterfaceTest, ProtoPathNotFoundError) {
@@ -1812,8 +1805,8 @@
 
 TEST_F(CommandLineInterfaceTest, MissingOutputError) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --proto_path=$tmpdir foo.proto");
 
@@ -1822,8 +1815,8 @@
 
 TEST_F(CommandLineInterfaceTest, OutputWriteError) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   std::string output_file =
       MockCodeGenerator::GetOutputFileName("test_generator", "foo.proto");
@@ -1851,8 +1844,8 @@
 
 TEST_F(CommandLineInterfaceTest, PluginOutputWriteError) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   std::string output_file =
       MockCodeGenerator::GetOutputFileName("test_plugin", "foo.proto");
@@ -1875,8 +1868,8 @@
 
 TEST_F(CommandLineInterfaceTest, OutputDirectoryNotFoundError) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir/nosuchdir "
       "--proto_path=$tmpdir foo.proto");
@@ -1886,8 +1879,8 @@
 
 TEST_F(CommandLineInterfaceTest, PluginOutputDirectoryNotFoundError) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --plug_out=$tmpdir/nosuchdir "
       "--proto_path=$tmpdir foo.proto");
@@ -1897,8 +1890,8 @@
 
 TEST_F(CommandLineInterfaceTest, OutputDirectoryIsFileError) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir/foo.proto "
       "--proto_path=$tmpdir foo.proto");
@@ -1915,8 +1908,8 @@
 
 TEST_F(CommandLineInterfaceTest, GeneratorError) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message MockCodeGenerator_Error {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message MockCodeGenerator_Error {}\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -1929,8 +1922,8 @@
   // Test a generator plugin that returns an error.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message MockCodeGenerator_Error {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message MockCodeGenerator_Error {}\n");
 
   Run("protocol_compiler --plug_out=TestParameter:$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -1943,8 +1936,8 @@
   // Test a generator plugin that exits with an error code.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message MockCodeGenerator_Exit {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message MockCodeGenerator_Exit {}\n");
 
   Run("protocol_compiler --plug_out=TestParameter:$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -1958,8 +1951,8 @@
   // Test a generator plugin that crashes.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message MockCodeGenerator_Abort {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message MockCodeGenerator_Abort {}\n");
 
   Run("protocol_compiler --plug_out=TestParameter:$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -1973,15 +1966,14 @@
       "--plug_out: prefix-gen-plug: Plugin failed with status code");
 #else
   // Don't depend on the exact signal number.
-  ExpectErrorSubstring(
-      "--plug_out: prefix-gen-plug: Plugin killed by signal");
+  ExpectErrorSubstring("--plug_out: prefix-gen-plug: Plugin killed by signal");
 #endif
 }
 
 TEST_F(CommandLineInterfaceTest, PluginReceivesSourceCodeInfo) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message MockCodeGenerator_HasSourceCodeInfo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message MockCodeGenerator_HasSourceCodeInfo {}\n");
 
   Run("protocol_compiler --plug_out=$tmpdir --proto_path=$tmpdir foo.proto");
 
@@ -1991,10 +1983,10 @@
 
 TEST_F(CommandLineInterfaceTest, PluginReceivesJsonName) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message MockCodeGenerator_HasJsonName {\n"
-    "  optional int32 value = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "message MockCodeGenerator_HasJsonName {\n"
+                 "  optional int32 value = 1;\n"
+                 "}\n");
 
   Run("protocol_compiler --plug_out=$tmpdir --proto_path=$tmpdir foo.proto");
 
@@ -2003,25 +1995,24 @@
 
 TEST_F(CommandLineInterfaceTest, PluginReceivesCompilerVersion) {
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message MockCodeGenerator_ShowVersionNumber {\n"
-    "  optional int32 value = 1;\n"
-    "}\n");
+                 "syntax = \"proto2\";\n"
+                 "message MockCodeGenerator_ShowVersionNumber {\n"
+                 "  optional int32 value = 1;\n"
+                 "}\n");
 
   Run("protocol_compiler --plug_out=$tmpdir --proto_path=$tmpdir foo.proto");
 
-  ExpectErrorSubstring(
-      StringPrintf("Saw compiler_version: %d %s",
-                   GOOGLE_PROTOBUF_VERSION,
-                   GOOGLE_PROTOBUF_VERSION_SUFFIX));
+  ExpectErrorSubstring(StringPrintf("Saw compiler_version: %d %s",
+                                    GOOGLE_PROTOBUF_VERSION,
+                                    GOOGLE_PROTOBUF_VERSION_SUFFIX));
 }
 
 TEST_F(CommandLineInterfaceTest, GeneratorPluginNotFound) {
   // Test what happens if the plugin isn't found.
 
   CreateTempFile("error.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --badplug_out=TestParameter:$tmpdir "
       "--plugin=prefix-gen-badplug=no_such_file "
@@ -2029,11 +2020,10 @@
 
 #ifdef _WIN32
   ExpectErrorSubstring("--badplug_out: prefix-gen-badplug: " +
-      Subprocess::Win32ErrorMessage(ERROR_FILE_NOT_FOUND));
+                       Subprocess::Win32ErrorMessage(ERROR_FILE_NOT_FOUND));
 #else
   // Error written to stdout by child process after exec() fails.
-  ExpectErrorSubstring(
-      "no_such_file: program not found or is not executable");
+  ExpectErrorSubstring("no_such_file: program not found or is not executable");
 
   // Error written by parent process when child fails.
   ExpectErrorSubstring(
@@ -2045,8 +2035,8 @@
   // Test what happens if plugins aren't allowed.
 
   CreateTempFile("error.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   DisallowPlugins();
   Run("protocol_compiler --plug_out=TestParameter:$tmpdir "
@@ -2070,28 +2060,28 @@
   // that it can be set explicitly).
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "badsyntax\n");
+                 "syntax = \"proto2\";\n"
+                 "badsyntax\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir --error_format=gcc foo.proto");
 
   ExpectErrorText(
-    "foo.proto:2:1: Expected top-level statement (e.g. \"message\").\n");
+      "foo.proto:2:1: Expected top-level statement (e.g. \"message\").\n");
 }
 
 TEST_F(CommandLineInterfaceTest, MsvsFormatErrors) {
   // Test --error_format=msvs
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "badsyntax\n");
+                 "syntax = \"proto2\";\n"
+                 "badsyntax\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir --error_format=msvs foo.proto");
 
   ExpectErrorText(
-    "$tmpdir/foo.proto(2) : error in column=1: Expected top-level statement "
+      "$tmpdir/foo.proto(2) : error in column=1: Expected top-level statement "
       "(e.g. \"message\").\n");
 }
 
@@ -2099,14 +2089,13 @@
   // Test --error_format=msvs
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "badsyntax\n");
+                 "syntax = \"proto2\";\n"
+                 "badsyntax\n");
 
   Run("protocol_compiler --test_out=$tmpdir "
       "--proto_path=$tmpdir --error_format=invalid foo.proto");
 
-  ExpectErrorText(
-    "Unknown error format: invalid\n");
+  ExpectErrorText("Unknown error format: invalid\n");
 }
 
 // -------------------------------------------------------------------
@@ -2116,8 +2105,8 @@
   // Test that a single-character flag works.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler -t$tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -2130,8 +2119,8 @@
   // Test that separating the flag value with a space works.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler --test_out $tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -2145,8 +2134,8 @@
   // single-character flags.
 
   CreateTempFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+                 "syntax = \"proto2\";\n"
+                 "message Foo {}\n");
 
   Run("protocol_compiler -t $tmpdir "
       "--proto_path=$tmpdir foo.proto");
@@ -2173,38 +2162,35 @@
 }
 
 TEST_F(CommandLineInterfaceTest, PrintFreeFieldNumbers) {
-  CreateTempFile(
-      "foo.proto",
-      "syntax = \"proto2\";\n"
-      "package foo;\n"
-      "message Foo {\n"
-      "  optional int32 a = 2;\n"
-      "  optional string b = 4;\n"
-      "  optional string c = 5;\n"
-      "  optional int64 d = 8;\n"
-      "  optional double e = 10;\n"
-      "}\n");
-  CreateTempFile(
-      "bar.proto",
-      "syntax = \"proto2\";\n"
-      "message Bar {\n"
-      "  optional int32 a = 2;\n"
-      "  extensions 4 to 5;\n"
-      "  optional int64 d = 8;\n"
-      "  extensions 10;\n"
-      "}\n");
-  CreateTempFile(
-      "baz.proto",
-      "syntax = \"proto2\";\n"
-      "message Baz {\n"
-      "  optional int32 a = 2;\n"
-      "  optional int64 d = 8;\n"
-      "  extensions 15 to max;\n"  // unordered.
-      "  extensions 13;\n"
-      "  extensions 10 to 12;\n"
-      "  extensions 5;\n"
-      "  extensions 4;\n"
-      "}\n");
+  CreateTempFile("foo.proto",
+                 "syntax = \"proto2\";\n"
+                 "package foo;\n"
+                 "message Foo {\n"
+                 "  optional int32 a = 2;\n"
+                 "  optional string b = 4;\n"
+                 "  optional string c = 5;\n"
+                 "  optional int64 d = 8;\n"
+                 "  optional double e = 10;\n"
+                 "}\n");
+  CreateTempFile("bar.proto",
+                 "syntax = \"proto2\";\n"
+                 "message Bar {\n"
+                 "  optional int32 a = 2;\n"
+                 "  extensions 4 to 5;\n"
+                 "  optional int64 d = 8;\n"
+                 "  extensions 10;\n"
+                 "}\n");
+  CreateTempFile("baz.proto",
+                 "syntax = \"proto2\";\n"
+                 "message Baz {\n"
+                 "  optional int32 a = 2;\n"
+                 "  optional int64 d = 8;\n"
+                 "  extensions 15 to max;\n"  // unordered.
+                 "  extensions 13;\n"
+                 "  extensions 10 to 12;\n"
+                 "  extensions 5;\n"
+                 "  extensions 4;\n"
+                 "}\n");
   CreateTempFile(
       "quz.proto",
       "syntax = \"proto2\";\n"
@@ -2249,10 +2235,7 @@
 // platforms that don't have a Bourne-compatible shell available (especially
 // Windows/MSVC).
 
-enum EncodeDecodeTestMode {
-  PROTO_PATH,
-  DESCRIPTOR_SET_IN
-};
+enum EncodeDecodeTestMode { PROTO_PATH, DESCRIPTOR_SET_IN };
 
 class EncodeDecodeTest : public testing::TestWithParam<EncodeDecodeTestMode> {
  protected:
@@ -2312,7 +2295,7 @@
         ADD_FAILURE() << "unexpected EncodeDecodeTestMode: " << GetParam();
     }
 
-    std::unique_ptr<const char * []> argv(new const char* [args.size()]);
+    std::unique_ptr<const char*[]> argv(new const char*[args.size()]);
     for (int i = 0; i < args.size(); i++) {
       argv[i] = args[i].c_str();
     }
@@ -2365,7 +2348,6 @@
     protobuf_unittest_import::ImportMessage import_message;
     import_message.descriptor()->file()->CopyTo(file_descriptor_set.add_file());
 
-
     protobuf_unittest_import::PublicImportMessage public_import_message;
     public_import_message.descriptor()->file()->CopyTo(
         file_descriptor_set.add_file());
@@ -2373,10 +2355,8 @@
 
     std::string binary_proto;
     GOOGLE_CHECK(file_descriptor_set.SerializeToString(&binary_proto));
-    GOOGLE_CHECK_OK(File::SetContents(
-        unittest_proto_descriptor_set_filename_,
-        binary_proto,
-        true));
+    GOOGLE_CHECK_OK(File::SetContents(unittest_proto_descriptor_set_filename_,
+                               binary_proto, true));
   }
 
   int duped_stdin_;
@@ -2416,7 +2396,7 @@
           " --encode=protobuf_unittest.TestRequired"));
   ExpectStdoutMatchesText("");
   ExpectStderrMatchesText(
-    "warning:  Input message is missing required fields:  a, b, c\n");
+      "warning:  Input message is missing required fields:  a, b, c\n");
 }
 
 TEST_P(EncodeDecodeTest, DecodeRaw) {
@@ -2428,8 +2408,9 @@
 
   RedirectStdinFromText(data);
   EXPECT_TRUE(Run("--decode_raw"));
-  ExpectStdoutMatchesText("1: 123\n"
-                          "14: \"foo\"\n");
+  ExpectStdoutMatchesText(
+      "1: 123\n"
+      "14: \"foo\"\n");
   ExpectStderrMatchesText("");
 }
 
diff --git a/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc b/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc
index c197dae..d73cfb7 100644
--- a/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc
@@ -77,8 +77,8 @@
   // implements ErrorCollector ---------------------------------------
   void AddError(const std::string& filename, int line, int column,
                 const std::string& message) {
-    strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n",
-                                 filename, line, column, message);
+    strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line,
+                                 column, message);
   }
 };
 
@@ -92,7 +92,7 @@
     std::string* expected_contents =
         FindPtrOrNull(files_, virtual_filename);
     ASSERT_TRUE(expected_contents != NULL)
-      << "Generator failed to generate file: " << virtual_filename;
+        << "Generator failed to generate file: " << virtual_filename;
 
     std::string actual_contents;
     GOOGLE_CHECK_OK(
@@ -101,10 +101,11 @@
         << physical_filename;
     CleanStringLineEndings(&actual_contents, false);
 
-#ifdef WRITE_FILES // Define to debug mismatched files.
+#ifdef WRITE_FILES  // Define to debug mismatched files.
+    GOOGLE_CHECK_OK(File::SetContents("/tmp/expected.cc", *expected_contents,
+                               true));
     GOOGLE_CHECK_OK(
-        File::SetContents("/tmp/expected.cc", *expected_contents, true));
-    GOOGLE_CHECK_OK(File::SetContents("/tmp/actual.cc", actual_contents, true));
+        File::SetContents("/tmp/actual.cc", actual_contents, true));
 #endif
 
     ASSERT_EQ(*expected_contents, actual_contents)
@@ -142,10 +143,14 @@
   // of the data to compare to.
   std::map<std::string, std::string> vpath_map;
   std::map<std::string, std::string> rpath_map;
-  rpath_map["third_party/protobuf/src/google/protobuf/test_messages_proto2"] =
-      "net/proto2/z_generated_example/test_messages_proto2";
-  rpath_map["third_party/protobuf/src/google/protobuf/test_messages_proto3"] =
-      "net/proto2/z_generated_example/test_messages_proto3";
+  rpath_map
+      ["third_party/protobuf_legacy_opensource/src/google/protobuf/"
+       "test_messages_proto2"] =
+          "net/proto2/z_generated_example/test_messages_proto2";
+  rpath_map
+      ["third_party/protobuf_legacy_opensource/src/google/protobuf/"
+       "test_messages_proto3"] =
+          "net/proto2/z_generated_example/test_messages_proto3";
   rpath_map["net/proto2/internal/proto2_weak"] =
       "net/proto2/z_generated_example/proto2_weak";
 
diff --git a/src/google/protobuf/compiler/cpp/cpp_enum.cc b/src/google/protobuf/compiler/cpp/cpp_enum.cc
index 9220ddb..e59099e 100644
--- a/src/google/protobuf/compiler/cpp/cpp_enum.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_enum.cc
@@ -70,7 +70,6 @@
   variables_["classname"] = classname_;
   variables_["classtype"] = QualifiedClassName(descriptor_, options);
   variables_["short_name"] = descriptor_->name();
-  variables_["enumbase"] = options_.proto_h ? " : int" : "";
   variables_["nested_name"] = descriptor_->name();
   variables_["resolved_name"] = ResolveKeyword(descriptor_->name());
   variables_["prefix"] =
@@ -81,7 +80,7 @@
 
 void EnumGenerator::GenerateDefinition(io::Printer* printer) {
   Formatter format(printer, variables_);
-  format("enum ${1$$classname$$}$$enumbase$ {\n", descriptor_);
+  format("enum ${1$$classname$$}$ : int {\n", descriptor_);
   format.Indent();
 
   const EnumValueDescriptor* min_value = descriptor_->value(0);
@@ -145,28 +144,18 @@
         "$dllexport_decl $const ::$proto_ns$::EnumDescriptor* "
         "$classname$_descriptor();\n");
     // The _Name and _Parse methods
-    if (options_.opensource_runtime) {
-      // TODO(haberman): consider removing this in favor of the stricter
-      // version below.  Would this break our compatibility guarantees?
-      format(
-          "inline const std::string& $classname$_Name($classname$ value) {\n"
-          "  return ::$proto_ns$::internal::NameOfEnum(\n"
-          "    $classname$_descriptor(), value);\n"
-          "}\n");
-    } else {
-      // Support a stricter, type-checked enum-to-string method that
-      // statically checks whether the parameter is the exact enum type or is
-      // an integral type.
-      format(
-          "template<typename T>\n"
-          "inline const std::string& $classname$_Name(T enum_t_value) {\n"
-          "  static_assert(::std::is_same<T, $classname$>::value ||\n"
-          "    ::std::is_integral<T>::value,\n"
-          "    \"Incorrect type passed to function $classname$_Name.\");\n"
-          "  return ::$proto_ns$::internal::NameOfEnum(\n"
-          "    $classname$_descriptor(), enum_t_value);\n"
-          "}\n");
-    }
+    // Support a stricter, type-checked enum-to-string method that
+    // statically checks whether the parameter is the exact enum type or is
+    // an integral type.
+    format(
+        "template<typename T>\n"
+        "inline const std::string& $classname$_Name(T enum_t_value) {\n"
+        "  static_assert(::std::is_same<T, $classname$>::value ||\n"
+        "    ::std::is_integral<T>::value,\n"
+        "    \"Incorrect type passed to function $classname$_Name.\");\n"
+        "  return ::$proto_ns$::internal::NameOfEnum(\n"
+        "    $classname$_descriptor(), enum_t_value);\n"
+        "}\n");
     format(
         "inline bool $classname$_Parse(\n"
         "    const std::string& name, $classname$* value) {\n"
@@ -227,29 +216,18 @@
         "$nested_name$_descriptor() {\n"
         "  return $classname$_descriptor();\n"
         "}\n");
-    if (options_.opensource_runtime) {
-      // TODO(haberman): consider removing this in favor of the stricter
-      // version below.  Would this break our compatibility guarantees?
-      format(
-          "static inline const std::string& "
-          "$nested_name$_Name($resolved_name$ value) {"
-          "\n"
-          "  return $classname$_Name(value);\n"
-          "}\n");
-    } else {
-      // Support a stricter, type-checked enum-to-string method that
-      // statically checks whether the parameter is the exact enum type or is
-      // an integral type.
-      format(
-          "template<typename T>\n"
-          "static inline const std::string& $nested_name$_Name(T enum_t_value) "
-          "{\n"
-          "  static_assert(::std::is_same<T, $resolved_name$>::value ||\n"
-          "    ::std::is_integral<T>::value,\n"
-          "    \"Incorrect type passed to function $nested_name$_Name.\");\n"
-          "  return $classname$_Name(enum_t_value);\n"
-          "}\n");
-    }
+    // Support a stricter, type-checked enum-to-string method that
+    // statically checks whether the parameter is the exact enum type or is
+    // an integral type.
+    format(
+        "template<typename T>\n"
+        "static inline const std::string& $nested_name$_Name(T enum_t_value) "
+        "{\n"
+        "  static_assert(::std::is_same<T, $resolved_name$>::value ||\n"
+        "    ::std::is_integral<T>::value,\n"
+        "    \"Incorrect type passed to function $nested_name$_Name.\");\n"
+        "  return $classname$_Name(enum_t_value);\n"
+        "}\n");
     format(
         "static inline bool $nested_name$_Parse(const std::string& name,\n"
         "    $resolved_name$* value) {\n"
@@ -301,8 +279,9 @@
     // Before C++17, we must define the static constants which were
     // declared in the header, to give the linker a place to put them.
     // But pre-2015 MSVC++ insists that we not.
-    format("#if (__cplusplus < 201703) && "
-           "(!defined(_MSC_VER) || _MSC_VER >= 1900)\n");
+    format(
+        "#if (__cplusplus < 201703) && "
+        "(!defined(_MSC_VER) || _MSC_VER >= 1900)\n");
 
     for (int i = 0; i < descriptor_->value_count(); i++) {
       format("constexpr $classname$ $1$::$2$;\n", parent,
@@ -316,8 +295,9 @@
       format("constexpr int $1$::$nested_name$_ARRAYSIZE;\n", parent);
     }
 
-    format("#endif  // (__cplusplus < 201703) && "
-           "(!defined(_MSC_VER) || _MSC_VER >= 1900)\n");
+    format(
+        "#endif  // (__cplusplus < 201703) && "
+        "(!defined(_MSC_VER) || _MSC_VER >= 1900)\n");
   }
 }
 
diff --git a/src/google/protobuf/compiler/cpp/cpp_enum.h b/src/google/protobuf/compiler/cpp/cpp_enum.h
index cce8cf2..3687f04 100644
--- a/src/google/protobuf/compiler/cpp/cpp_enum.h
+++ b/src/google/protobuf/compiler/cpp/cpp_enum.h
@@ -43,9 +43,9 @@
 
 namespace google {
 namespace protobuf {
-  namespace io {
-    class Printer;             // printer.h
-  }
+namespace io {
+class Printer;  // printer.h
+}
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/compiler/cpp/cpp_extension.cc b/src/google/protobuf/compiler/cpp/cpp_extension.cc
index b03ca83..97be5e6 100644
--- a/src/google/protobuf/compiler/cpp/cpp_extension.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_extension.cc
@@ -60,8 +60,7 @@
 
 ExtensionGenerator::ExtensionGenerator(const FieldDescriptor* descriptor,
                                        const Options& options)
-  : descriptor_(descriptor),
-    options_(options) {
+    : descriptor_(descriptor), options_(options) {
   // Construct type_traits_.
   if (descriptor_->is_repeated()) {
     type_traits_ = "Repeated";
diff --git a/src/google/protobuf/compiler/cpp/cpp_field.cc b/src/google/protobuf/compiler/cpp/cpp_field.cc
index 48e6cec..7aae57d 100644
--- a/src/google/protobuf/compiler/cpp/cpp_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_field.cc
@@ -77,7 +77,7 @@
   (*variables)["clear_hasbit"] = "";
   if (HasFieldPresence(descriptor->file())) {
     (*variables)["set_hasbit_io"] =
-        "HasBitSetters::set_has_" + FieldName(descriptor) + "(this);";
+        "HasBitSetters::set_has_" + FieldName(descriptor) + "(&_has_bits_);";
   } else {
     (*variables)["set_hasbit_io"] = "";
   }
@@ -113,8 +113,8 @@
 
 FieldGenerator::~FieldGenerator() {}
 
-void FieldGenerator::
-GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const {
+void FieldGenerator::GenerateMergeFromCodedStreamWithPacking(
+    io::Printer* printer) const {
   // Reaching here indicates a bug. Cases are:
   //   - This FieldGenerator should support packing, but this method should be
   //     overridden.
@@ -122,7 +122,6 @@
   //     never have been called.
   GOOGLE_LOG(FATAL) << "GenerateMergeFromCodedStreamWithPacking() "
              << "called on field generator that does not support packing.";
-
 }
 
 FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor,
diff --git a/src/google/protobuf/compiler/cpp/cpp_file.cc b/src/google/protobuf/compiler/cpp/cpp_file.cc
index d9a7bde..7164bd7 100644
--- a/src/google/protobuf/compiler/cpp/cpp_file.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_file.cc
@@ -75,7 +75,6 @@
   variables_["add_descriptors"] = UniqueName("AddDescriptors", file_, options_);
   variables_["filename"] = file_->name();
   variables_["package_ns"] = Namespace(file_, options);
-  variables_["init_defaults"] = UniqueName("InitDefaults", file_, options_);
 
   std::vector<const Descriptor*> msgs = FlattenMessagesInFile(file);
   for (int i = 0; i < msgs.size(); i++) {
@@ -150,11 +149,6 @@
   format("#define $1$$ dllexport_decl$\n",
          UniqueName("PROTOBUF_INTERNAL_EXPORT", file_, options_));
   GenerateMacroUndefs(printer);
-  if (IsProto2MessageSetFile(file_, options_)) {
-    // Proto2 MessageSet overrides GetMapper() so we forward declare TagMapper
-    // to avoid inclusion of "tagmapper.h".
-    format("class TagMapper;\n");
-  }
 
   // For Any support with lite protos, we need to friend AnyMetadata, so we
   // forward-declare it here.
@@ -165,18 +159,6 @@
       "}  // namespace internal\n"
       "PROTOBUF_NAMESPACE_CLOSE\n");
 
-  if (!options_.opensource_runtime) {
-    // EmbeddedMessageHolder is a proxy class to provide access into arena
-    // constructors for proto1 message objects.
-    // See net/proto/proto_arena_internal.h
-    format(
-        "namespace proto {\n"
-        "namespace internal {\n"
-        "template <typename T> struct EmbeddedMessageHolder;\n"
-        "}  //  namespace internal\n"
-        "}  //  namespace proto\n");
-  }
-
   GenerateGlobalStateFunctionDeclarations(printer);
 
   GenerateForwardDeclarations(printer);
@@ -249,14 +231,7 @@
 
   for (int i = 0; i < file_->public_dependency_count(); i++) {
     const FileDescriptor* dep = file_->public_dependency(i);
-    const char* extension = ".proto.h";
-    // The proto1 compiler only generates .pb.h files, so even if we are
-    // running in proto-h mode, we can only use the .pb.h.
-    if (IsProto1(dep, options_)) {
-      extension = ".pb.h";
-    }
-    std::string dependency = StripProto(dep->name()) + extension;
-    format("#include \"$1$\"\n", dependency);
+    format("#include \"$1$.proto.h\"\n", StripProto(dep->name()));
   }
 
   format("// @@protoc_insertion_point(includes)\n");
@@ -413,20 +388,13 @@
     // Use the smaller .proto.h files.
     for (int i = 0; i < file_->dependency_count(); i++) {
       const FileDescriptor* dep = file_->dependency(i);
-      const char* extension = ".proto.h";
-      std::string basename = StripProto(dep->name());
       // Do not import weak deps.
       if (!options_.opensource_runtime && IsDepWeak(dep)) continue;
-      // The proto1 compiler only generates .pb.h files, so even if we are
-      // running in proto-h mode, we can only use the .pb.h.
-      if (IsProto1(dep, options_)) {
-        extension = ".pb.h";
-      }
+      std::string basename = StripProto(dep->name());
       if (IsBootstrapProto(options_, file_)) {
         GetBootstrapBasename(options_, basename, &basename);
       }
-      std::string dependency = basename + extension;
-      format("#include \"$1$\"\n", dependency);
+      format("#include \"$1$.proto.h\"\n", basename);
     }
   }
 
@@ -479,7 +447,7 @@
     }
     std::string dllexport =
         UniqueName("PROTOBUF_INTERNAL_EXPORT", msg, options_);
-    if (IsProto1(msg->file(), options_) || IsWeak(field, options_)) {
+    if (IsWeak(field, options_)) {
       dllexport = "";
     }
     auto scc = scc_analyzer->GetSCC(msg);
@@ -626,19 +594,6 @@
     }
 
     if (HasDescriptorMethods(file_, options_)) {
-      // TODO(gerbens) This is for proto1 interoperability. Remove when proto1
-      // is gone.
-      format("void $init_defaults$() {\n");
-      for (int i = 0; i < message_generators_.size(); i++) {
-        if (!IsSCCRepresentative(message_generators_[i]->descriptor_)) continue;
-        std::string scc_name =
-            UniqueName(ClassName(message_generators_[i]->descriptor_),
-                       message_generators_[i]->descriptor_, options_);
-        format("  ::$proto_ns$::internal::InitSCC(&scc_info_$1$.base);\n",
-               scc_name);
-      }
-      format("}\n\n");
-
       // Define the code to initialize reflection. This code uses a global
       // constructor to register reflection data with the runtime pre-main.
       GenerateReflectionInitializationCode(printer);
@@ -781,8 +736,8 @@
       format(
           "reinterpret_cast<const "
           "::$proto_ns$::Message*>(&$1$::_$2$_default_instance_),\n",
-          Namespace(descriptor, options_),   // 1
-          ClassName(descriptor));  // 2
+          Namespace(descriptor, options_),  // 1
+          ClassName(descriptor));           // 2
     }
     format.Outdent();
     format(
@@ -823,7 +778,7 @@
   // built into real descriptors at initialization time.
   const std::string protodef_name =
       UniqueName("descriptor_table_protodef", file_, options_);
-  format( "const char $1$[] =\n", protodef_name);
+  format("const char $1$[] =\n", protodef_name);
   format.Indent();
   FileDescriptorProto file_proto;
   file_->CopyTo(&file_proto);
@@ -861,10 +816,8 @@
   format(
       "static "
       "::$proto_ns$::internal::DescriptorTable $1$ = {\n"
-      "  false, $init_defaults$, \n"
-      "  $2$,\n",
-      UniqueName("descriptor_table", file_, options_),
-      protodef_name);
+      "  false, $2$,\n",
+      UniqueName("descriptor_table", file_, options_), protodef_name);
 
   const int num_deps = file_->dependency_count();
   format(
@@ -878,8 +831,18 @@
     const FileDescriptor* dependency = file_->dependency(i);
     format("    ::$1$,\n", UniqueName("AddDescriptors", dependency, options_));
   }
+  format("  };\n");
+  // Reflection referes to the default instances so make sure they are
+  // initialized.
+  for (int i = 0; i < message_generators_.size(); i++) {
+    if (!IsSCCRepresentative(message_generators_[i]->descriptor_)) continue;
+    std::string scc_name =
+        UniqueName(ClassName(message_generators_[i]->descriptor_),
+                   message_generators_[i]->descriptor_, options_);
+    format("  ::$proto_ns$::internal::InitSCC(&scc_info_$1$.base);\n",
+           scc_name);
+  }
   format(
-      "  };\n"
       " ::$proto_ns$::internal::AddDescriptors(&$1$, deps, $2$);\n"
       "}\n\n",
       UniqueName("descriptor_table", file_, options_),  // 1
@@ -904,15 +867,6 @@
 
   format.Indent();
 
-  if (!options_.opensource_runtime) {
-    for (int i = 0; i < scc->children.size(); i++) {
-      const SCC* child_scc = scc->children[i];
-      const FileDescriptor* dependency = child_scc->GetRepresentative()->file();
-      if (!IsProto1(dependency, options_)) continue;
-      format("$1$();\n", UniqueName("InitDefaults", dependency, options_));
-    }
-  }
-
   // First construct all the necessary default instances.
   for (int i = 0; i < message_generators_.size(); i++) {
     if (scc_analyzer_.GetSCC(message_generators_[i]->descriptor_) != scc) {
@@ -961,11 +915,6 @@
                  options_));
   for (const SCC* child : scc->children) {
     auto repr = child->GetRepresentative();
-    if (IsProto1(repr->file(), options_)) {
-      GOOGLE_CHECK(!options_.opensource_runtime);
-      format("\n      nullptr,");
-      continue;
-    }
     format("\n      &scc_info_$1$.base,",
            UniqueName(ClassName(repr), repr, options_));
   }
@@ -1243,7 +1192,7 @@
         "#endif\n"
         "\n",
         PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC,  // 1
-        PROTOBUF_VERSION);                               // 2
+        PROTOBUF_VERSION);                       // 2
     IncludeFile("net/proto2/public/port_undef.inc", printer);
   }
 
@@ -1381,11 +1330,6 @@
       std::max(size_t(1), message_generators_.size()));
   if (HasDescriptorMethods(file_, options_)) {
     format("void $dllexport_decl $$add_descriptors$();\n");
-    if (!options_.opensource_runtime) {
-      // TODO(gerbens) This is for proto1 interoperability. Remove when proto1
-      // is gone.
-      format("void $dllexport_decl $$init_defaults$();\n");
-    }
   }
 }
 
diff --git a/src/google/protobuf/compiler/cpp/cpp_file.h b/src/google/protobuf/compiler/cpp/cpp_file.h
index a7308ab..ca90672 100644
--- a/src/google/protobuf/compiler/cpp/cpp_file.h
+++ b/src/google/protobuf/compiler/cpp/cpp_file.h
@@ -163,9 +163,7 @@
   const Descriptor* GetSCCRepresentative(const Descriptor* d) {
     return GetSCC(d)->GetRepresentative();
   }
-  const SCC* GetSCC(const Descriptor* d) {
-    return scc_analyzer_.GetSCC(d);
-  }
+  const SCC* GetSCC(const Descriptor* d) { return scc_analyzer_.GetSCC(d); }
 
   bool IsDepWeak(const FileDescriptor* dep) const {
     if (weak_deps_.count(dep) != 0) {
diff --git a/src/google/protobuf/compiler/cpp/cpp_generator.cc b/src/google/protobuf/compiler/cpp/cpp_generator.cc
index fe7131f..7de0765 100644
--- a/src/google/protobuf/compiler/cpp/cpp_generator.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_generator.cc
@@ -34,9 +34,9 @@
 
 #include <google/protobuf/compiler/cpp/cpp_generator.h>
 
-#include <vector>
 #include <memory>
 #include <utility>
+#include <vector>
 
 #include <google/protobuf/stubs/strutil.h>
 #include <google/protobuf/compiler/cpp/cpp_file.h>
@@ -101,8 +101,8 @@
       file_options.enforce_mode = EnforceOptimizeMode::kLiteRuntime;
       file_options.lite_implicit_weak_fields = true;
       if (!options[i].second.empty()) {
-        file_options.num_cc_files = strto32(options[i].second.c_str(),
-                                            NULL, 10);
+        file_options.num_cc_files =
+            strto32(options[i].second.c_str(), NULL, 10);
       }
     } else if (options[i].first == "table_driven_parsing") {
       file_options.table_driven_parsing = true;
@@ -142,9 +142,9 @@
     io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
         &annotations);
     std::string info_path = basename + ".proto.h.meta";
-    io::Printer printer(output.get(), '$', file_options.annotate_headers
-                                               ? &annotation_collector
-                                               : NULL);
+    io::Printer printer(
+        output.get(), '$',
+        file_options.annotate_headers ? &annotation_collector : NULL);
     file_generator.GenerateProtoHeader(
         &printer, file_options.annotate_headers ? info_path : "");
     if (file_options.annotate_headers) {
@@ -161,9 +161,9 @@
     io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
         &annotations);
     std::string info_path = basename + ".pb.h.meta";
-    io::Printer printer(output.get(), '$', file_options.annotate_headers
-                                               ? &annotation_collector
-                                               : NULL);
+    io::Printer printer(
+        output.get(), '$',
+        file_options.annotate_headers ? &annotation_collector : NULL);
     file_generator.GeneratePBHeader(
         &printer, file_options.annotate_headers ? info_path : "");
     if (file_options.annotate_headers) {
@@ -175,40 +175,32 @@
 
   // Generate cc file(s).
   if (UsingImplicitWeakFields(file, file_options)) {
-    if (file->name() == "net/proto2/proto/descriptor.proto") {
-      // If we are building with implicit weak fields then we do not want to
-      // produce any symbols for descriptor.proto, so we just create an empty
-      // pb.cc file.
+    {
+      // This is the global .cc file, containing
+      // enum/services/tables/reflection
       std::unique_ptr<io::ZeroCopyOutputStream> output(
           generator_context->Open(basename + ".pb.cc"));
-    } else {
-      {
-        // This is the global .cc file, containing
-        // enum/services/tables/reflection
-        std::unique_ptr<io::ZeroCopyOutputStream> output(
-            generator_context->Open(basename + ".pb.cc"));
-        io::Printer printer(output.get(), '$');
-        file_generator.GenerateGlobalSource(&printer);
-      }
+      io::Printer printer(output.get(), '$');
+      file_generator.GenerateGlobalSource(&printer);
+    }
 
-      int num_cc_files = file_generator.NumMessages();
+    int num_cc_files = file_generator.NumMessages();
 
-      // If we're using implicit weak fields then we allow the user to
-      // optionally specify how many files to generate, not counting the global
-      // pb.cc file. If we have more files than messages, then some files will
-      // be generated as empty placeholders.
-      if (file_options.num_cc_files > 0) {
-        GOOGLE_CHECK_LE(file_generator.NumMessages(), file_options.num_cc_files)
-            << "There must be at least as many numbered .cc files as messages.";
-        num_cc_files = file_options.num_cc_files;
-      }
-      for (int i = 0; i < num_cc_files; i++) {
-        std::unique_ptr<io::ZeroCopyOutputStream> output(
-            generator_context->Open(StrCat(basename, ".out/", i, ".cc")));
-        io::Printer printer(output.get(), '$');
-        if (i < file_generator.NumMessages()) {
-          file_generator.GenerateSourceForMessage(i, &printer);
-        }
+    // If we're using implicit weak fields then we allow the user to
+    // optionally specify how many files to generate, not counting the global
+    // pb.cc file. If we have more files than messages, then some files will
+    // be generated as empty placeholders.
+    if (file_options.num_cc_files > 0) {
+      GOOGLE_CHECK_LE(file_generator.NumMessages(), file_options.num_cc_files)
+          << "There must be at least as many numbered .cc files as messages.";
+      num_cc_files = file_options.num_cc_files;
+    }
+    for (int i = 0; i < num_cc_files; i++) {
+      std::unique_ptr<io::ZeroCopyOutputStream> output(
+          generator_context->Open(StrCat(basename, ".out/", i, ".cc")));
+      io::Printer printer(output.get(), '$');
+      if (i < file_generator.NumMessages()) {
+        file_generator.GenerateSourceForMessage(i, &printer);
       }
     }
   } else {
diff --git a/src/google/protobuf/compiler/cpp/cpp_helpers.cc b/src/google/protobuf/compiler/cpp/cpp_helpers.cc
index 21af61f..4225dc0 100644
--- a/src/google/protobuf/compiler/cpp/cpp_helpers.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_helpers.cc
@@ -55,7 +55,6 @@
 
 #include <google/protobuf/stubs/hash.h>
 
-
 #include <google/protobuf/port_def.inc>
 
 namespace google {
@@ -358,8 +357,10 @@
   if (IsWellKnownMessage(d) && options.opensource_runtime) {
     // Written with string concatenation to prevent rewriting of
     // ::google::protobuf.
-    ret = StringReplace(ret, "::google::" "protobuf", "PROTOBUF_NAMESPACE_ID",
-                        false);
+    ret = StringReplace(ret,
+                        "::google::"
+                        "protobuf",
+                        "PROTOBUF_NAMESPACE_ID", false);
   }
   return ret;
 }
@@ -1123,6 +1124,8 @@
          !field->is_required() && !field->is_map() &&
          field->containing_oneof() == nullptr &&
          !IsWellKnownMessage(field->message_type()->file()) &&
+         field->message_type()->file()->name() !=
+             "net/proto2/proto/descriptor.proto" &&
          // We do not support implicit weak fields between messages in the same
          // strongly-connected component.
          scc_analyzer->GetSCC(field->containing_type()) !=
@@ -1230,7 +1233,7 @@
 
 bool GetBootstrapBasename(const Options& options, const std::string& basename,
                           std::string* bootstrap_basename) {
-  if (options.opensource_runtime || options.lite_implicit_weak_fields) {
+  if (options.opensource_runtime) {
     return false;
   }
 
@@ -1336,21 +1339,27 @@
 
 bool ShouldRepeat(const FieldDescriptor* descriptor,
                   internal::WireFormatLite::WireType wiretype) {
-  return descriptor->is_repeated() &&
+  constexpr int kMaxTwoByteFieldNumber = 16 * 128;
+  return descriptor->number() < kMaxTwoByteFieldNumber &&
+         descriptor->is_repeated() &&
          (!descriptor->is_packable() ||
           wiretype != internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
 }
 
 class ParseLoopGenerator {
  public:
-  ParseLoopGenerator(const Options& options, MessageSCCAnalyzer* scc_analyzer,
-                     io::Printer* printer)
-      : scc_analyzer_(scc_analyzer), options_(options), format_(printer) {}
+  ParseLoopGenerator(int num_hasbits, const Options& options,
+                     MessageSCCAnalyzer* scc_analyzer, io::Printer* printer)
+      : scc_analyzer_(scc_analyzer),
+        options_(options),
+        format_(printer),
+        num_hasbits_(num_hasbits) {}
 
   void GenerateParserLoop(const Descriptor* descriptor) {
     format_.Set("classname", ClassName(descriptor));
     format_.Set("p_ns", "::" + ProtobufNamespace(options_));
-    format_.Set("pi_ns", StrCat("::", ProtobufNamespace(options_), "::internal"));
+    format_.Set("pi_ns",
+                StrCat("::", ProtobufNamespace(options_), "::internal"));
     format_.Set("GOOGLE_PROTOBUF", MacroPrefix(options_));
     std::map<std::string, std::string> vars;
     SetCommonVars(options_, &vars);
@@ -1358,9 +1367,6 @@
 
     std::vector<const FieldDescriptor*> ordered_fields;
     for (auto field : FieldRange(descriptor)) {
-      if (IsProto1(descriptor->file(), options_)) {
-        if (field->number() >= (1 << 14)) continue;
-      }
       ordered_fields.push_back(field);
     }
     std::sort(ordered_fields.begin(), ordered_fields.end(),
@@ -1370,20 +1376,43 @@
 
     format_(
         "const char* $classname$::_InternalParse(const char* ptr, "
-        "$pi_ns$::ParseContext* ctx) {\n");
+        "$pi_ns$::ParseContext* ctx) {\n"
+        "#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure\n");
     format_.Indent();
+    int hasbits_size = 0;
+    if (HasFieldPresence(descriptor->file())) {
+      hasbits_size = (num_hasbits_ + 31) / 32;
+    }
+    // For now only optimize small hasbits.
+    if (hasbits_size != 1) hasbits_size = 0;
+    if (hasbits_size) {
+      format_("HasBitSetters::HasBits has_bits{};\n");
+      format_.Set("has_bits", "has_bits");
+    } else {
+      format_.Set("has_bits", "_has_bits_");
+    }
+
     if (descriptor->file()->options().cc_enable_arenas()) {
       format_("$p_ns$::Arena* arena = GetArenaNoVirtual(); (void)arena;\n");
     }
     GenerateParseLoop(descriptor, ordered_fields);
     format_.Outdent();
-    format_("}\n");
+    format_("success:\n");
+    if (hasbits_size) format_("  _has_bits_.Or(has_bits);\n");
+    format_(
+        "  return ptr;\n"
+        "failure:\n"
+        "  ptr = nullptr;\n"
+        "  goto success;\n"
+        "#undef CHK_\n"
+        "}\n");
   }
 
  private:
   MessageSCCAnalyzer* scc_analyzer_;
   const Options& options_;
   Formatter format_;
+  int num_hasbits_;
 
   using WireFormat = internal::WireFormat;
   using WireFormatLite = internal::WireFormatLite;
@@ -1396,7 +1425,7 @@
       field_name = ", kFieldName";
     }
     if (HasFieldPresence(field->file())) {
-      format_("HasBitSetters::set_has_$1$(this);\n", FieldName(field));
+      format_("HasBitSetters::set_has_$1$(&$has_bits$);\n", FieldName(field));
     }
     string default_string =
         field->default_value_string().empty()
@@ -1432,18 +1461,12 @@
     if (!options_.opensource_runtime) {
       // Open source doesn't support other ctypes;
       ctype = field->options().ctype();
-      if (IsProto1(field->file(), options_) &&
-          ctype == FieldOptions::STRING_PIECE) {
-        // proto1 doesn't support STRING_PIECE
-        ctype = FieldOptions::STRING;
-      }
     }
     if (field->file()->options().cc_enable_arenas() && !field->is_repeated() &&
         !options_.opensource_runtime &&
         GetOptimizeFor(field->file(), options_) != FileOptions::LITE_RUNTIME &&
         // For now only use arena string for strings with empty defaults.
         field->default_value_string().empty() &&
-        !IsProto1(field->file(), options_) &&
         !IsStringInlined(field, options_) &&
         field->containing_oneof() == nullptr && ctype == FieldOptions::STRING) {
       GenerateArenaString(field, utf8, field_name);
@@ -1461,14 +1484,13 @@
         name = "StringPieceParser" + utf8;
         break;
     }
-    format_(
-        "ptr = $pi_ns$::Inline$1$($2$_$3$(), ptr, ctx$4$);\n",
-        name, field->is_repeated() && !field->is_packable() ? "add" : "mutable",
-        FieldName(field), field_name);
+    format_("ptr = $pi_ns$::Inline$1$($2$_$3$(), ptr, ctx$4$);\n", name,
+            field->is_repeated() && !field->is_packable() ? "add" : "mutable",
+            FieldName(field), field_name);
   }
 
   void GenerateLengthDelim(const FieldDescriptor* field) {
-    if (!IsProto1(field->file(), options_) && field->is_packable()) {
+    if (field->is_packable()) {
       std::string enum_validator;
       if (field->type() == FieldDescriptor::TYPE_ENUM &&
           !HasPreservingUnknownEnumSemantics(field)) {
@@ -1476,22 +1498,11 @@
             ", ", QualifiedClassName(field->enum_type(), options_),
             "_IsValid, mutable_unknown_fields(), ", field->number());
       }
-      format_(
-          "ptr = $pi_ns$::Packed$1$Parser(mutable_$2$(), ptr, ctx$3$);\n",
-          DeclaredTypeMethodName(field->type()), FieldName(field),
-          enum_validator);
+      format_("ptr = $pi_ns$::Packed$1$Parser(mutable_$2$(), ptr, ctx$3$);\n",
+              DeclaredTypeMethodName(field->type()), FieldName(field),
+              enum_validator);
     } else {
       auto field_type = field->type();
-      if (IsProto1(field->file(), options_)) {
-        if (field->is_packable()) {
-          // Sigh ... packed fields endup as a string in proto1
-          field_type = FieldDescriptor::TYPE_BYTES;
-        }
-        if (field_type == FieldDescriptor::TYPE_STRING) {
-          // In proto1 strings are treated as bytes
-          field_type = FieldDescriptor::TYPE_BYTES;
-        }
-      }
       switch (field_type) {
         case FieldDescriptor::TYPE_STRING:
           GenerateStrings(field, true /* utf8 */);
@@ -1500,7 +1511,7 @@
           GenerateStrings(field, false /* utf8 */);
           break;
         case FieldDescriptor::TYPE_MESSAGE: {
-          if (!IsProto1(field->file(), options_) && field->is_map()) {
+          if (field->is_map()) {
             const FieldDescriptor* val =
                 field->message_type()->FindFieldByName("value");
             GOOGLE_CHECK(val);
@@ -1516,8 +1527,7 @@
               format_("ptr = ctx->ParseMessage(&$1$_, ptr);\n",
                       FieldName(field));
             }
-          } else if (!IsProto1(field->file(), options_) &&
-                     IsLazy(field, options_)) {
+          } else if (IsLazy(field, options_)) {
             if (field->containing_oneof() != nullptr) {
               format_(
                   "if (!has_$1$()) {\n"
@@ -1531,12 +1541,12 @@
                   FieldName(field), field->containing_oneof()->name());
             } else if (HasFieldPresence(field->file())) {
               format_(
-                  "HasBitSetters::set_has_$1$(this);\n"
+                  "HasBitSetters::set_has_$1$(&$has_bits$);\n"
                   "ptr = ctx->ParseMessage(&$1$_, ptr);\n",
                   FieldName(field));
             } else {
-              format_(
-                  "ptr = ctx->ParseMessage(&$1$_, ptr);\n", FieldName(field));
+              format_("ptr = ctx->ParseMessage(&$1$_, ptr);\n",
+                      FieldName(field));
             }
           } else if (IsImplicitWeakField(field, options_, scc_analyzer_)) {
             if (!field->is_repeated()) {
@@ -1554,18 +1564,10 @@
                   ClassName(field->message_type()));
             }
           } else if (IsWeak(field, options_)) {
-            if (IsProto1(field->file(), options_)) {
-              format_(
-                  "ptr = ctx->ParseMessage("
-                  "reinterpret_cast<$p_ns$::MessageLite*>(internal_mutable_$1$("
-                  ")), ptr);\n",
-                  FieldName(field));
-            } else {
-              format_(
-                  "ptr = ctx->ParseMessage(_weak_field_map_.MutableMessage($1$,"
-                  " _$classname$_default_instance_.$2$_), ptr);\n",
-                  field->number(), FieldName(field));
-            }
+            format_(
+                "ptr = ctx->ParseMessage(_weak_field_map_.MutableMessage($1$,"
+                " _$classname$_default_instance_.$2$_), ptr);\n",
+                field->number(), FieldName(field));
           } else {
             format_("ptr = ctx->ParseMessage($1$_$2$(), ptr);\n",
                     field->is_repeated() ? "add" : "mutable", FieldName(field));
@@ -1582,18 +1584,17 @@
   void GenerateCaseBody(internal::WireFormatLite::WireType wiretype,
                         const FieldDescriptor* field) {
     if (ShouldRepeat(field, wiretype)) {
-      format_("do {\n");
+      format_("while (true) {\n");
       format_.Indent();
     }
     switch (wiretype) {
       case WireFormatLite::WIRETYPE_VARINT: {
         std::string type = PrimitiveTypeName(options_, field->cpp_type());
         std::string prefix = field->is_repeated() ? "add" : "set";
-        if (field->type() == FieldDescriptor::TYPE_ENUM &&
-            !IsProto1(field->file(), options_)) {
+        if (field->type() == FieldDescriptor::TYPE_ENUM) {
           format_(
               "$uint64$ val = $pi_ns$::ReadVarint(&ptr);\n"
-              "$GOOGLE_PROTOBUF$_PARSER_ASSERT(ptr);\n");
+              "CHK_(ptr);\n");
           if (!HasPreservingUnknownEnumSemantics(field)) {
             format_(
                 "if (!$1$_IsValid(val)) {\n"
@@ -1610,36 +1611,58 @@
           int size = field->type() == FieldDescriptor::TYPE_SINT32 ? 32 : 64;
           std::string zigzag;
           if ((field->type() == FieldDescriptor::TYPE_SINT32 ||
-               field->type() == FieldDescriptor::TYPE_SINT64) &&
-              !IsProto1(field->file(), options_)) {
+               field->type() == FieldDescriptor::TYPE_SINT64)) {
             zigzag = StrCat("ZigZag", size);
           }
-          format_(
-              "$1$_$2$($pi_ns$::ReadVarint$3$(&ptr));\n"
-              "$GOOGLE_PROTOBUF$_PARSER_ASSERT(ptr);\n",
-              prefix, FieldName(field), zigzag);
+          if (field->is_repeated() || field->containing_oneof()) {
+            string prefix = field->is_repeated() ? "add" : "set";
+            format_(
+                "$1$_$2$($pi_ns$::ReadVarint$3$(&ptr));\n"
+                "CHK_(ptr);\n",
+                prefix, FieldName(field), zigzag);
+          } else {
+            if (HasFieldPresence(field->file())) {
+              format_("HasBitSetters::set_has_$1$(&$has_bits$);\n",
+                      FieldName(field));
+            }
+            format_(
+                "$1$_ = $pi_ns$::ReadVarint$2$(&ptr);\n"
+                "CHK_(ptr);\n",
+                FieldName(field), zigzag);
+          }
         }
         break;
       }
       case WireFormatLite::WIRETYPE_FIXED32:
       case WireFormatLite::WIRETYPE_FIXED64: {
-        std::string prefix = field->is_repeated() ? "add" : "set";
         std::string type = PrimitiveTypeName(options_, field->cpp_type());
-        format_(
-            "$1$_$2$($pi_ns$::UnalignedLoad<$3$>(ptr));\n"
-            "ptr += sizeof($3$);\n",
-            prefix, FieldName(field), type);
+        if (field->is_repeated() || field->containing_oneof()) {
+          string prefix = field->is_repeated() ? "add" : "set";
+          format_(
+              "$1$_$2$($pi_ns$::UnalignedLoad<$3$>(ptr));\n"
+              "ptr += sizeof($3$);\n",
+              prefix, FieldName(field), type);
+        } else {
+          if (HasFieldPresence(field->file())) {
+            format_("HasBitSetters::set_has_$1$(&$has_bits$);\n",
+                    FieldName(field));
+          }
+          format_(
+              "$1$_ = $pi_ns$::UnalignedLoad<$2$>(ptr);\n"
+              "ptr += sizeof($2$);\n",
+              FieldName(field), type);
+        }
         break;
       }
       case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: {
         GenerateLengthDelim(field);
-        format_("$GOOGLE_PROTOBUF$_PARSER_ASSERT(ptr);\n");
+        format_("CHK_(ptr);\n");
         break;
       }
       case WireFormatLite::WIRETYPE_START_GROUP: {
         format_(
             "ptr = ctx->ParseGroup($1$_$2$(), ptr, tag);\n"
-            "$GOOGLE_PROTOBUF$_PARSER_ASSERT(ptr);\n",
+            "CHK_(ptr);\n",
             field->is_repeated() ? "add" : "mutable", FieldName(field));
         break;
       }
@@ -1651,26 +1674,26 @@
 
     if (ShouldRepeat(field, wiretype)) {
       uint32 x = field->number() * 8 + wiretype;
-      uint64 y = 0;
-      int cnt = 0;
-      do {
-        y += static_cast<uint64>((x & 0x7F) + (x >= 128 ? 128 : 0))
-             << (cnt++ * 8);
-        x >>= 7;
-      } while (x);
-      uint64 mask = (1ull << (cnt * 8)) - 1;
-      format_("if (ctx->Done(&ptr)) return ptr;\n");
-      format_.Outdent();
+      int cnt = 1;
+      string type = "uint8";
+      if (x >= 128) {
+        x += (x & 0xFF80) + 128;
+        cnt = 2;
+        type = "uint16";
+      }
       format_(
-          "} while (($pi_ns$::UnalignedLoad<$uint64$>(ptr)"
-          " & $1$) == $2$ && (ptr += $3$));\n",
-          mask, y, cnt);
+          "if (!ctx->DataAvailable(ptr)) break;\n"
+          "if ($pi_ns$::UnalignedLoad<$1$>(ptr) != $2$) break;\n"
+          "ptr += $3$;\n",
+          IntTypeName(options_, type), x, cnt);
+      format_.Outdent();
+      format_("}\n");
     }
     format_("break;\n");
   }
 
   void GenerateCaseBody(const FieldDescriptor* field) {
-    if (!IsProto1(field->file(), options_) && field->is_packable()) {
+    if (field->is_packable()) {
       auto expected_wiretype = WireFormat::WireTypeForFieldType(field->type());
       GOOGLE_CHECK(expected_wiretype != WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
       uint32 expected_tag =
@@ -1707,7 +1730,7 @@
         "while (!ctx->Done(&ptr)) {\n"
         "  $uint32$ tag;\n"
         "  ptr = $pi_ns$::ReadTag(ptr, &tag);\n"
-        "  $GOOGLE_PROTOBUF$_PARSER_ASSERT(ptr);\n"
+        "  CHK_(ptr);\n"
         "  switch (tag >> 3) {\n");
 
     format_.Indent();
@@ -1741,7 +1764,7 @@
     format_(
         "  if ((tag & 7) == 4 || tag == 0) {\n"
         "    ctx->SetLastTag(tag);\n"
-        "    return ptr;\n"
+        "    goto success;\n"
         "  }\n");
     if (IsMapEntryMessage(descriptor)) {
       format_("  break;\n");
@@ -1769,13 +1792,13 @@
             "  ptr = _extensions_.ParseField(tag, ptr, \n"
             "      internal_default_instance(), &_internal_metadata_, "
             "ctx);\n"
-            "  $GOOGLE_PROTOBUF$_PARSER_ASSERT(ptr != nullptr);\n"
+            "  CHK_(ptr != nullptr);\n"
             "  break;\n"
             "}\n");
       }
       format_(
           "  ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);\n"
-          "  $GOOGLE_PROTOBUF$_PARSER_ASSERT(ptr != nullptr);\n"
+          "  CHK_(ptr != nullptr);\n"
           "  break;\n");
     }
     format_("}\n");  // default case
@@ -1783,15 +1806,15 @@
     format_.Outdent();
     format_(
         "  }  // switch\n"
-        "}  // while\n"
-        "return ptr;\n");
+        "}  // while\n");
   }
 };
 
-void GenerateParserLoop(const Descriptor* descriptor, const Options& options,
+void GenerateParserLoop(const Descriptor* descriptor, int num_hasbits,
+                        const Options& options,
                         MessageSCCAnalyzer* scc_analyzer,
                         io::Printer* printer) {
-  ParseLoopGenerator generator(options, scc_analyzer, printer);
+  ParseLoopGenerator generator(num_hasbits, options, scc_analyzer, printer);
   generator.GenerateParserLoop(descriptor);
 }
 
diff --git a/src/google/protobuf/compiler/cpp/cpp_helpers.h b/src/google/protobuf/compiler/cpp/cpp_helpers.h
index 895749d..f4cf005 100644
--- a/src/google/protobuf/compiler/cpp/cpp_helpers.h
+++ b/src/google/protobuf/compiler/cpp/cpp_helpers.h
@@ -75,10 +75,6 @@
 extern const char kThickSeparator[];
 extern const char kThinSeparator[];
 
-inline bool IsProto1(const FileDescriptor* file, const Options& options) {
-  return false;
-}
-
 void SetCommonVars(const Options& options,
                    std::map<std::string, std::string>* variables);
 
@@ -168,8 +164,8 @@
 // Returns the scope where the field was defined (for extensions, this is
 // different from the message type to which the field applies).
 inline const Descriptor* FieldScope(const FieldDescriptor* field) {
-  return field->is_extension() ?
-    field->extension_scope() : field->containing_type();
+  return field->is_extension() ? field->extension_scope()
+                               : field->containing_type();
 }
 
 // Returns the fully-qualified type name field->message_type().  Usually this
@@ -776,16 +772,15 @@
   };
 
   Iterator begin() const { return {0, descriptor}; }
-  Iterator end() const {
-    return {descriptor->oneof_decl_count(), descriptor};
-  }
+  Iterator end() const { return {descriptor->oneof_decl_count(), descriptor}; }
 
   const Descriptor* descriptor;
 };
 
 inline OneOfRangeImpl OneOfRange(const Descriptor* desc) { return {desc}; }
 
-void GenerateParserLoop(const Descriptor* descriptor, const Options& options,
+void GenerateParserLoop(const Descriptor* descriptor, int num_hasbits,
+                        const Options& options,
                         MessageSCCAnalyzer* scc_analyzer, io::Printer* printer);
 
 }  // namespace cpp
diff --git a/src/google/protobuf/compiler/cpp/cpp_map_field.cc b/src/google/protobuf/compiler/cpp/cpp_map_field.cc
index 7ed5530..0738b91 100644
--- a/src/google/protobuf/compiler/cpp/cpp_map_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_map_field.cc
@@ -89,8 +89,7 @@
     (*variables)["lite"] = "Lite";
   }
 
-  if (!IsProto3Field(descriptor) &&
-      val->type() == FieldDescriptor::TYPE_ENUM) {
+  if (!IsProto3Field(descriptor) && val->type() == FieldDescriptor::TYPE_ENUM) {
     const EnumValueDescriptor* default_value = val->default_value_enum();
     (*variables)["default_enum_value"] = Int32ToString(default_value->number());
   } else {
@@ -106,8 +105,7 @@
 
 MapFieldGenerator::~MapFieldGenerator() {}
 
-void MapFieldGenerator::
-GeneratePrivateMembers(io::Printer* printer) const {
+void MapFieldGenerator::GeneratePrivateMembers(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "::$proto_ns$::internal::MapField$lite$<\n"
@@ -118,8 +116,8 @@
       "    $default_enum_value$ > $name$_;\n");
 }
 
-void MapFieldGenerator::
-GenerateAccessorDeclarations(io::Printer* printer) const {
+void MapFieldGenerator::GenerateAccessorDeclarations(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "$deprecated_attr$const ::$proto_ns$::Map< $key_cpp$, $val_cpp$ >&\n"
@@ -129,8 +127,8 @@
       descriptor_);
 }
 
-void MapFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+void MapFieldGenerator::GenerateInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "inline const ::$proto_ns$::Map< $key_cpp$, $val_cpp$ >&\n"
@@ -145,32 +143,29 @@
       "}\n");
 }
 
-void MapFieldGenerator::
-GenerateClearingCode(io::Printer* printer) const {
+void MapFieldGenerator::GenerateClearingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.Clear();\n");
 }
 
-void MapFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void MapFieldGenerator::GenerateMergingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.MergeFrom(from.$name$_);\n");
 }
 
-void MapFieldGenerator::
-GenerateSwappingCode(io::Printer* printer) const {
+void MapFieldGenerator::GenerateSwappingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.Swap(&other->$name$_);\n");
 }
 
-void MapFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
+void MapFieldGenerator::GenerateCopyConstructorCode(
+    io::Printer* printer) const {
   GenerateConstructorCode(printer);
   GenerateMergingCode(printer);
 }
 
-void MapFieldGenerator::
-GenerateMergeFromCodedStream(io::Printer* printer) const {
+void MapFieldGenerator::GenerateMergeFromCodedStream(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   const FieldDescriptor* key_field =
       descriptor_->message_type()->FindFieldByName("key");
@@ -278,13 +273,13 @@
   format("}\n");
 }
 
-void MapFieldGenerator::
-GenerateSerializeWithCachedSizes(io::Printer* printer) const {
+void MapFieldGenerator::GenerateSerializeWithCachedSizes(
+    io::Printer* printer) const {
   GenerateSerializeWithCachedSizes(printer, false);
 }
 
-void MapFieldGenerator::
-GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
+void MapFieldGenerator::GenerateSerializeWithCachedSizesToArray(
+    io::Printer* printer) const {
   GenerateSerializeWithCachedSizes(printer, true);
 }
 
@@ -367,8 +362,7 @@
   format("}\n");
 }
 
-void MapFieldGenerator::
-GenerateByteSize(io::Printer* printer) const {
+void MapFieldGenerator::GenerateByteSize(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "total_size += $tag_size$ *\n"
diff --git a/src/google/protobuf/compiler/cpp/cpp_message.cc b/src/google/protobuf/compiler/cpp/cpp_message.cc
index bd17215..c56cf5b 100644
--- a/src/google/protobuf/compiler/cpp/cpp_message.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_message.cc
@@ -154,8 +154,7 @@
   // Non-repeated, non-lazy message fields are simply raw pointers, so we can
   // use memset to initialize these in SharedCtor.  We cannot use this in
   // Clear, as we need to potentially delete the existing value.
-  ret = ret || (!field->is_repeated() &&
-                !IsLazy(field, options) &&
+  ret = ret || (!field->is_repeated() && !IsLazy(field, options) &&
                 field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE);
   return ret;
 }
@@ -270,16 +269,6 @@
          options.opensource_runtime;
 }
 
-bool ShouldMarkMergePartialAsFinal(const Descriptor* descriptor,
-                                   const Options& options) {
-  static std::set<std::string> exclusions{
-  };
-
-  const std::string name = ClassName(descriptor, true);
-  return exclusions.find(name) == exclusions.end() ||
-         options.opensource_runtime;
-}
-
 bool ShouldMarkNewAsFinal(const Descriptor* descriptor,
                           const Options& options) {
   static std::set<std::string> exclusions{
@@ -437,10 +426,10 @@
 
 // Collects neighboring fields based on a given criteria (equivalent predicate).
 template <typename Predicate>
-std::vector<std::vector<const FieldDescriptor*> > CollectFields(
+std::vector<std::vector<const FieldDescriptor*>> CollectFields(
     const std::vector<const FieldDescriptor*>& fields,
     const Predicate& equivalent) {
-  std::vector<std::vector<const FieldDescriptor*> > chunks;
+  std::vector<std::vector<const FieldDescriptor*>> chunks;
   if (fields.empty()) {
     return chunks;
   }
@@ -520,7 +509,7 @@
     return has_bit_indices_[chunks_[chunk][offset]->index()] / 32;
   }
 
-  const std::vector<std::vector<const FieldDescriptor*> >& chunks_;
+  const std::vector<std::vector<const FieldDescriptor*>>& chunks_;
   const std::vector<int>& has_bit_indices_;
   const AccessInfoMap* access_info_map_;
   const double cold_threshold_;
@@ -848,8 +837,7 @@
 }
 
 void MessageGenerator::GenerateFieldClear(const FieldDescriptor* field,
-                                          bool is_inline,
-                                          Formatter format) {
+                                          bool is_inline, Formatter format) {
   // Generate clear_$name$().
   if (is_inline) {
     format("inline ");
@@ -933,7 +921,7 @@
 void MessageGenerator::GenerateClassDefinition(io::Printer* printer) {
   Formatter format(printer, variables_);
   format.Set("class_final",
-             ShouldMarkClassAsFinal(descriptor_, options_) ? "final": "");
+             ShouldMarkClassAsFinal(descriptor_, options_) ? "final" : "");
 
   if (IsMapEntryMessage(descriptor_)) {
     std::map<std::string, std::string> vars;
@@ -965,19 +953,19 @@
         !suffix.empty()) {
       if (suffix == "UTF8") {
         format(
-            "  bool ValidateKey() const {\n"
+            "  static bool ValidateKey(std::string* s) {\n"
             "    return ::$proto_ns$::internal::WireFormatLite::"
-            "VerifyUtf8String(key().data(), key().size(), "
+            "VerifyUtf8String(s->data(), s->size(), "
             "::$proto_ns$::internal::WireFormatLite::PARSE, \"$1$\");\n"
             " }\n",
             descriptor_->field(0)->full_name());
       } else {
         GOOGLE_CHECK(suffix == "UTF8Verify");
         format(
-            "  bool ValidateKey() const {\n"
+            "  static bool ValidateKey(std::string* s) {\n"
             "#ifndef NDEBUG\n"
             "    ::$proto_ns$::internal::WireFormatLite::VerifyUtf8String(\n"
-            "       key().data(), key().size(), ::$proto_ns$::internal::"
+            "       s->data(), s->size(), ::$proto_ns$::internal::"
             "WireFormatLite::PARSE, \"$1$\");\n"
             "#endif\n"
             "    return true;\n"
@@ -985,25 +973,25 @@
             descriptor_->field(0)->full_name());
       }
     } else {
-      format("  bool ValidateKey() const { return true; }\n");
+      format("  static bool ValidateKey(void*) { return true; }\n");
     }
     if (descriptor_->field(1)->type() == FieldDescriptor::TYPE_STRING &&
         !suffix.empty()) {
       if (suffix == "UTF8") {
         format(
-            "  bool ValidateValue() const {\n"
+            "  static bool ValidateValue(std::string* s) {\n"
             "    return ::$proto_ns$::internal::WireFormatLite::"
-            "VerifyUtf8String(value().data(), value().size(), "
+            "VerifyUtf8String(s->data(), s->size(), "
             "::$proto_ns$::internal::WireFormatLite::PARSE, \"$1$\");\n"
             " }\n",
             descriptor_->field(1)->full_name());
       } else {
         GOOGLE_CHECK(suffix == "UTF8Verify");
         format(
-            "  bool ValidateValue() const {\n"
+            "  static bool ValidateValue(std::string* s) {\n"
             "#ifndef NDEBUG\n"
             "    ::$proto_ns$::internal::WireFormatLite::VerifyUtf8String(\n"
-            "       value().data(), value().size(), ::$proto_ns$::internal::"
+            "       s->data(), s->size(), ::$proto_ns$::internal::"
             "WireFormatLite::PARSE, \"$1$\");\n"
             "#endif\n"
             "    return true;\n"
@@ -1011,7 +999,7 @@
             descriptor_->field(1)->full_name());
       }
     } else {
-      format("  bool ValidateValue() const { return true; }\n");
+      format("  static bool ValidateValue(void*) { return true; }\n");
     }
     if (HasDescriptorMethods(descriptor_->file(), options_)) {
       format(
@@ -1133,7 +1121,8 @@
       "}\n"
       "static constexpr int kIndexInFileMessages =\n"
       "  $1$;\n"
-      "\n", index_in_file_messages_);
+      "\n",
+      index_in_file_messages_);
 
   if (SupportsArenas(descriptor_)) {
     format("void UnsafeArenaSwap($classname$* other);\n");
@@ -1218,9 +1207,6 @@
     format.Set(
         "is_initialized_final",
         ShouldMarkIsInitializedAsFinal(descriptor_, options_) ? "final" : "");
-    format.Set(
-        "merge_partial_final",
-        ShouldMarkMergePartialAsFinal(descriptor_, options_) ? "final" : "");
 
     format(
         "void CopyFrom(const $classname$& from);\n"
@@ -1234,8 +1220,7 @@
         "::$proto_ns$::internal::ParseContext* ctx) final;\n"
         "#else\n"
         "bool MergePartialFromCodedStream(\n"
-        "    ::$proto_ns$::io::CodedInputStream* input)$ "
-        "merge_partial_final$;\n"
+        "    ::$proto_ns$::io::CodedInputStream* input) final;\n"
         "#endif  // $GOOGLE_PROTOBUF$_ENABLE_EXPERIMENTAL_PARSER\n");
 
     if (!options_.table_driven_serialization ||
@@ -1432,11 +1417,6 @@
   }
 
   if (SupportsArenas(descriptor_)) {
-    if (!options_.opensource_runtime) {
-      format(
-          "template <typename T> friend struct "
-          "::proto::internal::EmbeddedMessageHolder;\n");
-    }
     format(
         "template <typename T> friend class "
         "::$proto_ns$::Arena::InternalHelper;\n"
@@ -1702,13 +1682,10 @@
       vars["ptr"] = "nullptr";
       if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
         GOOGLE_CHECK(!IsMapEntryMessage(field->message_type()));
-        if (!IsProto1(field->message_type()->file(), options_)) {
-          vars["ptr"] =
-              "::" +
-              UniqueName("TableStruct", field->message_type(), options_) +
-              "::serialization_table + " +
-              StrCat(FindMessageIndexInFile(field->message_type()));
-        }
+        vars["ptr"] =
+            "::" + UniqueName("TableStruct", field->message_type(), options_) +
+            "::serialization_table + " +
+            StrCat(FindMessageIndexInFile(field->message_type()));
       }
       Formatter::SaveState saver(&format);
       format.AddMap(vars);
@@ -1777,9 +1754,8 @@
             tag, FindMessageIndexInFile(field->message_type()),
             QualifiedClassName(field->message_type(), options_));
         continue;
-      } else if (!IsProto1(field->message_type()->file(), options_) &&
-                 !field->message_type()->options().message_set_wire_format()) {
-        // Proto1 or message_set don't have the usual table and we need to
+      } else if (!field->message_type()->options().message_set_wire_format()) {
+        // message_set doesn't have the usual table and we need to
         // dispatch to generated serializer, hence ptr stays zero.
         ptr =
             "::" + UniqueName("TableStruct", field->message_type(), options_) +
@@ -1869,8 +1845,7 @@
   for (auto field : FieldRange(descriptor_)) {
     Formatter::SaveState saver(&format);
 
-    if (!field->is_repeated() &&
-        !IsLazy(field, options_) &&
+    if (!field->is_repeated() && !IsLazy(field, options_) &&
         field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
         (field->containing_oneof() == NULL ||
          HasDescriptorMethods(descriptor_->file(), options_))) {
@@ -1977,21 +1952,21 @@
       "class $classname$::HasBitSetters {\n"
       " public:\n");
   format.Indent();
+  if (HasFieldPresence(descriptor_->file()) && HasBitsSize() != 0) {
+    format(
+        "using HasBits = decltype(std::declval<$classname$>()._has_bits_);\n");
+  }
   for (auto field : FieldRange(descriptor_)) {
     field_generators_.get(field).GenerateInternalAccessorDeclarations(printer);
     if (HasFieldPresence(descriptor_->file()) && !field->is_repeated() &&
         !field->options().weak() && !field->containing_oneof()) {
       int has_bit_index = has_bit_indices_[field->index()];
       GOOGLE_CHECK_GE(has_bit_index, 0);
-
-      format.Set("has_array_index", has_bit_index / 32);
-      format.Set("has_mask",
-                 strings::Hex(1u << (has_bit_index % 32), strings::ZERO_PAD_8));
       format(
-          "static void set_has_$1$($classname$* msg) {\n"
-          "  msg->_has_bits_[$has_array_index$] |= 0x$has_mask$u;\n"
+          "static void set_has_$1$(HasBits* has_bits) {\n"
+          "  (*has_bits)[$2$] |= $3$u;\n"
           "}\n",
-          FieldName(field));
+          FieldName(field), has_bit_index / 32, (1u << (has_bit_index % 32)));
     }
   }
   format.Outdent();
@@ -2259,7 +2234,8 @@
             default_val = field->default_value_string().empty()
                               ? "&::" + variables_["proto_ns"] +
                                     "::internal::fixed_address_empty_string"
-                              : "&" + QualifiedClassName(descriptor_, options_) +
+                              : "&" +
+                                    QualifiedClassName(descriptor_, options_) +
                                     "::" + MakeDefaultName(field);
             break;
           case FieldOptions::CORD:
@@ -2355,8 +2331,7 @@
   Formatter format(printer, variables_);
 
   format("void $classname$::SharedCtor() {\n");
-  if (scc_analyzer_
-          ->GetSCCAnalysis(scc_analyzer_->GetSCC(descriptor_))
+  if (scc_analyzer_->GetSCCAnalysis(scc_analyzer_->GetSCC(descriptor_))
           .constructor_requires_initialization) {
     format(
         "  ::$proto_ns$::internal::InitSCC(\n"
@@ -2784,14 +2759,14 @@
     unconditional_budget -= EstimateAlignmentSize(field);
   }
 
-  std::vector<std::vector<const FieldDescriptor*> > chunks_frag = CollectFields(
+  std::vector<std::vector<const FieldDescriptor*>> chunks_frag = CollectFields(
       optimized_order_,
       MatchRepeatedAndHasByteAndZeroInits(
           &has_bit_indices_, HasFieldPresence(descriptor_->file())));
 
   // Merge next non-zero initializable chunk if it has the same has_byte index
   // and not meeting unconditional clear condition.
-  std::vector<std::vector<const FieldDescriptor*> > chunks;
+  std::vector<std::vector<const FieldDescriptor*>> chunks;
   if (!HasFieldPresence(descriptor_->file())) {
     // Don't bother with merging without has_bit field.
     chunks = chunks_frag;
@@ -3068,8 +3043,7 @@
     }
 
     for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-      format(
-          "swap(_oneof_case_[$1$], other->_oneof_case_[$1$]);\n", i);
+      format("swap(_oneof_case_[$1$], other->_oneof_case_[$1$]);\n", i);
     }
 
     if (num_weak_fields_) {
@@ -3387,7 +3361,8 @@
     return;
   }
   format("#if $GOOGLE_PROTOBUF$_ENABLE_EXPERIMENTAL_PARSER\n");
-  GenerateParserLoop(descriptor_, options_, scc_analyzer_, printer);
+  GenerateParserLoop(descriptor_, max_has_bit_index_, options_, scc_analyzer_,
+                     printer);
   format("#else  // $GOOGLE_PROTOBUF$_ENABLE_EXPERIMENTAL_PARSER\n");
   std::vector<const FieldDescriptor*> ordered_fields =
       SortFieldsByNumber(descriptor_);
@@ -3539,9 +3514,8 @@
       // Emit code to parse the common, expected case.
       // MSVC is warning about truncating constant in the static_cast so
       // we truncate the tag explicitly.
-      format(
-          "if (static_cast< $uint8$>(tag) == ($1$ & 0xFF)) {\n",
-          WireFormat::MakeTag(field));
+      format("if (static_cast< $uint8$>(tag) == ($1$ & 0xFF)) {\n",
+             WireFormat::MakeTag(field));
 
       format.Indent();
       if (field->is_packed()) {
@@ -3557,9 +3531,8 @@
             WireFormat::WireTypeForFieldType(field->type());
         const uint32 tag =
             internal::WireFormatLite::MakeTag(field->number(), wiretype);
-        format(
-            "} else if (static_cast< $uint8$>(tag) == ($1$ & 0xFF)) {\n",
-            tag);
+        format("} else if (static_cast< $uint8$>(tag) == ($1$ & 0xFF)) {\n",
+               tag);
 
         format.Indent();
         field_generator.GenerateMergeFromCodedStream(printer);
@@ -3569,9 +3542,8 @@
             internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED;
         const uint32 tag =
             internal::WireFormatLite::MakeTag(field->number(), wiretype);
-        format(
-            "} else if (static_cast< $uint8$>(tag) == ($1$ & 0xFF)) {\n",
-            tag);
+        format("} else if (static_cast< $uint8$>(tag) == ($1$ & 0xFF)) {\n",
+               tag);
         format.Indent();
         field_generator.GenerateMergeFromCodedStreamWithPacking(printer);
         format.Outdent();
@@ -4178,7 +4150,7 @@
     }
   }
 
-  std::vector<std::vector<const FieldDescriptor*> > chunks = CollectFields(
+  std::vector<std::vector<const FieldDescriptor*>> chunks = CollectFields(
       optimized_order_,
       MatchRepeatedAndHasByteAndRequired(
           &has_bit_indices_, HasFieldPresence(descriptor_->file())));
diff --git a/src/google/protobuf/compiler/cpp/cpp_message_field.cc b/src/google/protobuf/compiler/cpp/cpp_message_field.cc
index 32653bb..053e4fc 100644
--- a/src/google/protobuf/compiler/cpp/cpp_message_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_message_field.cc
@@ -91,8 +91,7 @@
   // NOTE: Escaped here to unblock proto1->proto2 migration.
   // TODO(liujisi): Extend this to apply for other conflicting methods.
   (*variables)["release_name"] =
-      SafeFunctionName(descriptor->containing_type(),
-                       descriptor, "release_");
+      SafeFunctionName(descriptor->containing_type(), descriptor, "release_");
   (*variables)["full_name"] = descriptor->full_name();
 }
 
@@ -111,8 +110,7 @@
 
 MessageFieldGenerator::~MessageFieldGenerator() {}
 
-void MessageFieldGenerator::
-GeneratePrivateMembers(io::Printer* printer) const {
+void MessageFieldGenerator::GeneratePrivateMembers(io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (implicit_weak_field_) {
     format("::$proto_ns$::MessageLite* $name$_;\n");
@@ -121,8 +119,8 @@
   }
 }
 
-void MessageFieldGenerator::
-GenerateAccessorDeclarations(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateAccessorDeclarations(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "$deprecated_attr$const $type$& ${1$$name$$}$() const;\n"
@@ -165,8 +163,8 @@
   }
 }
 
-void MessageFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "inline const $type$& $classname$::$name$() const {\n"
@@ -271,8 +269,8 @@
       "}\n");
 }
 
-void MessageFieldGenerator::
-GenerateInternalAccessorDeclarations(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateInternalAccessorDeclarations(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (implicit_weak_field_) {
     format(
@@ -285,8 +283,8 @@
   }
 }
 
-void MessageFieldGenerator::
-GenerateInternalAccessorDefinitions(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateInternalAccessorDefinitions(
+    io::Printer* printer) const {
   // In theory, these accessors could be inline in HasBitSetters. However, in
   // practice, the linker is then not able to throw them out making implicit
   // weak dependencies not work at all.
@@ -363,8 +361,7 @@
   }
 }
 
-void MessageFieldGenerator::
-GenerateClearingCode(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateClearingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (!HasFieldPresence(descriptor_->file())) {
     // If we don't have has-bits, message presence is indicated only by ptr !=
@@ -379,8 +376,8 @@
   }
 }
 
-void MessageFieldGenerator::
-GenerateMessageClearingCode(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateMessageClearingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (!HasFieldPresence(descriptor_->file())) {
     // If we don't have has-bits, message presence is indicated only by ptr !=
@@ -397,8 +394,7 @@
   }
 }
 
-void MessageFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateMergingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (implicit_weak_field_) {
     format(
@@ -409,14 +405,12 @@
   }
 }
 
-void MessageFieldGenerator::
-GenerateSwappingCode(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateSwappingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("swap($name$_, other->$name$_);\n");
 }
 
-void MessageFieldGenerator::
-GenerateDestructorCode(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateDestructorCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (options_.opensource_runtime) {
     // TODO(gerbens) Remove this when we don't need to destruct default
@@ -429,14 +423,14 @@
   format("delete $name$_;\n");
 }
 
-void MessageFieldGenerator::
-GenerateConstructorCode(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateConstructorCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_ = nullptr;\n");
 }
 
-void MessageFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateCopyConstructorCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "if (from.has_$name$()) {\n"
@@ -446,8 +440,8 @@
       "}\n");
 }
 
-void MessageFieldGenerator::
-GenerateMergeFromCodedStream(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateMergeFromCodedStream(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (implicit_weak_field_) {
     format(
@@ -464,16 +458,16 @@
   }
 }
 
-void MessageFieldGenerator::
-GenerateSerializeWithCachedSizes(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateSerializeWithCachedSizes(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "::$proto_ns$::internal::WireFormatLite::Write$stream_writer$(\n"
       "  $number$, HasBitSetters::$name$(this), output);\n");
 }
 
-void MessageFieldGenerator::
-GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateSerializeWithCachedSizesToArray(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "target = ::$proto_ns$::internal::WireFormatLite::\n"
@@ -481,8 +475,7 @@
       "    $number$, HasBitSetters::$name$(this), target);\n");
 }
 
-void MessageFieldGenerator::
-GenerateByteSize(io::Printer* printer) const {
+void MessageFieldGenerator::GenerateByteSize(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "total_size += $tag_size$ +\n"
@@ -536,8 +529,8 @@
       "}\n");
 }
 
-void MessageOneofFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+void MessageOneofFieldGenerator::GenerateInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "inline $type$* $classname$::$release_name$() {\n"
@@ -609,8 +602,8 @@
       "}\n");
 }
 
-void MessageOneofFieldGenerator::
-GenerateClearingCode(io::Printer* printer) const {
+void MessageOneofFieldGenerator::GenerateClearingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (SupportsArenas(descriptor_)) {
     format(
@@ -622,24 +615,24 @@
   }
 }
 
-void MessageOneofFieldGenerator::
-GenerateMessageClearingCode(io::Printer* printer) const {
+void MessageOneofFieldGenerator::GenerateMessageClearingCode(
+    io::Printer* printer) const {
   GenerateClearingCode(printer);
 }
 
-void MessageOneofFieldGenerator::
-GenerateSwappingCode(io::Printer* printer) const {
+void MessageOneofFieldGenerator::GenerateSwappingCode(
+    io::Printer* printer) const {
   // Don't print any swapping code. Swapping the union will swap this field.
 }
 
-void MessageOneofFieldGenerator::
-GenerateDestructorCode(io::Printer* printer) const {
+void MessageOneofFieldGenerator::GenerateDestructorCode(
+    io::Printer* printer) const {
   // We inherit from MessageFieldGenerator, so we need to override the default
   // behavior.
 }
 
-void MessageOneofFieldGenerator::
-GenerateConstructorCode(io::Printer* printer) const {
+void MessageOneofFieldGenerator::GenerateConstructorCode(
+    io::Printer* printer) const {
   // Don't print any constructor code. The field is in a union. We allocate
   // space only when this field is used.
 }
@@ -657,14 +650,14 @@
 
 RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}
 
-void RepeatedMessageFieldGenerator::
-GeneratePrivateMembers(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GeneratePrivateMembers(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("::$proto_ns$::RepeatedPtrField< $type$ > $name$_;\n");
 }
 
-void RepeatedMessageFieldGenerator::
-GenerateAccessorDeclarations(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GenerateAccessorDeclarations(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "$deprecated_attr$$type$* ${1$mutable_$name$$}$(int index);\n"
@@ -677,8 +670,8 @@
       descriptor_);
 }
 
-void RepeatedMessageFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GenerateInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "inline $type$* $classname$::mutable_$name$(int index) {\n"
@@ -725,8 +718,8 @@
       "}\n");
 }
 
-void RepeatedMessageFieldGenerator::
-GenerateClearingCode(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GenerateClearingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (implicit_weak_field_) {
     format(
@@ -737,8 +730,8 @@
   }
 }
 
-void RepeatedMessageFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (implicit_weak_field_) {
     format(
@@ -750,19 +743,19 @@
   }
 }
 
-void RepeatedMessageFieldGenerator::
-GenerateSwappingCode(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GenerateSwappingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("CastToBase(&$name$_)->InternalSwap(CastToBase(&other->$name$_));\n");
 }
 
-void RepeatedMessageFieldGenerator::
-GenerateConstructorCode(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GenerateConstructorCode(
+    io::Printer* printer) const {
   // Not needed for repeated fields.
 }
 
-void RepeatedMessageFieldGenerator::
-GenerateMergeFromCodedStream(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GenerateMergeFromCodedStream(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) {
     if (implicit_weak_field_) {
@@ -784,8 +777,8 @@
   }
 }
 
-void RepeatedMessageFieldGenerator::
-GenerateSerializeWithCachedSizes(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GenerateSerializeWithCachedSizes(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "for (unsigned int i = 0,\n"
@@ -805,8 +798,8 @@
       "}\n");
 }
 
-void RepeatedMessageFieldGenerator::
-GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GenerateSerializeWithCachedSizesToArray(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "for (unsigned int i = 0,\n"
@@ -817,8 +810,8 @@
       "}\n");
 }
 
-void RepeatedMessageFieldGenerator::
-GenerateByteSize(io::Printer* printer) const {
+void RepeatedMessageFieldGenerator::GenerateByteSize(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "{\n"
diff --git a/src/google/protobuf/compiler/cpp/cpp_options.h b/src/google/protobuf/compiler/cpp/cpp_options.h
index 4056ecc..6616e4b 100644
--- a/src/google/protobuf/compiler/cpp/cpp_options.h
+++ b/src/google/protobuf/compiler/cpp/cpp_options.h
@@ -44,7 +44,7 @@
 
 enum class EnforceOptimizeMode {
   kNoEnforcement,  // Use the runtime specified by the file specific options.
-  kSpeed,  // This is the full runtime.
+  kSpeed,          // This is the full runtime.
   kLiteRuntime,
 };
 
@@ -73,5 +73,4 @@
 }  // namespace protobuf
 }  // namespace google
 
-
 #endif  // GOOGLE_PROTOBUF_COMPILER_CPP_OPTIONS_H__
diff --git a/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc b/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc
index 96b5a8b..10e468b 100644
--- a/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc
@@ -38,8 +38,8 @@
 
 #include <google/protobuf/compiler/cpp/cpp_generator.h>
 #include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/io/printer.h>
+#include <google/protobuf/io/zero_copy_stream.h>
 
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/testing/file.h>
@@ -128,7 +128,8 @@
     // Check field accessors for a message inside oneof{}:
     TryInsert("test.pb.h", "field_get:foo.Bar.oneOfMessage", context);
     TryInsert("test.pb.h", "field_mutable:foo.Bar.oneOfMessage", context);
-    TryInsert("test.pb.cc", "field_set_allocated:foo.Bar.oneOfMessage", context);
+    TryInsert("test.pb.cc", "field_set_allocated:foo.Bar.oneOfMessage",
+              context);
 
     // Check field accessors for an optional enum:
     TryInsert("test.pb.h", "field_get:foo.Bar.optEnum", context);
@@ -231,13 +232,8 @@
   std::string cpp_out = "--cpp_out=" + TestTempDir();
   std::string test_out = "--test_out=" + TestTempDir();
 
-  const char* argv[] = {
-    "protoc",
-    proto_path.c_str(),
-    cpp_out.c_str(),
-    test_out.c_str(),
-    "test.proto"
-  };
+  const char* argv[] = {"protoc", proto_path.c_str(), cpp_out.c_str(),
+                        test_out.c_str(), "test.proto"};
 
   EXPECT_EQ(0, cli.Run(5, argv));
 }
diff --git a/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc b/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc
index 9ab20c1..164bb1c 100644
--- a/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc
@@ -52,29 +52,47 @@
 // returns -1.
 int FixedSize(FieldDescriptor::Type type) {
   switch (type) {
-    case FieldDescriptor::TYPE_INT32   : return -1;
-    case FieldDescriptor::TYPE_INT64   : return -1;
-    case FieldDescriptor::TYPE_UINT32  : return -1;
-    case FieldDescriptor::TYPE_UINT64  : return -1;
-    case FieldDescriptor::TYPE_SINT32  : return -1;
-    case FieldDescriptor::TYPE_SINT64  : return -1;
-    case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size;
-    case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size;
-    case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size;
-    case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size;
-    case FieldDescriptor::TYPE_FLOAT   : return WireFormatLite::kFloatSize;
-    case FieldDescriptor::TYPE_DOUBLE  : return WireFormatLite::kDoubleSize;
+    case FieldDescriptor::TYPE_INT32:
+      return -1;
+    case FieldDescriptor::TYPE_INT64:
+      return -1;
+    case FieldDescriptor::TYPE_UINT32:
+      return -1;
+    case FieldDescriptor::TYPE_UINT64:
+      return -1;
+    case FieldDescriptor::TYPE_SINT32:
+      return -1;
+    case FieldDescriptor::TYPE_SINT64:
+      return -1;
+    case FieldDescriptor::TYPE_FIXED32:
+      return WireFormatLite::kFixed32Size;
+    case FieldDescriptor::TYPE_FIXED64:
+      return WireFormatLite::kFixed64Size;
+    case FieldDescriptor::TYPE_SFIXED32:
+      return WireFormatLite::kSFixed32Size;
+    case FieldDescriptor::TYPE_SFIXED64:
+      return WireFormatLite::kSFixed64Size;
+    case FieldDescriptor::TYPE_FLOAT:
+      return WireFormatLite::kFloatSize;
+    case FieldDescriptor::TYPE_DOUBLE:
+      return WireFormatLite::kDoubleSize;
 
-    case FieldDescriptor::TYPE_BOOL    : return WireFormatLite::kBoolSize;
-    case FieldDescriptor::TYPE_ENUM    : return -1;
+    case FieldDescriptor::TYPE_BOOL:
+      return WireFormatLite::kBoolSize;
+    case FieldDescriptor::TYPE_ENUM:
+      return -1;
 
-    case FieldDescriptor::TYPE_STRING  : return -1;
-    case FieldDescriptor::TYPE_BYTES   : return -1;
-    case FieldDescriptor::TYPE_GROUP   : return -1;
-    case FieldDescriptor::TYPE_MESSAGE : return -1;
+    case FieldDescriptor::TYPE_STRING:
+      return -1;
+    case FieldDescriptor::TYPE_BYTES:
+      return -1;
+    case FieldDescriptor::TYPE_GROUP:
+      return -1;
+    case FieldDescriptor::TYPE_MESSAGE:
+      return -1;
 
-    // No default because we want the compiler to complain if any new
-    // types are added.
+      // No default because we want the compiler to complain if any new
+      // types are added.
   }
   GOOGLE_LOG(FATAL) << "Can't get here.";
   return -1;
@@ -108,14 +126,14 @@
 
 PrimitiveFieldGenerator::~PrimitiveFieldGenerator() {}
 
-void PrimitiveFieldGenerator::
-GeneratePrivateMembers(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GeneratePrivateMembers(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$type$ $name$_;\n");
 }
 
-void PrimitiveFieldGenerator::
-GenerateAccessorDeclarations(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateAccessorDeclarations(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "$deprecated_attr$$type$ ${1$$name$$}$() const;\n"
@@ -123,8 +141,8 @@
       descriptor_);
 }
 
-void PrimitiveFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "inline $type$ $classname$::$name$() const {\n"
@@ -138,38 +156,35 @@
       "}\n");
 }
 
-void PrimitiveFieldGenerator::
-GenerateClearingCode(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateClearingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_ = $default$;\n");
 }
 
-void PrimitiveFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateMergingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("set_$name$(from.$name$());\n");
 }
 
-void PrimitiveFieldGenerator::
-GenerateSwappingCode(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateSwappingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("swap($name$_, other->$name$_);\n");
 }
 
-void PrimitiveFieldGenerator::
-GenerateConstructorCode(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateConstructorCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_ = $default$;\n");
 }
 
-void PrimitiveFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateCopyConstructorCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_ = from.$name$_;\n");
 }
 
-void PrimitiveFieldGenerator::
-GenerateMergeFromCodedStream(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateMergeFromCodedStream(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "$set_hasbit_io$\n"
@@ -179,16 +194,16 @@
       "       input, &$name$_)));\n");
 }
 
-void PrimitiveFieldGenerator::
-GenerateSerializeWithCachedSizes(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateSerializeWithCachedSizes(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "::$proto_ns$::internal::WireFormatLite::Write$declared_type$("
       "$number$, this->$name$(), output);\n");
 }
 
-void PrimitiveFieldGenerator::
-GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateSerializeWithCachedSizesToArray(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "target = "
@@ -196,8 +211,7 @@
       "$number$, this->$name$(), target);\n");
 }
 
-void PrimitiveFieldGenerator::
-GenerateByteSize(io::Printer* printer) const {
+void PrimitiveFieldGenerator::GenerateByteSize(io::Printer* printer) const {
   Formatter format(printer, variables_);
   int fixed_size = FixedSize(descriptor_->type());
   if (fixed_size == -1) {
@@ -212,17 +226,16 @@
 
 // ===================================================================
 
-PrimitiveOneofFieldGenerator::
-PrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor,
-                             const Options& options)
-  : PrimitiveFieldGenerator(descriptor, options) {
+PrimitiveOneofFieldGenerator::PrimitiveOneofFieldGenerator(
+    const FieldDescriptor* descriptor, const Options& options)
+    : PrimitiveFieldGenerator(descriptor, options) {
   SetCommonOneofFieldVariables(descriptor, &variables_);
 }
 
 PrimitiveOneofFieldGenerator::~PrimitiveOneofFieldGenerator() {}
 
-void PrimitiveOneofFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+void PrimitiveOneofFieldGenerator::GenerateInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "inline $type$ $classname$::$name$() const {\n"
@@ -242,25 +255,25 @@
       "}\n");
 }
 
-void PrimitiveOneofFieldGenerator::
-GenerateClearingCode(io::Printer* printer) const {
+void PrimitiveOneofFieldGenerator::GenerateClearingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$field_member$ = $default$;\n");
 }
 
-void PrimitiveOneofFieldGenerator::
-GenerateSwappingCode(io::Printer* printer) const {
+void PrimitiveOneofFieldGenerator::GenerateSwappingCode(
+    io::Printer* printer) const {
   // Don't print any swapping code. Swapping the union will swap this field.
 }
 
-void PrimitiveOneofFieldGenerator::
-GenerateConstructorCode(io::Printer* printer) const {
+void PrimitiveOneofFieldGenerator::GenerateConstructorCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$ns$::_$classname$_default_instance_.$name$_ = $default$;\n");
 }
 
-void PrimitiveOneofFieldGenerator::
-GenerateMergeFromCodedStream(io::Printer* printer) const {
+void PrimitiveOneofFieldGenerator::GenerateMergeFromCodedStream(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "clear_$oneof_name$();\n"
@@ -289,8 +302,8 @@
 
 RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {}
 
-void RepeatedPrimitiveFieldGenerator::
-GeneratePrivateMembers(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GeneratePrivateMembers(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("::$proto_ns$::RepeatedField< $type$ > $name$_;\n");
   if (descriptor_->is_packed() &&
@@ -299,8 +312,8 @@
   }
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateAccessorDeclarations(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateAccessorDeclarations(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "$deprecated_attr$$type$ ${1$$name$$}$(int index) const;\n"
@@ -313,8 +326,8 @@
       descriptor_);
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "inline $type$ $classname$::$name$(int index) const {\n"
@@ -341,37 +354,37 @@
       "}\n");
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateClearingCode(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateClearingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.Clear();\n");
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.MergeFrom(from.$name$_);\n");
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateSwappingCode(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateSwappingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.InternalSwap(&other->$name$_);\n");
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateConstructorCode(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateConstructorCode(
+    io::Printer* printer) const {
   // Not needed for repeated fields.
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateCopyConstructorCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.CopyFrom(from.$name$_);\n");
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateMergeFromCodedStream(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateMergeFromCodedStream(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "DO_((::$proto_ns$::internal::WireFormatLite::$repeated_reader$<\n"
@@ -380,8 +393,8 @@
       "       $tag_size$, $tag$u, input, this->mutable_$name$())));\n");
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateMergeFromCodedStreamWithPacking(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "DO_((::$proto_ns$::internal::WireFormatLite::$packed_reader$<\n"
@@ -390,8 +403,8 @@
       "       input, this->mutable_$name$())));\n");
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateSerializeWithCachedSizes(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateSerializeWithCachedSizes(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   bool array_written = false;
   if (descriptor_->is_packed()) {
@@ -433,8 +446,8 @@
   }
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateSerializeWithCachedSizesToArray(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (descriptor_->is_packed()) {
     // Write the tag and the size.
@@ -459,8 +472,8 @@
   }
 }
 
-void RepeatedPrimitiveFieldGenerator::
-GenerateByteSize(io::Printer* printer) const {
+void RepeatedPrimitiveFieldGenerator::GenerateByteSize(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("{\n");
   format.Indent();
diff --git a/src/google/protobuf/compiler/cpp/cpp_string_field.cc b/src/google/protobuf/compiler/cpp/cpp_string_field.cc
index a5a0a60..bd25d7a 100644
--- a/src/google/protobuf/compiler/cpp/cpp_string_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_string_field.cc
@@ -68,8 +68,7 @@
   // NOTE: Escaped here to unblock proto1->proto2 migration.
   // TODO(liujisi): Extend this to apply for other conflicting methods.
   (*variables)["release_name"] =
-      SafeFunctionName(descriptor->containing_type(),
-                       descriptor, "release_");
+      SafeFunctionName(descriptor->containing_type(), descriptor, "release_");
   (*variables)["full_name"] = descriptor->full_name();
 
   if (options.opensource_runtime) {
@@ -96,8 +95,7 @@
 
 StringFieldGenerator::~StringFieldGenerator() {}
 
-void StringFieldGenerator::
-GeneratePrivateMembers(io::Printer* printer) const {
+void StringFieldGenerator::GeneratePrivateMembers(io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (inlined_) {
     format("::$proto_ns$::internal::InlinedStringField $name$_;\n");
@@ -118,8 +116,7 @@
   }
 }
 
-void StringFieldGenerator::
-GenerateStaticMembers(io::Printer* printer) const {
+void StringFieldGenerator::GenerateStaticMembers(io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (!descriptor_->default_value_string().empty()) {
     // We make the default instance public, so it can be initialized by
@@ -132,8 +129,8 @@
   }
 }
 
-void StringFieldGenerator::
-GenerateAccessorDeclarations(io::Printer* printer) const {
+void StringFieldGenerator::GenerateAccessorDeclarations(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   // If we're using StringFieldGenerator for a field with a ctype, it's
   // because that ctype isn't actually implemented.  In particular, this is
@@ -208,8 +205,8 @@
   }
 }
 
-void StringFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+void StringFieldGenerator::GenerateInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (SupportsArenas(descriptor_)) {
     format(
@@ -389,8 +386,8 @@
   }
 }
 
-void StringFieldGenerator::
-GenerateNonInlineAccessorDefinitions(io::Printer* printer) const {
+void StringFieldGenerator::GenerateNonInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (!descriptor_->default_value_string().empty()) {
     // Initialized in GenerateDefaultInstanceAllocator.
@@ -400,8 +397,7 @@
   }
 }
 
-void StringFieldGenerator::
-GenerateClearingCode(io::Printer* printer) const {
+void StringFieldGenerator::GenerateClearingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   // Two-dimension specialization here: supporting arenas or not, and default
   // value is the empty string or not. Complexity here ensures the minimal
@@ -424,8 +420,8 @@
   }
 }
 
-void StringFieldGenerator::
-GenerateMessageClearingCode(io::Printer* printer) const {
+void StringFieldGenerator::GenerateMessageClearingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   // Two-dimension specialization here: supporting arenas, field presence, or
   // not, and default value is the empty string or not. Complexity here ensures
@@ -435,8 +431,7 @@
   // If we have field presence, then the Clear() method of the protocol buffer
   // will have checked that this field is set.  If so, we can avoid redundant
   // checks against default_variable.
-  const bool must_be_present =
-      HasFieldPresence(descriptor_->file());
+  const bool must_be_present = HasFieldPresence(descriptor_->file());
 
   if (inlined_ && must_be_present) {
     // Calling mutable_$name$() gives us a string reference and sets the has bit
@@ -481,8 +476,7 @@
   }
 }
 
-void StringFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void StringFieldGenerator::GenerateMergingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (SupportsArenas(descriptor_) || descriptor_->containing_oneof() != NULL) {
     // TODO(gpike): improve this
@@ -494,8 +488,7 @@
   }
 }
 
-void StringFieldGenerator::
-GenerateSwappingCode(io::Printer* printer) const {
+void StringFieldGenerator::GenerateSwappingCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (inlined_) {
     format("$name$_.Swap(&other->$name$_);\n");
@@ -506,8 +499,7 @@
   }
 }
 
-void StringFieldGenerator::
-GenerateConstructorCode(io::Printer* printer) const {
+void StringFieldGenerator::GenerateConstructorCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   // TODO(ckennelly): Construct non-empty strings as part of the initializer
   // list.
@@ -519,8 +511,8 @@
   format("$name$_.UnsafeSetDefault($default_variable$);\n");
 }
 
-void StringFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
+void StringFieldGenerator::GenerateCopyConstructorCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   GenerateConstructorCode(printer);
 
@@ -545,8 +537,7 @@
   format("}\n");
 }
 
-void StringFieldGenerator::
-GenerateDestructorCode(io::Printer* printer) const {
+void StringFieldGenerator::GenerateDestructorCode(io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (inlined_) {
     // The destructor is automatically invoked.
@@ -567,8 +558,8 @@
   return true;
 }
 
-void StringFieldGenerator::
-GenerateDefaultInstanceAllocator(io::Printer* printer) const {
+void StringFieldGenerator::GenerateDefaultInstanceAllocator(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (!descriptor_->default_value_string().empty()) {
     format(
@@ -580,8 +571,8 @@
   }
 }
 
-void StringFieldGenerator::
-GenerateMergeFromCodedStream(io::Printer* printer) const {
+void StringFieldGenerator::GenerateMergeFromCodedStream(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   // The google3 version of proto2 has ArenaStrings and parses into them
   // directly, but for the open-source release, we always parse into std::string
@@ -617,13 +608,12 @@
   }
 }
 
-bool StringFieldGenerator::
-MergeFromCodedStreamNeedsArena() const {
+bool StringFieldGenerator::MergeFromCodedStreamNeedsArena() const {
   return !lite_ && !inlined_ && !options_.opensource_runtime;
 }
 
-void StringFieldGenerator::
-GenerateSerializeWithCachedSizes(io::Printer* printer) const {
+void StringFieldGenerator::GenerateSerializeWithCachedSizes(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (descriptor_->type() == FieldDescriptor::TYPE_STRING) {
     GenerateUtf8CheckCodeForString(
@@ -637,8 +627,8 @@
       "  $number$, this->$name$(), output);\n");
 }
 
-void StringFieldGenerator::
-GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
+void StringFieldGenerator::GenerateSerializeWithCachedSizesToArray(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (descriptor_->type() == FieldDescriptor::TYPE_STRING) {
     GenerateUtf8CheckCodeForString(
@@ -652,8 +642,7 @@
       "    $number$, this->$name$(), target);\n");
 }
 
-void StringFieldGenerator::
-GenerateByteSize(io::Printer* printer) const {
+void StringFieldGenerator::GenerateByteSize(io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "total_size += $tag_size$ +\n"
@@ -677,8 +666,8 @@
 
 StringOneofFieldGenerator::~StringOneofFieldGenerator() {}
 
-void StringOneofFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+void StringOneofFieldGenerator::GenerateInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (SupportsArenas(descriptor_)) {
     format(
@@ -906,8 +895,8 @@
   }
 }
 
-void StringOneofFieldGenerator::
-GenerateClearingCode(io::Printer* printer) const {
+void StringOneofFieldGenerator::GenerateClearingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (SupportsArenas(descriptor_)) {
     format(
@@ -918,26 +907,26 @@
   }
 }
 
-void StringOneofFieldGenerator::
-GenerateMessageClearingCode(io::Printer* printer) const {
+void StringOneofFieldGenerator::GenerateMessageClearingCode(
+    io::Printer* printer) const {
   return GenerateClearingCode(printer);
 }
 
-void StringOneofFieldGenerator::
-GenerateSwappingCode(io::Printer* printer) const {
+void StringOneofFieldGenerator::GenerateSwappingCode(
+    io::Printer* printer) const {
   // Don't print any swapping code. Swapping the union will swap this field.
 }
 
-void StringOneofFieldGenerator::
-GenerateConstructorCode(io::Printer* printer) const {
+void StringOneofFieldGenerator::GenerateConstructorCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "$ns$::_$classname$_default_instance_.$name$_.UnsafeSetDefault(\n"
       "    $default_variable$);\n");
 }
 
-void StringOneofFieldGenerator::
-GenerateDestructorCode(io::Printer* printer) const {
+void StringOneofFieldGenerator::GenerateDestructorCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "if (has_$name$()) {\n"
@@ -945,8 +934,8 @@
       "}\n");
 }
 
-void StringOneofFieldGenerator::
-GenerateMergeFromCodedStream(io::Printer* printer) const {
+void StringOneofFieldGenerator::GenerateMergeFromCodedStream(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   // See above: ArenaString is not included in the open-source release.
   if (!options_.opensource_runtime && SupportsArenas(descriptor_) && !lite_) {
@@ -982,7 +971,6 @@
   }
 }
 
-
 // ===================================================================
 
 RepeatedStringFieldGenerator::RepeatedStringFieldGenerator(
@@ -993,14 +981,14 @@
 
 RepeatedStringFieldGenerator::~RepeatedStringFieldGenerator() {}
 
-void RepeatedStringFieldGenerator::
-GeneratePrivateMembers(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GeneratePrivateMembers(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("::$proto_ns$::RepeatedPtrField<std::string> $name$_;\n");
 }
 
-void RepeatedStringFieldGenerator::
-GenerateAccessorDeclarations(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateAccessorDeclarations(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   // See comment above about unknown ctypes.
   bool unknown_ctype = descriptor_->options().ctype() !=
@@ -1062,8 +1050,8 @@
   }
 }
 
-void RepeatedStringFieldGenerator::
-GenerateInlineAccessorDefinitions(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateInlineAccessorDefinitions(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   if (options_.safe_boundary_check) {
     format(
@@ -1157,37 +1145,37 @@
       "}\n");
 }
 
-void RepeatedStringFieldGenerator::
-GenerateClearingCode(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateClearingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.Clear();\n");
 }
 
-void RepeatedStringFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.MergeFrom(from.$name$_);\n");
 }
 
-void RepeatedStringFieldGenerator::
-GenerateSwappingCode(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateSwappingCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.InternalSwap(CastToBase(&other->$name$_));\n");
 }
 
-void RepeatedStringFieldGenerator::
-GenerateConstructorCode(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateConstructorCode(
+    io::Printer* printer) const {
   // Not needed for repeated fields.
 }
 
-void RepeatedStringFieldGenerator::
-GenerateCopyConstructorCode(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateCopyConstructorCode(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("$name$_.CopyFrom(from.$name$_);");
 }
 
-void RepeatedStringFieldGenerator::
-GenerateMergeFromCodedStream(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateMergeFromCodedStream(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "DO_(::$proto_ns$::internal::WireFormatLite::Read$declared_type$(\n"
@@ -1201,8 +1189,8 @@
   }
 }
 
-void RepeatedStringFieldGenerator::
-GenerateSerializeWithCachedSizes(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateSerializeWithCachedSizes(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("for (int i = 0, n = this->$name$_size(); i < n; i++) {\n");
   format.Indent();
@@ -1219,8 +1207,8 @@
       "}\n");
 }
 
-void RepeatedStringFieldGenerator::
-GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateSerializeWithCachedSizesToArray(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format("for (int i = 0, n = this->$name$_size(); i < n; i++) {\n");
   format.Indent();
@@ -1237,8 +1225,8 @@
       "}\n");
 }
 
-void RepeatedStringFieldGenerator::
-GenerateByteSize(io::Printer* printer) const {
+void RepeatedStringFieldGenerator::GenerateByteSize(
+    io::Printer* printer) const {
   Formatter format(printer, variables_);
   format(
       "total_size += $tag_size$ *\n"
diff --git a/src/google/protobuf/compiler/cpp/cpp_unittest.cc b/src/google/protobuf/compiler/cpp/cpp_unittest.cc
index 4a52460..74310a7 100644
--- a/src/google/protobuf/compiler/cpp/cpp_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_unittest.cc
@@ -47,8 +47,8 @@
 #include <google/protobuf/compiler/cpp/cpp_unittest.h>
 
 #include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_optimize_for.pb.h>
 #include <google/protobuf/unittest_embed_optimize_for.pb.h>
+#include <google/protobuf/unittest_optimize_for.pb.h>
 
 #include <google/protobuf/test_util.h>
 
@@ -96,8 +96,7 @@
   // parameter names.
   typedef protobuf_unittest::TestConflictingSymbolNamesExtension ExtensionMessage;
   message.AddExtension(ExtensionMessage::repeated_int32_ext, 123);
-  EXPECT_EQ(123,
-            message.GetExtension(ExtensionMessage::repeated_int32_ext, 0));
+  EXPECT_EQ(123, message.GetExtension(ExtensionMessage::repeated_int32_ext, 0));
 }
 
 TEST(GENERATED_MESSAGE_TEST_NAME, TestConflictingEnumNames) {
@@ -128,7 +127,6 @@
   EXPECT_EQ(123, message.GetExtension(protobuf_unittest::void_));
 }
 
-
 }  // namespace cpp_unittest
 }  // namespace cpp
 }  // namespace compiler
diff --git a/src/google/protobuf/compiler/cpp/metadata_test.cc b/src/google/protobuf/compiler/cpp/metadata_test.cc
index 3cdda93..045c6a3 100644
--- a/src/google/protobuf/compiler/cpp/metadata_test.cc
+++ b/src/google/protobuf/compiler/cpp/metadata_test.cc
@@ -69,8 +69,7 @@
         "annotation_guard_name=guard_name:" +
         TestTempDir();
 
-    const bool result =
-        atu::RunProtoCompiler(filename, cpp_out, &cli, file);
+    const bool result = atu::RunProtoCompiler(filename, cpp_out, &cli, file);
 
     if (!result) {
       return result;
diff --git a/src/google/protobuf/compiler/importer.cc b/src/google/protobuf/compiler/importer.cc
index 54ddfb8..715d999 100644
--- a/src/google/protobuf/compiler/importer.cc
+++ b/src/google/protobuf/compiler/importer.cc
@@ -37,10 +37,10 @@
 #else
 #include <unistd.h>
 #endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
 #include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
 
 #include <algorithm>
 #include <memory>
@@ -48,12 +48,12 @@
 #include <google/protobuf/compiler/importer.h>
 
 #include <google/protobuf/compiler/parser.h>
+#include <google/protobuf/io/io_win32.h>
 #include <google/protobuf/io/tokenizer.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/stubs/strutil.h>
 
 
-#include <google/protobuf/stubs/io_win32.h>
 
 #ifdef _WIN32
 #include <ctype.h>
@@ -66,8 +66,8 @@
 #ifdef _WIN32
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
-using google::protobuf::internal::win32::access;
-using google::protobuf::internal::win32::open;
+using google::protobuf::io::win32::access;
+using google::protobuf::io::win32::open;
 #endif
 
 // Returns true if the text looks like a Windows-style absolute path, starting
@@ -75,10 +75,8 @@
 // copy in command_line_interface.cc?
 static bool IsWindowsAbsolutePath(const std::string& text) {
 #if defined(_WIN32) || defined(__CYGWIN__)
-  return text.size() >= 3 && text[1] == ':' &&
-         isalpha(text[0]) &&
-         (text[2] == '/' || text[2] == '\\') &&
-         text.find_last_of(':') == 1;
+  return text.size() >= 3 && text[1] == ':' && isalpha(text[0]) &&
+         (text[2] == '/' || text[2] == '\\') && text.find_last_of(':') == 1;
 #else
   return false;
 #endif
@@ -165,8 +163,7 @@
 
   // Parse it.
   output->set_name(filename);
-  return parser.Parse(&tokenizer, output) &&
-         !file_error_collector.had_errors();
+  return parser.Parse(&tokenizer, output) && !file_error_collector.had_errors();
 }
 
 bool SourceTreeDescriptorDatabase::FindFileContainingSymbol(
@@ -183,11 +180,11 @@
 // -------------------------------------------------------------------
 
 SourceTreeDescriptorDatabase::ValidationErrorCollector::
-ValidationErrorCollector(SourceTreeDescriptorDatabase* owner)
-  : owner_(owner) {}
+    ValidationErrorCollector(SourceTreeDescriptorDatabase* owner)
+    : owner_(owner) {}
 
 SourceTreeDescriptorDatabase::ValidationErrorCollector::
-~ValidationErrorCollector() {}
+    ~ValidationErrorCollector() {}
 
 void SourceTreeDescriptorDatabase::ValidationErrorCollector::AddError(
     const std::string& filename, const std::string& element_name,
@@ -196,7 +193,12 @@
   if (owner_->error_collector_ == NULL) return;
 
   int line, column;
-  owner_->source_locations_.Find(descriptor, location, &line, &column);
+  if (location == DescriptorPool::ErrorCollector::IMPORT) {
+    owner_->source_locations_.FindImport(descriptor, element_name, &line,
+                                         &column);
+  } else {
+    owner_->source_locations_.Find(descriptor, location, &line, &column);
+  }
   owner_->error_collector_->AddError(filename, line, column, message);
 }
 
@@ -207,7 +209,12 @@
   if (owner_->error_collector_ == NULL) return;
 
   int line, column;
-  owner_->source_locations_.Find(descriptor, location, &line, &column);
+  if (location == DescriptorPool::ErrorCollector::IMPORT) {
+    owner_->source_locations_.FindImport(descriptor, element_name, &line,
+                                         &column);
+  } else {
+    owner_->source_locations_.Find(descriptor, location, &line, &column);
+  }
   owner_->error_collector_->AddWarning(filename, line, column, message);
 }
 
@@ -215,8 +222,8 @@
 
 Importer::Importer(SourceTree* source_tree,
                    MultiFileErrorCollector* error_collector)
-  : database_(source_tree),
-    pool_(&database_, database_.GetValidationErrorCollector()) {
+    : database_(source_tree),
+      pool_(&database_, database_.GetValidationErrorCollector()) {
   pool_.EnforceWeakDependencies(true);
   database_.RecordErrorsTo(error_collector);
 }
@@ -297,8 +304,8 @@
     // Restore leading slash.
     result = '/' + result;
   }
-  if (!path.empty() && LastChar(path) == '/' &&
-      !result.empty() && LastChar(result) != '/') {
+  if (!path.empty() && LastChar(path) == '/' && !result.empty() &&
+      LastChar(result) != '/') {
     // Restore trailing slash.
     result += '/';
   }
@@ -453,8 +460,9 @@
     // We do not allow importing of paths containing things like ".." or
     // consecutive slashes since the compiler expects files to be uniquely
     // identified by file name.
-    last_error_message_ = "Backslashes, consecutive slashes, \".\", or \"..\" "
-                          "are not allowed in the virtual path";
+    last_error_message_ =
+        "Backslashes, consecutive slashes, \".\", or \"..\" "
+        "are not allowed in the virtual path";
     return NULL;
   }
 
@@ -472,8 +480,8 @@
 
       if (errno == EACCES) {
         // The file exists but is not readable.
-        last_error_message_ = "Read access is denied for file: " +
-                              temp_disk_file;
+        last_error_message_ =
+            "Read access is denied for file: " + temp_disk_file;
         return NULL;
       }
     }
diff --git a/src/google/protobuf/compiler/importer.h b/src/google/protobuf/compiler/importer.h
index 5f7ed39..1a0b47a 100644
--- a/src/google/protobuf/compiler/importer.h
+++ b/src/google/protobuf/compiler/importer.h
@@ -37,20 +37,22 @@
 #ifndef GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__
 #define GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__
 
-#include <string>
-#include <vector>
 #include <set>
+#include <string>
 #include <utility>
+#include <vector>
+#include <google/protobuf/compiler/parser.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/descriptor_database.h>
-#include <google/protobuf/compiler/parser.h>
 
 #include <google/protobuf/port_def.inc>
 
 namespace google {
 namespace protobuf {
 
-namespace io { class ZeroCopyInputStream; }
+namespace io {
+class ZeroCopyInputStream;
+}
 
 namespace compiler {
 
@@ -154,8 +156,7 @@
 // TODO(kenton):  I feel like this class is not well-named.
 class PROTOBUF_EXPORT Importer {
  public:
-  Importer(SourceTree* source_tree,
-           MultiFileErrorCollector* error_collector);
+  Importer(SourceTree* source_tree, MultiFileErrorCollector* error_collector);
   ~Importer();
 
   // Import the given file and build a FileDescriptor representing it.  If
@@ -175,9 +176,7 @@
 
   // The DescriptorPool in which all imported FileDescriptors and their
   // contents are stored.
-  inline const DescriptorPool* pool() const {
-    return &pool_;
-  }
+  inline const DescriptorPool* pool() const { return &pool_; }
 
   void AddUnusedImportTrackFile(const std::string& file_name);
   void ClearUnusedImportTrackFiles();
diff --git a/src/google/protobuf/compiler/importer_unittest.cc b/src/google/protobuf/compiler/importer_unittest.cc
index 355fccd..6d22e85 100644
--- a/src/google/protobuf/compiler/importer_unittest.cc
+++ b/src/google/protobuf/compiler/importer_unittest.cc
@@ -74,14 +74,14 @@
   // implements ErrorCollector ---------------------------------------
   void AddError(const std::string& filename, int line, int column,
                 const std::string& message) {
-    strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n",
-                                 filename, line, column, message);
+    strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", filename, line,
+                                 column, message);
   }
 
   void AddWarning(const std::string& filename, int line, int column,
                   const std::string& message) {
-    strings::SubstituteAndAppend(&warning_text_, "$0:$1:$2: $3\n",
-                                 filename, line, column, message);
+    strings::SubstituteAndAppend(&warning_text_, "$0:$1:$2: $3\n", filename,
+                                 line, column, message);
   }
 };
 
@@ -117,8 +117,7 @@
 
 class ImporterTest : public testing::Test {
  protected:
-  ImporterTest()
-    : importer_(&source_tree_, &error_collector_) {}
+  ImporterTest() : importer_(&source_tree_, &error_collector_) {}
 
   void AddFile(const std::string& filename, const char* text) {
     source_tree_.AddFile(filename, text);
@@ -136,8 +135,8 @@
 TEST_F(ImporterTest, Import) {
   // Test normal importing.
   AddFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "message Foo {}\n");
+          "syntax = \"proto2\";\n"
+          "message Foo {}\n");
 
   const FileDescriptor* file = importer_.Import("foo.proto");
   EXPECT_EQ("", error_collector_.text_);
@@ -153,14 +152,14 @@
 TEST_F(ImporterTest, ImportNested) {
   // Test that importing a file which imports another file works.
   AddFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "import \"bar.proto\";\n"
-    "message Foo {\n"
-    "  optional Bar bar = 1;\n"
-    "}\n");
+          "syntax = \"proto2\";\n"
+          "import \"bar.proto\";\n"
+          "message Foo {\n"
+          "  optional Bar bar = 1;\n"
+          "}\n");
   AddFile("bar.proto",
-    "syntax = \"proto2\";\n"
-    "message Bar {}\n");
+          "syntax = \"proto2\";\n"
+          "message Bar {}\n");
 
   // Note that both files are actually parsed by the first call to Import()
   // here, since foo.proto imports bar.proto.  The second call just returns
@@ -190,42 +189,73 @@
 TEST_F(ImporterTest, FileNotFound) {
   // Error:  Parsing a file that doesn't exist.
   EXPECT_TRUE(importer_.Import("foo.proto") == NULL);
-  EXPECT_EQ(
-    "foo.proto:-1:0: File not found.\n",
-    error_collector_.text_);
+  EXPECT_EQ("foo.proto:-1:0: File not found.\n", error_collector_.text_);
 }
 
 TEST_F(ImporterTest, ImportNotFound) {
   // Error:  Importing a file that doesn't exist.
   AddFile("foo.proto",
-    "syntax = \"proto2\";\n"
-    "import \"bar.proto\";\n");
+          "syntax = \"proto2\";\n"
+          "import \"bar.proto\";\n");
 
   EXPECT_TRUE(importer_.Import("foo.proto") == NULL);
   EXPECT_EQ(
-    "bar.proto:-1:0: File not found.\n"
-    "foo.proto:-1:0: Import \"bar.proto\" was not found or had errors.\n",
-    error_collector_.text_);
+      "bar.proto:-1:0: File not found.\n"
+      "foo.proto:1:0: Import \"bar.proto\" was not found or had errors.\n",
+      error_collector_.text_);
 }
 
 TEST_F(ImporterTest, RecursiveImport) {
   // Error:  Recursive import.
   AddFile("recursive1.proto",
-    "syntax = \"proto2\";\n"
-    "import \"recursive2.proto\";\n");
+          "syntax = \"proto2\";\n"
+          "\n"
+          "import \"recursive2.proto\";\n");
   AddFile("recursive2.proto",
-    "syntax = \"proto2\";\n"
-    "import \"recursive1.proto\";\n");
+          "syntax = \"proto2\";\n"
+          "import \"recursive1.proto\";\n");
 
   EXPECT_TRUE(importer_.Import("recursive1.proto") == NULL);
   EXPECT_EQ(
-    "recursive1.proto:-1:0: File recursively imports itself: recursive1.proto "
+      "recursive1.proto:2:0: File recursively imports itself: "
+      "recursive1.proto "
       "-> recursive2.proto -> recursive1.proto\n"
-    "recursive2.proto:-1:0: Import \"recursive1.proto\" was not found "
+      "recursive2.proto:1:0: Import \"recursive1.proto\" was not found "
       "or had errors.\n"
-    "recursive1.proto:-1:0: Import \"recursive2.proto\" was not found "
+      "recursive1.proto:2:0: Import \"recursive2.proto\" was not found "
       "or had errors.\n",
-    error_collector_.text_);
+      error_collector_.text_);
+}
+
+TEST_F(ImporterTest, RecursiveImportSelf) {
+  // Error:  Recursive import.
+  AddFile("recursive.proto",
+          "syntax = \"proto2\";\n"
+          "\n"
+          "import \"recursive.proto\";\n");
+
+  EXPECT_TRUE(importer_.Import("recursive.proto") == nullptr);
+  EXPECT_EQ(
+      "recursive.proto:2:0: File recursively imports itself: "
+      "recursive.proto -> recursive.proto\n",
+      error_collector_.text_);
+}
+
+TEST_F(ImporterTest, LiteRuntimeImport) {
+  // Error:  Recursive import.
+  AddFile("bar.proto",
+          "syntax = \"proto2\";\n"
+          "option optimize_for = LITE_RUNTIME;\n");
+  AddFile("foo.proto",
+          "syntax = \"proto2\";\n"
+          "import \"bar.proto\";\n");
+
+  EXPECT_TRUE(importer_.Import("foo.proto") == nullptr);
+  EXPECT_EQ(
+      "foo.proto:1:0: Files that do not use optimize_for = LITE_RUNTIME "
+      "cannot import files which do use this option.  This file is not "
+      "lite, but it imports \"bar.proto\" which is.\n",
+      error_collector_.text_);
 }
 
 
@@ -396,23 +426,23 @@
   std::string shadowing_disk_file;
 
   EXPECT_EQ(DiskSourceTree::NO_MAPPING,
-    source_tree_.DiskFileToVirtualFile(
-      "/foo", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile("/foo", &virtual_file,
+                                               &shadowing_disk_file));
 
   EXPECT_EQ(DiskSourceTree::SHADOWED,
-    source_tree_.DiskFileToVirtualFile(
-      dirnames_[1] + "/foo", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile(
+                dirnames_[1] + "/foo", &virtual_file, &shadowing_disk_file));
   EXPECT_EQ("bar/foo", virtual_file);
   EXPECT_EQ(dirnames_[0] + "/foo", shadowing_disk_file);
 
   EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,
-    source_tree_.DiskFileToVirtualFile(
-      dirnames_[1] + "/baz", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile(
+                dirnames_[1] + "/baz", &virtual_file, &shadowing_disk_file));
   EXPECT_EQ("bar/baz", virtual_file);
 
   EXPECT_EQ(DiskSourceTree::SUCCESS,
-    source_tree_.DiskFileToVirtualFile(
-      dirnames_[0] + "/foo", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile(
+                dirnames_[0] + "/foo", &virtual_file, &shadowing_disk_file));
   EXPECT_EQ("bar/foo", virtual_file);
 }
 
@@ -431,55 +461,55 @@
 
   // "../.." should not be considered to be under "..".
   EXPECT_EQ(DiskSourceTree::NO_MAPPING,
-    source_tree_.DiskFileToVirtualFile(
-      "../../baz", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile("../../baz", &virtual_file,
+                                               &shadowing_disk_file));
 
   // "/foo" is not mapped (it should not be misintepreted as being under ".").
   EXPECT_EQ(DiskSourceTree::NO_MAPPING,
-    source_tree_.DiskFileToVirtualFile(
-      "/foo", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile("/foo", &virtual_file,
+                                               &shadowing_disk_file));
 
 #ifdef WIN32
   // "C:\foo" is not mapped (it should not be misintepreted as being under ".").
   EXPECT_EQ(DiskSourceTree::NO_MAPPING,
-    source_tree_.DiskFileToVirtualFile(
-      "C:\\foo", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile("C:\\foo", &virtual_file,
+                                               &shadowing_disk_file));
 #endif  // WIN32
 
   // But "../baz" should be.
   EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,
-    source_tree_.DiskFileToVirtualFile(
-      "../baz", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile("../baz", &virtual_file,
+                                               &shadowing_disk_file));
   EXPECT_EQ("dir1/baz", virtual_file);
 
   // "../../foo/baz" is under "../../foo".
   EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,
-    source_tree_.DiskFileToVirtualFile(
-      "../../foo/baz", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile("../../foo/baz", &virtual_file,
+                                               &shadowing_disk_file));
   EXPECT_EQ("dir2/baz", virtual_file);
 
   // "foo/./bar/baz" is under "./foo/bar/.".
   EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,
-    source_tree_.DiskFileToVirtualFile(
-      "foo/bar/baz", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile("foo/bar/baz", &virtual_file,
+                                               &shadowing_disk_file));
   EXPECT_EQ("dir3/baz", virtual_file);
 
   // "bar" is under ".".
   EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,
-    source_tree_.DiskFileToVirtualFile(
-      "bar", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile("bar", &virtual_file,
+                                               &shadowing_disk_file));
   EXPECT_EQ("dir4/bar", virtual_file);
 
   // "/qux/baz" is under "/qux".
   EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,
-    source_tree_.DiskFileToVirtualFile(
-      "/qux/baz", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile("/qux/baz", &virtual_file,
+                                               &shadowing_disk_file));
   EXPECT_EQ("baz", virtual_file);
 
   // "/quux/bar" is under "/quux".
   EXPECT_EQ(DiskSourceTree::CANNOT_OPEN,
-    source_tree_.DiskFileToVirtualFile(
-      "/quux/bar", &virtual_file, &shadowing_disk_file));
+            source_tree_.DiskFileToVirtualFile("/quux/bar", &virtual_file,
+                                               &shadowing_disk_file));
   EXPECT_EQ("dir5/bar", virtual_file);
 }
 
diff --git a/src/google/protobuf/compiler/java/java_context.cc b/src/google/protobuf/compiler/java/java_context.cc
index 8c8ab83..778d3ba 100644
--- a/src/google/protobuf/compiler/java/java_context.cc
+++ b/src/google/protobuf/compiler/java/java_context.cc
@@ -48,8 +48,7 @@
   InitializeFieldGeneratorInfo(file);
 }
 
-Context::~Context() {
-}
+Context::~Context() {}
 
 ClassNameResolver* Context::GetNameResolver() const {
   return name_resolver_.get();
diff --git a/src/google/protobuf/compiler/java/java_context.h b/src/google/protobuf/compiler/java/java_context.h
index fd41a27..3fa6af1 100644
--- a/src/google/protobuf/compiler/java/java_context.h
+++ b/src/google/protobuf/compiler/java/java_context.h
@@ -40,16 +40,16 @@
 
 namespace google {
 namespace protobuf {
-  class FileDescriptor;
-  class FieldDescriptor;
-  class OneofDescriptor;
-  class Descriptor;
-  class EnumDescriptor;
-  namespace compiler {
-    namespace java {
-      class ClassNameResolver;  // name_resolver.h
-    }
-  }
+class FileDescriptor;
+class FieldDescriptor;
+class OneofDescriptor;
+class Descriptor;
+class EnumDescriptor;
+namespace compiler {
+namespace java {
+class ClassNameResolver;  // name_resolver.h
+}
+}  // namespace compiler
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/compiler/java/java_doc_comment.cc b/src/google/protobuf/compiler/java/java_doc_comment.cc
index 280b052..29447ac 100644
--- a/src/google/protobuf/compiler/java/java_doc_comment.cc
+++ b/src/google/protobuf/compiler/java/java_doc_comment.cc
@@ -102,8 +102,8 @@
   return result;
 }
 
-static void WriteDocCommentBodyForLocation(
-    io::Printer* printer, const SourceLocation& location) {
+static void WriteDocCommentBodyForLocation(io::Printer* printer,
+                                           const SourceLocation& location) {
   std::string comments = location.leading_comments.empty()
                              ? location.trailing_comments
                              : location.leading_comments;
@@ -139,8 +139,8 @@
 }
 
 template <typename DescriptorType>
-static void WriteDocCommentBody(
-    io::Printer* printer, const DescriptorType* descriptor) {
+static void WriteDocCommentBody(io::Printer* printer,
+                                const DescriptorType* descriptor) {
   SourceLocation location;
   if (descriptor->GetSourceLocation(&location)) {
     WriteDocCommentBodyForLocation(printer, location);
@@ -167,9 +167,9 @@
   printer->Print("/**\n");
   WriteDocCommentBody(printer, message);
   printer->Print(
-    " * Protobuf type {@code $fullname$}\n"
-    " */\n",
-    "fullname", EscapeJavadoc(message->full_name()));
+      " * Protobuf type {@code $fullname$}\n"
+      " */\n",
+      "fullname", EscapeJavadoc(message->full_name()));
 }
 
 void WriteFieldDocComment(io::Printer* printer, const FieldDescriptor* field) {
@@ -183,9 +183,8 @@
   // If the field is a group, the debug string might end with {.
   printer->Print("/**\n");
   WriteDocCommentBody(printer, field);
-  printer->Print(
-    " * <code>$def$</code>\n",
-    "def", EscapeJavadoc(FirstLineOf(field->DebugString())));
+  printer->Print(" * <code>$def$</code>\n", "def",
+                 EscapeJavadoc(FirstLineOf(field->DebugString())));
   printer->Print(" */\n");
 }
 
@@ -193,9 +192,9 @@
   printer->Print("/**\n");
   WriteDocCommentBody(printer, enum_);
   printer->Print(
-    " * Protobuf enum {@code $fullname$}\n"
-    " */\n",
-    "fullname", EscapeJavadoc(enum_->full_name()));
+      " * Protobuf enum {@code $fullname$}\n"
+      " */\n",
+      "fullname", EscapeJavadoc(enum_->full_name()));
 }
 
 void WriteEnumValueDocComment(io::Printer* printer,
@@ -203,9 +202,9 @@
   printer->Print("/**\n");
   WriteDocCommentBody(printer, value);
   printer->Print(
-    " * <code>$def$</code>\n"
-    " */\n",
-    "def", EscapeJavadoc(FirstLineOf(value->DebugString())));
+      " * <code>$def$</code>\n"
+      " */\n",
+      "def", EscapeJavadoc(FirstLineOf(value->DebugString())));
 }
 
 void WriteServiceDocComment(io::Printer* printer,
@@ -213,9 +212,9 @@
   printer->Print("/**\n");
   WriteDocCommentBody(printer, service);
   printer->Print(
-    " * Protobuf service {@code $fullname$}\n"
-    " */\n",
-    "fullname", EscapeJavadoc(service->full_name()));
+      " * Protobuf service {@code $fullname$}\n"
+      " */\n",
+      "fullname", EscapeJavadoc(service->full_name()));
 }
 
 void WriteMethodDocComment(io::Printer* printer,
@@ -223,9 +222,9 @@
   printer->Print("/**\n");
   WriteDocCommentBody(printer, method);
   printer->Print(
-    " * <code>$def$</code>\n"
-    " */\n",
-    "def", EscapeJavadoc(FirstLineOf(method->DebugString())));
+      " * <code>$def$</code>\n"
+      " */\n",
+      "def", EscapeJavadoc(FirstLineOf(method->DebugString())));
 }
 
 }  // namespace java
diff --git a/src/google/protobuf/compiler/java/java_enum.cc b/src/google/protobuf/compiler/java/java_enum.cc
index cab34ca..0dade1c 100644
--- a/src/google/protobuf/compiler/java/java_enum.cc
+++ b/src/google/protobuf/compiler/java/java_enum.cc
@@ -51,15 +51,15 @@
 namespace java {
 
 EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor,
-                             bool immutable_api,
-                             Context* context)
-  : descriptor_(descriptor), immutable_api_(immutable_api),
-    context_(context),
-    name_resolver_(context->GetNameResolver())  {
+                             bool immutable_api, Context* context)
+    : descriptor_(descriptor),
+      immutable_api_(immutable_api),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   for (int i = 0; i < descriptor_->value_count(); i++) {
     const EnumValueDescriptor* value = descriptor_->value(i);
     const EnumValueDescriptor* canonical_value =
-      descriptor_->FindValueByNumber(value->number());
+        descriptor_->FindValueByNumber(value->number());
 
     if (value == canonical_value) {
       canonical_values_.push_back(value);
@@ -104,11 +104,9 @@
       printer->Print("@java.lang.Deprecated\n");
     }
     if (ordinal_is_index) {
-      printer->Print(vars,
-        "$name$($number$),\n");
+      printer->Print(vars, "$name$($number$),\n");
     } else {
-      printer->Print(vars,
-        "$name$($index$, $number$),\n");
+      printer->Print(vars, "$name$($index$, $number$),\n");
     }
     printer->Annotate("name", canonical_values_[i]);
   }
@@ -123,8 +121,8 @@
   }
 
   printer->Print(
-    ";\n"
-    "\n");
+      ";\n"
+      "\n");
 
   // -----------------------------------------------------------------
 
@@ -134,8 +132,8 @@
     vars["name"] = aliases_[i].value->name();
     vars["canonical_name"] = aliases_[i].canonical_value->name();
     WriteEnumValueDocComment(printer, aliases_[i].value);
-    printer->Print(vars,
-      "public static final $classname$ $name$ = $canonical_name$;\n");
+    printer->Print(
+        vars, "public static final $classname$ $name$ = $canonical_name$;\n");
     printer->Annotate("name", aliases_[i].value);
   }
 
@@ -147,7 +145,7 @@
     vars["}"] = "";
     WriteEnumValueDocComment(printer, descriptor_->value(i));
     printer->Print(vars,
-      "public static final int ${$$name$_VALUE$}$ = $number$;\n");
+                   "public static final int ${$$name$_VALUE$}$ = $number$;\n");
     printer->Annotate("{", "}", descriptor_->value(i));
   }
   printer->Print("\n");
@@ -155,38 +153,38 @@
   // -----------------------------------------------------------------
 
   printer->Print(
-    "\n"
-    "public final int getNumber() {\n");
+      "\n"
+      "public final int getNumber() {\n");
   if (SupportUnknownEnumValue(descriptor_->file())) {
     if (ordinal_is_index) {
       printer->Print(
-        "  if (this == UNRECOGNIZED) {\n"
-        "    throw new java.lang.IllegalArgumentException(\n"
-        "        \"Can't get the number of an unknown enum value.\");\n"
-        "  }\n");
+          "  if (this == UNRECOGNIZED) {\n"
+          "    throw new java.lang.IllegalArgumentException(\n"
+          "        \"Can't get the number of an unknown enum value.\");\n"
+          "  }\n");
     } else {
       printer->Print(
-        "  if (index == -1) {\n"
-        "    throw new java.lang.IllegalArgumentException(\n"
-        "        \"Can't get the number of an unknown enum value.\");\n"
-        "  }\n");
+          "  if (index == -1) {\n"
+          "    throw new java.lang.IllegalArgumentException(\n"
+          "        \"Can't get the number of an unknown enum value.\");\n"
+          "  }\n");
     }
   }
   printer->Print(
-    "  return value;\n"
-    "}\n"
-    "\n"
-    "/**\n"
-    " * @deprecated Use {@link #forNumber(int)} instead.\n"
-    " */\n"
-    "@java.lang.Deprecated\n"
-    "public static $classname$ valueOf(int value) {\n"
-    "  return forNumber(value);\n"
-    "}\n"
-    "\n"
-    "public static $classname$ forNumber(int value) {\n"
-    "  switch (value) {\n",
-    "classname", descriptor_->name());
+      "  return value;\n"
+      "}\n"
+      "\n"
+      "/**\n"
+      " * @deprecated Use {@link #forNumber(int)} instead.\n"
+      " */\n"
+      "@java.lang.Deprecated\n"
+      "public static $classname$ valueOf(int value) {\n"
+      "  return forNumber(value);\n"
+      "}\n"
+      "\n"
+      "public static $classname$ forNumber(int value) {\n"
+      "  switch (value) {\n",
+      "classname", descriptor_->name());
   printer->Indent();
   printer->Indent();
 
@@ -199,40 +197,40 @@
   printer->Outdent();
   printer->Outdent();
   printer->Print(
-    "    default: return null;\n"
-    "  }\n"
-    "}\n"
-    "\n"
-    "public static com.google.protobuf.Internal.EnumLiteMap<$classname$>\n"
-    "    internalGetValueMap() {\n"
-    "  return internalValueMap;\n"
-    "}\n"
-    "private static final com.google.protobuf.Internal.EnumLiteMap<\n"
-    "    $classname$> internalValueMap =\n"
-    "      new com.google.protobuf.Internal.EnumLiteMap<$classname$>() {\n"
-    "        public $classname$ findValueByNumber(int number) {\n"
-    "          return $classname$.forNumber(number);\n"
-    "        }\n"
-    "      };\n"
-    "\n",
-    "classname", descriptor_->name());
+      "    default: return null;\n"
+      "  }\n"
+      "}\n"
+      "\n"
+      "public static com.google.protobuf.Internal.EnumLiteMap<$classname$>\n"
+      "    internalGetValueMap() {\n"
+      "  return internalValueMap;\n"
+      "}\n"
+      "private static final com.google.protobuf.Internal.EnumLiteMap<\n"
+      "    $classname$> internalValueMap =\n"
+      "      new com.google.protobuf.Internal.EnumLiteMap<$classname$>() {\n"
+      "        public $classname$ findValueByNumber(int number) {\n"
+      "          return $classname$.forNumber(number);\n"
+      "        }\n"
+      "      };\n"
+      "\n",
+      "classname", descriptor_->name());
 
   // -----------------------------------------------------------------
   // Reflection
 
   if (HasDescriptorMethods(descriptor_, context_->EnforceLite())) {
     printer->Print(
-      "public final com.google.protobuf.Descriptors.EnumValueDescriptor\n"
-      "    getValueDescriptor() {\n"
-      "  return getDescriptor().getValues().get($index_text$);\n"
-      "}\n"
-      "public final com.google.protobuf.Descriptors.EnumDescriptor\n"
-      "    getDescriptorForType() {\n"
-      "  return getDescriptor();\n"
-      "}\n"
-      "public static final com.google.protobuf.Descriptors.EnumDescriptor\n"
-      "    getDescriptor() {\n",
-      "index_text", index_text);
+        "public final com.google.protobuf.Descriptors.EnumValueDescriptor\n"
+        "    getValueDescriptor() {\n"
+        "  return getDescriptor().getValues().get($index_text$);\n"
+        "}\n"
+        "public final com.google.protobuf.Descriptors.EnumDescriptor\n"
+        "    getDescriptorForType() {\n"
+        "  return getDescriptor();\n"
+        "}\n"
+        "public static final com.google.protobuf.Descriptors.EnumDescriptor\n"
+        "    getDescriptor() {\n",
+        "index_text", index_text);
 
     // TODO(kenton):  Cache statically?  Note that we can't access descriptors
     //   at module init time because it wouldn't work with descriptor.proto, but
@@ -262,10 +260,10 @@
     }
 
     printer->Print(
-      "}\n"
-      "\n"
-      "private static final $classname$[] VALUES = ",
-      "classname", descriptor_->name());
+        "}\n"
+        "\n"
+        "private static final $classname$[] VALUES = ",
+        "classname", descriptor_->name());
 
     if (CanUseEnumValues()) {
       // If the constants we are going to output are exactly the ones we
@@ -275,11 +273,10 @@
       printer->Print("values();\n");
     } else {
       printer->Print(
-        "{\n"
-        "  ");
+          "{\n"
+          "  ");
       for (int i = 0; i < descriptor_->value_count(); i++) {
-        printer->Print("$name$, ",
-          "name", descriptor_->value(i)->name());
+        printer->Print("$name$, ", "name", descriptor_->value(i)->name());
       }
       printer->Print(
           "\n"
@@ -287,24 +284,24 @@
     }
 
     printer->Print(
-      "\n"
-      "public static $classname$ valueOf(\n"
-      "    com.google.protobuf.Descriptors.EnumValueDescriptor desc) {\n"
-      "  if (desc.getType() != getDescriptor()) {\n"
-      "    throw new java.lang.IllegalArgumentException(\n"
-      "      \"EnumValueDescriptor is not for this type.\");\n"
-      "  }\n",
-      "classname", descriptor_->name());
+        "\n"
+        "public static $classname$ valueOf(\n"
+        "    com.google.protobuf.Descriptors.EnumValueDescriptor desc) {\n"
+        "  if (desc.getType() != getDescriptor()) {\n"
+        "    throw new java.lang.IllegalArgumentException(\n"
+        "      \"EnumValueDescriptor is not for this type.\");\n"
+        "  }\n",
+        "classname", descriptor_->name());
     if (SupportUnknownEnumValue(descriptor_->file())) {
       printer->Print(
-        "  if (desc.getIndex() == -1) {\n"
-        "    return UNRECOGNIZED;\n"
-        "  }\n");
+          "  if (desc.getIndex() == -1) {\n"
+          "    return UNRECOGNIZED;\n"
+          "  }\n");
     }
     printer->Print(
-      "  return VALUES[desc.getIndex()];\n"
-      "}\n"
-      "\n");
+        "  return VALUES[desc.getIndex()];\n"
+        "}\n"
+        "\n");
 
     if (!ordinal_is_index) {
       printer->Print("private final int index;\n");
@@ -313,30 +310,27 @@
 
   // -----------------------------------------------------------------
 
-  printer->Print(
-    "private final int value;\n\n");
+  printer->Print("private final int value;\n\n");
 
   if (ordinal_is_index) {
-    printer->Print(
-      "private $classname$(int value) {\n",
-      "classname", descriptor_->name());
+    printer->Print("private $classname$(int value) {\n", "classname",
+                   descriptor_->name());
   } else {
-    printer->Print(
-      "private $classname$(int index, int value) {\n",
-      "classname", descriptor_->name());
+    printer->Print("private $classname$(int index, int value) {\n", "classname",
+                   descriptor_->name());
   }
   if (HasDescriptorMethods(descriptor_, context_->EnforceLite()) &&
       !ordinal_is_index) {
     printer->Print("  this.index = index;\n");
   }
   printer->Print(
-    "  this.value = value;\n"
-    "}\n");
+      "  this.value = value;\n"
+      "}\n");
 
   printer->Print(
-    "\n"
-    "// @@protoc_insertion_point(enum_scope:$full_name$)\n",
-    "full_name", descriptor_->full_name());
+      "\n"
+      "// @@protoc_insertion_point(enum_scope:$full_name$)\n",
+      "full_name", descriptor_->full_name());
 
   printer->Outdent();
   printer->Print("}\n\n");
diff --git a/src/google/protobuf/compiler/java/java_enum.h b/src/google/protobuf/compiler/java/java_enum.h
index d650924..0a2c363 100644
--- a/src/google/protobuf/compiler/java/java_enum.h
+++ b/src/google/protobuf/compiler/java/java_enum.h
@@ -42,13 +42,13 @@
 namespace google {
 namespace protobuf {
 namespace compiler {
-  namespace java {
-    class Context;           // context.h
-    class ClassNameResolver; // name_resolver.h
-  }
-}
+namespace java {
+class Context;            // context.h
+class ClassNameResolver;  // name_resolver.h
+}  // namespace java
+}  // namespace compiler
 namespace io {
-  class Printer;             // printer.h
+class Printer;  // printer.h
 }
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/compiler/java/java_enum_field.cc b/src/google/protobuf/compiler/java/java_enum_field.cc
index c30a823..b602bba 100644
--- a/src/google/protobuf/compiler/java/java_enum_field.cc
+++ b/src/google/protobuf/compiler/java/java_enum_field.cc
@@ -73,8 +73,8 @@
       internal::WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
-  (*variables)["deprecation"] = descriptor->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  (*variables)["deprecation"] =
+      descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
   (*variables)["on_changed"] = "onChanged();";
   // Use deprecated valueOf() method to be compatible with old generated code
   // for v2.5.0/v2.6.1.
@@ -102,8 +102,8 @@
     (*variables)["clear_has_field_bit_builder"] = "";
 
     (*variables)["is_field_present_message"] =
-        (*variables)["name"] + "_ != " +
-        (*variables)["default"] + ".getNumber()";
+        (*variables)["name"] + "_ != " + (*variables)["default"] +
+        ".getNumber()";
   }
 
   // For repated builders, one bit is used for whether the array is immutable.
@@ -134,17 +134,16 @@
 
 // ===================================================================
 
-ImmutableEnumFieldGenerator::
-ImmutableEnumFieldGenerator(const FieldDescriptor* descriptor,
-                            int messageBitIndex,
-                            int builderBitIndex,
-                            Context* context)
-  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
-    builderBitIndex_(builderBitIndex),
-    name_resolver_(context->GetNameResolver()) {
+ImmutableEnumFieldGenerator::ImmutableEnumFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : descriptor_(descriptor),
+      messageBitIndex_(messageBitIndex),
+      builderBitIndex_(builderBitIndex),
+      name_resolver_(context->GetNameResolver()) {
   SetEnumVariables(descriptor, messageBitIndex, builderBitIndex,
-                   context->GetFieldGeneratorInfo(descriptor),
-                   name_resolver_, &variables_);
+                   context->GetFieldGeneratorInfo(descriptor), name_resolver_,
+                   &variables_);
 }
 
 ImmutableEnumFieldGenerator::~ImmutableEnumFieldGenerator() {}
@@ -157,214 +156,214 @@
   return GetNumBitsForMessage();
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void ImmutableEnumFieldGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$boolean has$capitalized_name$();\n");
+                   "$deprecation$boolean has$capitalized_name$();\n");
   }
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$int get$capitalized_name$Value();\n");
+                   "$deprecation$int get$capitalized_name$Value();\n");
   }
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$();\n");
+  printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n");
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private int $name$_;\n");
+void ImmutableEnumFieldGenerator::GenerateMembers(io::Printer* printer) const {
+  printer->Print(variables_, "private int $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
-      "  return $name$_;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+        "  return $name$_;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  @SuppressWarnings(\"deprecation\")\n"
-    "  $type$ result = $type$.$for_number$($name$_);\n"
-    "  return result == null ? $unknown$ : result;\n"
-    "}\n");
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  @SuppressWarnings(\"deprecation\")\n"
+                 "  $type$ result = $type$.$for_number$($name$_);\n"
+                 "  return result == null ? $unknown$ : result;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private int $name$_ = $default_number$;\n");
+void ImmutableEnumFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_, "private int $name$_ = $default_number$;\n");
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_builder$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_builder$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
-      "  return $name$_;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+        "  return $name$_;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public Builder "
-      "${$set$capitalized_name$Value$}$(int value) {\n"
-      "  $name$_ = value;\n"
+                   "$deprecation$public Builder "
+                   "${$set$capitalized_name$Value$}$(int value) {\n"
+                   "  $name$_ = value;\n"
+                   "  $on_changed$\n"
+                   "  return this;\n"
+                   "}\n");
+    printer->Annotate("{", "}", descriptor_);
+  }
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  @SuppressWarnings(\"deprecation\")\n"
+                 "  $type$ result = $type$.$for_number$($name$_);\n"
+                 "  return result == null ? $unknown$ : result;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder "
+                 "${$set$capitalized_name$$}$($type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  $set_has_field_bit_builder$\n"
+                 "  $name$_ = value.getNumber();\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  $clear_has_field_bit_builder$\n"
+      "  $name$_ = $default_number$;\n"
       "  $on_changed$\n"
       "  return this;\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
-  }
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  @SuppressWarnings(\"deprecation\")\n"
-    "  $type$ result = $type$.$for_number$($name$_);\n"
-    "  return result == null ? $unknown$ : result;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  $set_has_field_bit_builder$\n"
-    "  $name$_ = value.getNumber();\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
-    printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  $clear_has_field_bit_builder$\n"
-    "  $name$_ = $default_number$;\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+void ImmutableEnumFieldGenerator::GenerateFieldBuilderInitializationCode(
+    io::Printer* printer) const {
   // noop for enums
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void ImmutableEnumFieldGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = $default_number$;\n");
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
+void ImmutableEnumFieldGenerator::GenerateBuilderClearCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$name$_ = $default_number$;\n"
-    "$clear_has_field_bit_builder$\n");
+                 "$name$_ = $default_number$;\n"
+                 "$clear_has_field_bit_builder$\n");
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void ImmutableEnumFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     printer->Print(variables_,
-      "if (other.has$capitalized_name$()) {\n"
-      "  set$capitalized_name$(other.get$capitalized_name$());\n"
-      "}\n");
+                   "if (other.has$capitalized_name$()) {\n"
+                   "  set$capitalized_name$(other.get$capitalized_name$());\n"
+                   "}\n");
   } else if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(variables_,
-      "if (other.$name$_ != $default_number$) {\n"
-      "  set$capitalized_name$Value(other.get$capitalized_name$Value());\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "if (other.$name$_ != $default_number$) {\n"
+        "  set$capitalized_name$Value(other.get$capitalized_name$Value());\n"
+        "}\n");
   } else {
     GOOGLE_LOG(FATAL) << "Can't reach here.";
   }
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void ImmutableEnumFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     printer->Print(variables_,
-      "if ($get_has_field_bit_from_local$) {\n"
-      "  $set_has_field_bit_to_local$;\n"
-      "}\n");
+                   "if ($get_has_field_bit_from_local$) {\n"
+                   "  $set_has_field_bit_to_local$;\n"
+                   "}\n");
   }
-  printer->Print(variables_,
-    "result.$name$_ = $name$_;\n");
+  printer->Print(variables_, "result.$name$_ = $name$_;\n");
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void ImmutableEnumFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   if (SupportUnknownEnumValue(descriptor_->file())) {
     printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "$set_has_field_bit_message$\n"
-      "$name$_ = rawValue;\n");
+                   "int rawValue = input.readEnum();\n"
+                   "$set_has_field_bit_message$\n"
+                   "$name$_ = rawValue;\n");
   } else {
     printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-    "  @SuppressWarnings(\"deprecation\")\n"
-      "$type$ value = $type$.$for_number$(rawValue);\n"
-      "if (value == null) {\n"
-      "  unknownFields.mergeVarintField($number$, rawValue);\n"
-      "} else {\n"
-      "  $set_has_field_bit_message$\n"
-      "  $name$_ = rawValue;\n"
-      "}\n");
+                   "int rawValue = input.readEnum();\n"
+                   "  @SuppressWarnings(\"deprecation\")\n"
+                   "$type$ value = $type$.$for_number$(rawValue);\n"
+                   "if (value == null) {\n"
+                   "  unknownFields.mergeVarintField($number$, rawValue);\n"
+                   "} else {\n"
+                   "  $set_has_field_bit_message$\n"
+                   "  $name$_ = rawValue;\n"
+                   "}\n");
   }
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
+void ImmutableEnumFieldGenerator::GenerateParsingDoneCode(
+    io::Printer* printer) const {
   // noop for enums
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
+void ImmutableEnumFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  output.writeEnum($number$, $name$_);\n"
-    "}\n");
+                 "if ($is_field_present_message$) {\n"
+                 "  output.writeEnum($number$, $name$_);\n"
+                 "}\n");
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
+void ImmutableEnumFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .computeEnumSize($number$, $name$_);\n"
-    "}\n");
+                 "if ($is_field_present_message$) {\n"
+                 "  size += com.google.protobuf.CodedOutputStream\n"
+                 "    .computeEnumSize($number$, $name$_);\n"
+                 "}\n");
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($name$_ != other.$name$_) return false;\n");
+void ImmutableEnumFieldGenerator::GenerateEqualsCode(
+    io::Printer* printer) const {
+  printer->Print(variables_, "if ($name$_ != other.$name$_) return false;\n");
 }
 
-void ImmutableEnumFieldGenerator::
-GenerateHashCode(io::Printer* printer) const {
+void ImmutableEnumFieldGenerator::GenerateHashCode(io::Printer* printer) const {
   printer->Print(variables_,
-    "hash = (37 * hash) + $constant_name$;\n"
-    "hash = (53 * hash) + $name$_;\n");
+                 "hash = (37 * hash) + $constant_name$;\n"
+                 "hash = (53 * hash) + $name$_;\n");
 }
 
 std::string ImmutableEnumFieldGenerator::GetBoxedType() const {
@@ -373,221 +372,230 @@
 
 // ===================================================================
 
-ImmutableEnumOneofFieldGenerator::
-ImmutableEnumOneofFieldGenerator(const FieldDescriptor* descriptor,
-                                 int messageBitIndex,
-                                 int builderBitIndex,
-                                 Context* context)
-    : ImmutableEnumFieldGenerator(
-          descriptor, messageBitIndex, builderBitIndex, context) {
+ImmutableEnumOneofFieldGenerator::ImmutableEnumOneofFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : ImmutableEnumFieldGenerator(descriptor, messageBitIndex, builderBitIndex,
+                                  context) {
   const OneofGeneratorInfo* info =
       context->GetOneofGeneratorInfo(descriptor->containing_oneof());
   SetCommonOneofVariables(descriptor, info, &variables_);
 }
 
-ImmutableEnumOneofFieldGenerator::
-~ImmutableEnumOneofFieldGenerator() {}
+ImmutableEnumOneofFieldGenerator::~ImmutableEnumOneofFieldGenerator() {}
 
-void ImmutableEnumOneofFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutableEnumOneofFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
   PrintExtraFieldInfo(variables_, printer);
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $has_oneof_case_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $has_oneof_case_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
-      "  if ($has_oneof_case_message$) {\n"
-      "    return (java.lang.Integer) $oneof_name$_;\n"
-      "  }\n"
-      "  return $default_number$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+        "  if ($has_oneof_case_message$) {\n"
+        "    return (java.lang.Integer) $oneof_name$_;\n"
+        "  }\n"
+        "  return $default_number$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    @SuppressWarnings(\"deprecation\")\n"
-    "    $type$ result = $type$.$for_number$(\n"
-    "        (java.lang.Integer) $oneof_name$_);\n"
-    "    return result == null ? $unknown$ : result;\n"
-    "  }\n"
-    "  return $default$;\n"
-    "}\n");
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    @SuppressWarnings(\"deprecation\")\n"
+                 "    $type$ result = $type$.$for_number$(\n"
+                 "        (java.lang.Integer) $oneof_name$_);\n"
+                 "    return result == null ? $unknown$ : result;\n"
+                 "  }\n"
+                 "  return $default$;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableEnumOneofFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutableEnumOneofFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $has_oneof_case_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $has_oneof_case_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
-      "  if ($has_oneof_case_message$) {\n"
-      "    return ((java.lang.Integer) $oneof_name$_).intValue();\n"
-      "  }\n"
-      "  return $default_number$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+        "  if ($has_oneof_case_message$) {\n"
+        "    return ((java.lang.Integer) $oneof_name$_).intValue();\n"
+        "  }\n"
+        "  return $default_number$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public Builder "
-      "${$set$capitalized_name$Value$}$(int value) {\n"
-      "  $set_oneof_case_message$;\n"
-      "  $oneof_name$_ = value;\n"
-      "  $on_changed$\n"
+                   "$deprecation$public Builder "
+                   "${$set$capitalized_name$Value$}$(int value) {\n"
+                   "  $set_oneof_case_message$;\n"
+                   "  $oneof_name$_ = value;\n"
+                   "  $on_changed$\n"
+                   "  return this;\n"
+                   "}\n");
+    printer->Annotate("{", "}", descriptor_);
+  }
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    @SuppressWarnings(\"deprecation\")\n"
+                 "    $type$ result = $type$.$for_number$(\n"
+                 "        (java.lang.Integer) $oneof_name$_);\n"
+                 "    return result == null ? $unknown$ : result;\n"
+                 "  }\n"
+                 "  return $default$;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder "
+                 "${$set$capitalized_name$$}$($type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  $set_oneof_case_message$;\n"
+                 "  $oneof_name$_ = value.getNumber();\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  if ($has_oneof_case_message$) {\n"
+      "    $clear_oneof_case_message$;\n"
+      "    $oneof_name$_ = null;\n"
+      "    $on_changed$\n"
+      "  }\n"
       "  return this;\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
-  }
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    @SuppressWarnings(\"deprecation\")\n"
-    "    $type$ result = $type$.$for_number$(\n"
-    "        (java.lang.Integer) $oneof_name$_);\n"
-    "    return result == null ? $unknown$ : result;\n"
-    "  }\n"
-    "  return $default$;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  $set_oneof_case_message$;\n"
-    "  $oneof_name$_ = value.getNumber();\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    $clear_oneof_case_message$;\n"
-    "    $oneof_name$_ = null;\n"
-    "    $on_changed$\n"
-    "  }\n"
-    "  return this;\n"
-    "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableEnumOneofFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void ImmutableEnumOneofFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  result.$oneof_name$_ = $oneof_name$_;\n"
-    "}\n");
+                 "if ($has_oneof_case_message$) {\n"
+                 "  result.$oneof_name$_ = $oneof_name$_;\n"
+                 "}\n");
 }
 
-void ImmutableEnumOneofFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void ImmutableEnumOneofFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(variables_,
-      "set$capitalized_name$Value(other.get$capitalized_name$Value());\n");
+    printer->Print(
+        variables_,
+        "set$capitalized_name$Value(other.get$capitalized_name$Value());\n");
   } else {
     printer->Print(variables_,
-      "set$capitalized_name$(other.get$capitalized_name$());\n");
+                   "set$capitalized_name$(other.get$capitalized_name$());\n");
   }
 }
 
-void ImmutableEnumOneofFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void ImmutableEnumOneofFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   if (SupportUnknownEnumValue(descriptor_->file())) {
     printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "$set_oneof_case_message$;\n"
-      "$oneof_name$_ = rawValue;\n");
+                   "int rawValue = input.readEnum();\n"
+                   "$set_oneof_case_message$;\n"
+                   "$oneof_name$_ = rawValue;\n");
   } else {
     printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "@SuppressWarnings(\"deprecation\")\n"
-      "$type$ value = $type$.$for_number$(rawValue);\n"
-      "if (value == null) {\n"
-      "  unknownFields.mergeVarintField($number$, rawValue);\n"
-      "} else {\n"
-      "  $set_oneof_case_message$;\n"
-      "  $oneof_name$_ = rawValue;\n"
+                   "int rawValue = input.readEnum();\n"
+                   "@SuppressWarnings(\"deprecation\")\n"
+                   "$type$ value = $type$.$for_number$(rawValue);\n"
+                   "if (value == null) {\n"
+                   "  unknownFields.mergeVarintField($number$, rawValue);\n"
+                   "} else {\n"
+                   "  $set_oneof_case_message$;\n"
+                   "  $oneof_name$_ = rawValue;\n"
+                   "}\n");
+  }
+}
+
+void ImmutableEnumOneofFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if ($has_oneof_case_message$) {\n"
+      "  output.writeEnum($number$, ((java.lang.Integer) $oneof_name$_));\n"
       "}\n");
+}
+
+void ImmutableEnumOneofFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if ($has_oneof_case_message$) {\n"
+      "  size += com.google.protobuf.CodedOutputStream\n"
+      "    .computeEnumSize($number$, ((java.lang.Integer) $oneof_name$_));\n"
+      "}\n");
+}
+
+void ImmutableEnumOneofFieldGenerator::GenerateEqualsCode(
+    io::Printer* printer) const {
+  if (SupportUnknownEnumValue(descriptor_->file())) {
+    printer->Print(
+        variables_,
+        "if (get$capitalized_name$Value()\n"
+        "    != other.get$capitalized_name$Value()) return false;\n");
+  } else {
+    printer->Print(
+        variables_,
+        "if (!get$capitalized_name$()\n"
+        "    .equals(other.get$capitalized_name$())) return false;\n");
   }
 }
 
-void ImmutableEnumOneofFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  output.writeEnum($number$, ((java.lang.Integer) $oneof_name$_));\n"
-    "}\n");
-}
-
-void ImmutableEnumOneofFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .computeEnumSize($number$, ((java.lang.Integer) $oneof_name$_));\n"
-    "}\n");
-}
-
-void ImmutableEnumOneofFieldGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
+void ImmutableEnumOneofFieldGenerator::GenerateHashCode(
+    io::Printer* printer) const {
   if (SupportUnknownEnumValue(descriptor_->file())) {
     printer->Print(variables_,
-      "if (get$capitalized_name$Value()\n"
-      "    != other.get$capitalized_name$Value()) return false;\n");
+                   "hash = (37 * hash) + $constant_name$;\n"
+                   "hash = (53 * hash) + get$capitalized_name$Value();\n");
   } else {
-    printer->Print(variables_,
-      "if (!get$capitalized_name$()\n"
-      "    .equals(other.get$capitalized_name$())) return false;\n");
-  }
-}
-
-void ImmutableEnumOneofFieldGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(variables_,
-      "hash = (37 * hash) + $constant_name$;\n"
-      "hash = (53 * hash) + get$capitalized_name$Value();\n");
-  } else {
-    printer->Print(variables_,
-      "hash = (37 * hash) + $constant_name$;\n"
-      "hash = (53 * hash) + get$capitalized_name$().getNumber();\n");
+    printer->Print(
+        variables_,
+        "hash = (37 * hash) + $constant_name$;\n"
+        "hash = (53 * hash) + get$capitalized_name$().getNumber();\n");
   }
 }
 
 // ===================================================================
 
-RepeatedImmutableEnumFieldGenerator::
-RepeatedImmutableEnumFieldGenerator(const FieldDescriptor* descriptor,
-                                    int messageBitIndex,
-                                    int builderBitIndex,
-                                    Context* context)
-  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
-    builderBitIndex_(builderBitIndex), context_(context),
-    name_resolver_(context->GetNameResolver()) {
+RepeatedImmutableEnumFieldGenerator::RepeatedImmutableEnumFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : descriptor_(descriptor),
+      messageBitIndex_(messageBitIndex),
+      builderBitIndex_(builderBitIndex),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   SetEnumVariables(descriptor, messageBitIndex, builderBitIndex,
-                   context->GetFieldGeneratorInfo(descriptor),
-                   name_resolver_, &variables_);
+                   context->GetFieldGeneratorInfo(descriptor), name_resolver_,
+                   &variables_);
 }
 
 RepeatedImmutableEnumFieldGenerator::~RepeatedImmutableEnumFieldGenerator() {}
@@ -600,398 +608,413 @@
   return 1;
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$java.util.List<$type$> get$capitalized_name$List();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.util.List<$type$> get$capitalized_name$List();\n");
+                 "$deprecation$int get$capitalized_name$Count();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$int get$capitalized_name$Count();\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$(int index);\n");
+                 "$deprecation$$type$ get$capitalized_name$(int index);\n");
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$java.util.List<java.lang.Integer>\n"
-      "get$capitalized_name$ValueList();\n");
+                   "$deprecation$java.util.List<java.lang.Integer>\n"
+                   "get$capitalized_name$ValueList();\n");
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$int get$capitalized_name$Value(int index);\n");
+                   "$deprecation$int get$capitalized_name$Value(int index);\n");
   }
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private java.util.List<java.lang.Integer> $name$_;\n"
-    "private static final com.google.protobuf.Internal.ListAdapter.Converter<\n"
-    "    java.lang.Integer, $type$> $name$_converter_ =\n"
-    "        new com.google.protobuf.Internal.ListAdapter.Converter<\n"
-    "            java.lang.Integer, $type$>() {\n"
-    "          public $type$ convert(java.lang.Integer from) {\n"
-    "            @SuppressWarnings(\"deprecation\")\n"
-    "            $type$ result = $type$.$for_number$(from);\n"
-    "            return result == null ? $unknown$ : result;\n"
-    "          }\n"
-    "        };\n");
+void RepeatedImmutableEnumFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "private java.util.List<java.lang.Integer> $name$_;\n"
+      "private static final "
+      "com.google.protobuf.Internal.ListAdapter.Converter<\n"
+      "    java.lang.Integer, $type$> $name$_converter_ =\n"
+      "        new com.google.protobuf.Internal.ListAdapter.Converter<\n"
+      "            java.lang.Integer, $type$>() {\n"
+      "          public $type$ convert(java.lang.Integer from) {\n"
+      "            @SuppressWarnings(\"deprecation\")\n"
+      "            $type$ result = $type$.$for_number$(from);\n"
+      "            return result == null ? $unknown$ : result;\n"
+      "          }\n"
+      "        };\n");
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\n"
-    "  return new com.google.protobuf.Internal.ListAdapter<\n"
-    "      java.lang.Integer, $type$>($name$_, $name$_converter_);\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public java.util.List<$type$> "
+      "${$get$capitalized_name$List$}$() {\n"
+      "  return new com.google.protobuf.Internal.ListAdapter<\n"
+      "      java.lang.Integer, $type$>($name$_, $name$_converter_);\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return $name$_converter_.convert($name$_.get(index));\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return $name$_converter_.convert($name$_.get(index));\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public java.util.List<java.lang.Integer>\n"
-      "${$get$capitalized_name$ValueList$}$() {\n"
-      "  return $name$_;\n"
-      "}\n");
+                   "$deprecation$public java.util.List<java.lang.Integer>\n"
+                   "${$get$capitalized_name$ValueList$}$() {\n"
+                   "  return $name$_;\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$(int index) {\n"
-      "  return $name$_.get(index);\n"
-      "}\n");
+                   "$deprecation$public int "
+                   "${$get$capitalized_name$Value$}$(int index) {\n"
+                   "  return $name$_.get(index);\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   if (descriptor_->is_packed()) {
-    printer->Print(variables_,
-      "private int $name$MemoizedSerializedSize;\n");
+    printer->Print(variables_, "private int $name$MemoizedSerializedSize;\n");
   }
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    // One field is the list and the other field keeps track of whether the
-    // list is immutable. If it's immutable, the invariant is that it must
-    // either an instance of Collections.emptyList() or it's an ArrayList
-    // wrapped in a Collections.unmodifiableList() wrapper and nobody else has
-    // a refererence to the underlying ArrayList. This invariant allows us to
-    // share instances of lists between protocol buffers avoiding expensive
-    // memory allocations. Note, immutable is a strong guarantee here -- not
-    // just that the list cannot be modified via the reference but that the
-    // list can never be modified.
-    "private java.util.List<java.lang.Integer> $name$_ =\n"
-    "  java.util.Collections.emptyList();\n"
+void RepeatedImmutableEnumFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      // One field is the list and the other field keeps track of whether the
+      // list is immutable. If it's immutable, the invariant is that it must
+      // either an instance of Collections.emptyList() or it's an ArrayList
+      // wrapped in a Collections.unmodifiableList() wrapper and nobody else has
+      // a refererence to the underlying ArrayList. This invariant allows us to
+      // share instances of lists between protocol buffers avoiding expensive
+      // memory allocations. Note, immutable is a strong guarantee here -- not
+      // just that the list cannot be modified via the reference but that the
+      // list can never be modified.
+      "private java.util.List<java.lang.Integer> $name$_ =\n"
+      "  java.util.Collections.emptyList();\n"
 
-    "private void ensure$capitalized_name$IsMutable() {\n"
-    "  if (!$get_mutable_bit_builder$) {\n"
-    "    $name$_ = new java.util.ArrayList<java.lang.Integer>($name$_);\n"
-    "    $set_mutable_bit_builder$;\n"
-    "  }\n"
-    "}\n");
+      "private void ensure$capitalized_name$IsMutable() {\n"
+      "  if (!$get_mutable_bit_builder$) {\n"
+      "    $name$_ = new java.util.ArrayList<java.lang.Integer>($name$_);\n"
+      "    $set_mutable_bit_builder$;\n"
+      "  }\n"
+      "}\n");
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    // Note:  We return an unmodifiable list because otherwise the caller
-    //   could hold on to the returned list and modify it after the message
-    //   has been built, thus mutating the message which is supposed to be
-    //   immutable.
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\n"
-    "  return new com.google.protobuf.Internal.ListAdapter<\n"
-    "      java.lang.Integer, $type$>($name$_, $name$_converter_);\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      // Note:  We return an unmodifiable list because otherwise the caller
+      //   could hold on to the returned list and modify it after the message
+      //   has been built, thus mutating the message which is supposed to be
+      //   immutable.
+      "$deprecation$public java.util.List<$type$> "
+      "${$get$capitalized_name$List$}$() {\n"
+      "  return new com.google.protobuf.Internal.ListAdapter<\n"
+      "      java.lang.Integer, $type$>($name$_, $name$_converter_);\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return $name$_converter_.convert($name$_.get(index));\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    int index, $type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.set(index, value.getNumber());\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return $name$_converter_.convert($name$_.get(index));\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$add$capitalized_name$$}$($type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.add(value.getNumber());\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    int index, $type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.set(index, value.getNumber());\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
+                 "    java.lang.Iterable<? extends $type$> values) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  for ($type$ value : values) {\n"
+                 "    $name$_.add(value.getNumber());\n"
+                 "  }\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.add(value.getNumber());\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
-    "    java.lang.Iterable<? extends $type$> values) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  for ($type$ value : values) {\n"
-    "    $name$_.add(value.getNumber());\n"
-    "  }\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  $name$_ = java.util.Collections.emptyList();\n"
-    "  $clear_mutable_bit_builder$;\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  $name$_ = java.util.Collections.emptyList();\n"
+      "  $clear_mutable_bit_builder$;\n"
+      "  $on_changed$\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public java.util.List<java.lang.Integer>\n"
-      "${$get$capitalized_name$ValueList$}$() {\n"
-      "  return java.util.Collections.unmodifiableList($name$_);\n"
-      "}\n");
+                   "$deprecation$public java.util.List<java.lang.Integer>\n"
+                   "${$get$capitalized_name$ValueList$}$() {\n"
+                   "  return java.util.Collections.unmodifiableList($name$_);\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public int ${$get$capitalized_name$Value$}$(int index) {\n"
-      "  return $name$_.get(index);\n"
-      "}\n");
+                   "$deprecation$public int "
+                   "${$get$capitalized_name$Value$}$(int index) {\n"
+                   "  return $name$_.get(index);\n"
+                   "}\n");
+    printer->Annotate("{", "}", descriptor_);
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(
+        variables_,
+        "$deprecation$public Builder ${$set$capitalized_name$Value$}$(\n"
+        "    int index, int value) {\n"
+        "  ensure$capitalized_name$IsMutable();\n"
+        "  $name$_.set(index, value);\n"
+        "  $on_changed$\n"
+        "  return this;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public Builder ${$set$capitalized_name$Value$}$(\n"
-      "    int index, int value) {\n"
-      "  ensure$capitalized_name$IsMutable();\n"
-      "  $name$_.set(index, value);\n"
-      "  $on_changed$\n"
-      "  return this;\n"
-      "}\n");
+                   "$deprecation$public Builder "
+                   "${$add$capitalized_name$Value$}$(int value) {\n"
+                   "  ensure$capitalized_name$IsMutable();\n"
+                   "  $name$_.add(value);\n"
+                   "  $on_changed$\n"
+                   "  return this;\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public Builder "
-      "${$add$capitalized_name$Value$}$(int value) {\n"
-      "  ensure$capitalized_name$IsMutable();\n"
-      "  $name$_.add(value);\n"
-      "  $on_changed$\n"
-      "  return this;\n"
-      "}\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public Builder ${$addAll$capitalized_name$Value$}$(\n"
-      "    java.lang.Iterable<java.lang.Integer> values) {\n"
-      "  ensure$capitalized_name$IsMutable();\n"
-      "  for (int value : values) {\n"
-      "    $name$_.add(value);\n"
-      "  }\n"
-      "  $on_changed$\n"
-      "  return this;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public Builder ${$addAll$capitalized_name$Value$}$(\n"
+        "    java.lang.Iterable<java.lang.Integer> values) {\n"
+        "  ensure$capitalized_name$IsMutable();\n"
+        "  for (int value : values) {\n"
+        "    $name$_.add(value);\n"
+        "  }\n"
+        "  $on_changed$\n"
+        "  return this;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 }
 
 void RepeatedImmutableEnumFieldGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+    GenerateFieldBuilderInitializationCode(io::Printer* printer) const {
   // noop for enums
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n");
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateBuilderClearCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$name$_ = java.util.Collections.emptyList();\n"
-    "$clear_mutable_bit_builder$;\n");
+                 "$name$_ = java.util.Collections.emptyList();\n"
+                 "$clear_mutable_bit_builder$;\n");
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   // The code below does two optimizations:
   //   1. If the other list is empty, there's nothing to do. This ensures we
   //      don't allocate a new array if we already have an immutable one.
   //   2. If the other list is non-empty and our current list is empty, we can
   //      reuse the other list which is guaranteed to be immutable.
   printer->Print(variables_,
-    "if (!other.$name$_.isEmpty()) {\n"
-    "  if ($name$_.isEmpty()) {\n"
-    "    $name$_ = other.$name$_;\n"
-    "    $clear_mutable_bit_builder$;\n"
-    "  } else {\n"
-    "    ensure$capitalized_name$IsMutable();\n"
-    "    $name$_.addAll(other.$name$_);\n"
-    "  }\n"
-    "  $on_changed$\n"
-    "}\n");
+                 "if (!other.$name$_.isEmpty()) {\n"
+                 "  if ($name$_.isEmpty()) {\n"
+                 "    $name$_ = other.$name$_;\n"
+                 "    $clear_mutable_bit_builder$;\n"
+                 "  } else {\n"
+                 "    ensure$capitalized_name$IsMutable();\n"
+                 "    $name$_.addAll(other.$name$_);\n"
+                 "  }\n"
+                 "  $on_changed$\n"
+                 "}\n");
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   // The code below ensures that the result has an immutable list. If our
   // list is immutable, we can just reuse it. If not, we make it immutable.
-  printer->Print(variables_,
-    "if ($get_mutable_bit_builder$) {\n"
-    "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
-    "  $clear_mutable_bit_builder$;\n"
-    "}\n"
-    "result.$name$_ = $name$_;\n");
+  printer->Print(
+      variables_,
+      "if ($get_mutable_bit_builder$) {\n"
+      "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
+      "  $clear_mutable_bit_builder$;\n"
+      "}\n"
+      "result.$name$_ = $name$_;\n");
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   // Read and store the enum
   if (SupportUnknownEnumValue(descriptor_->file())) {
     printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "if (!$get_mutable_bit_parser$) {\n"
-      "  $name$_ = new java.util.ArrayList<java.lang.Integer>();\n"
-      "  $set_mutable_bit_parser$;\n"
-      "}\n"
-      "$name$_.add(rawValue);\n");
+                   "int rawValue = input.readEnum();\n"
+                   "if (!$get_mutable_bit_parser$) {\n"
+                   "  $name$_ = new java.util.ArrayList<java.lang.Integer>();\n"
+                   "  $set_mutable_bit_parser$;\n"
+                   "}\n"
+                   "$name$_.add(rawValue);\n");
   } else {
-    printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "@SuppressWarnings(\"deprecation\")\n"
-      "$type$ value = $type$.$for_number$(rawValue);\n"
-      "if (value == null) {\n"
-      "  unknownFields.mergeVarintField($number$, rawValue);\n"
-      "} else {\n"
-      "  if (!$get_mutable_bit_parser$) {\n"
-      "    $name$_ = new java.util.ArrayList<java.lang.Integer>();\n"
-      "    $set_mutable_bit_parser$;\n"
-      "  }\n"
-      "  $name$_.add(rawValue);\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "int rawValue = input.readEnum();\n"
+        "@SuppressWarnings(\"deprecation\")\n"
+        "$type$ value = $type$.$for_number$(rawValue);\n"
+        "if (value == null) {\n"
+        "  unknownFields.mergeVarintField($number$, rawValue);\n"
+        "} else {\n"
+        "  if (!$get_mutable_bit_parser$) {\n"
+        "    $name$_ = new java.util.ArrayList<java.lang.Integer>();\n"
+        "    $set_mutable_bit_parser$;\n"
+        "  }\n"
+        "  $name$_.add(rawValue);\n"
+        "}\n");
   }
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateParsingCodeFromPacked(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateParsingCodeFromPacked(
+    io::Printer* printer) const {
   // Wrap GenerateParsingCode's contents with a while loop.
 
   printer->Print(variables_,
-    "int length = input.readRawVarint32();\n"
-    "int oldLimit = input.pushLimit(length);\n"
-    "while(input.getBytesUntilLimit() > 0) {\n");
+                 "int length = input.readRawVarint32();\n"
+                 "int oldLimit = input.pushLimit(length);\n"
+                 "while(input.getBytesUntilLimit() > 0) {\n");
   printer->Indent();
 
   GenerateParsingCode(printer);
 
   printer->Outdent();
   printer->Print(variables_,
-    "}\n"
-    "input.popLimit(oldLimit);\n");
+                 "}\n"
+                 "input.popLimit(oldLimit);\n");
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($get_mutable_bit_parser$) {\n"
-    "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
-    "}\n");
+void RepeatedImmutableEnumFieldGenerator::GenerateParsingDoneCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if ($get_mutable_bit_parser$) {\n"
+      "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
+      "}\n");
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
   if (descriptor_->is_packed()) {
     printer->Print(variables_,
-      "if (get$capitalized_name$List().size() > 0) {\n"
-      "  output.writeUInt32NoTag($tag$);\n"
-      "  output.writeUInt32NoTag($name$MemoizedSerializedSize);\n"
-      "}\n"
-      "for (int i = 0; i < $name$_.size(); i++) {\n"
-      "  output.writeEnumNoTag($name$_.get(i));\n"
-      "}\n");
+                   "if (get$capitalized_name$List().size() > 0) {\n"
+                   "  output.writeUInt32NoTag($tag$);\n"
+                   "  output.writeUInt32NoTag($name$MemoizedSerializedSize);\n"
+                   "}\n"
+                   "for (int i = 0; i < $name$_.size(); i++) {\n"
+                   "  output.writeEnumNoTag($name$_.get(i));\n"
+                   "}\n");
   } else {
     printer->Print(variables_,
-      "for (int i = 0; i < $name$_.size(); i++) {\n"
-      "  output.writeEnum($number$, $name$_.get(i));\n"
-      "}\n");
+                   "for (int i = 0; i < $name$_.size(); i++) {\n"
+                   "  output.writeEnum($number$, $name$_.get(i));\n"
+                   "}\n");
   }
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "{\n"
-    "  int dataSize = 0;\n");
+                 "{\n"
+                 "  int dataSize = 0;\n");
   printer->Indent();
 
   printer->Print(variables_,
-    "for (int i = 0; i < $name$_.size(); i++) {\n"
-    "  dataSize += com.google.protobuf.CodedOutputStream\n"
-    "    .computeEnumSizeNoTag($name$_.get(i));\n"
-    "}\n");
-  printer->Print(
-    "size += dataSize;\n");
+                 "for (int i = 0; i < $name$_.size(); i++) {\n"
+                 "  dataSize += com.google.protobuf.CodedOutputStream\n"
+                 "    .computeEnumSizeNoTag($name$_.get(i));\n"
+                 "}\n");
+  printer->Print("size += dataSize;\n");
   if (descriptor_->is_packed()) {
     printer->Print(variables_,
-      "if (!get$capitalized_name$List().isEmpty()) {"
-      "  size += $tag_size$;\n"
-      "  size += com.google.protobuf.CodedOutputStream\n"
-      "    .computeUInt32SizeNoTag(dataSize);\n"
-      "}");
+                   "if (!get$capitalized_name$List().isEmpty()) {"
+                   "  size += $tag_size$;\n"
+                   "  size += com.google.protobuf.CodedOutputStream\n"
+                   "    .computeUInt32SizeNoTag(dataSize);\n"
+                   "}");
   } else {
-    printer->Print(variables_,
-      "size += $tag_size$ * $name$_.size();\n");
+    printer->Print(variables_, "size += $tag_size$ * $name$_.size();\n");
   }
 
   // cache the data size for packed fields.
   if (descriptor_->is_packed()) {
-    printer->Print(variables_,
-      "$name$MemoizedSerializedSize = dataSize;\n");
+    printer->Print(variables_, "$name$MemoizedSerializedSize = dataSize;\n");
   }
 
   printer->Outdent();
   printer->Print("}\n");
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateEqualsCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if (!$name$_.equals(other.$name$_)) return false;\n");
+                 "if (!$name$_.equals(other.$name$_)) return false;\n");
 }
 
-void RepeatedImmutableEnumFieldGenerator::
-GenerateHashCode(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldGenerator::GenerateHashCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if (get$capitalized_name$Count() > 0) {\n"
-    "  hash = (37 * hash) + $constant_name$;\n"
-    "  hash = (53 * hash) + $name$_.hashCode();\n"
-    "}\n");
+                 "if (get$capitalized_name$Count() > 0) {\n"
+                 "  hash = (37 * hash) + $constant_name$;\n"
+                 "  hash = (53 * hash) + $name$_.hashCode();\n"
+                 "}\n");
 }
 
 std::string RepeatedImmutableEnumFieldGenerator::GetBoxedType() const {
diff --git a/src/google/protobuf/compiler/java/java_enum_field_lite.cc b/src/google/protobuf/compiler/java/java_enum_field_lite.cc
index 7259975..e0171ab 100644
--- a/src/google/protobuf/compiler/java/java_enum_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_enum_field_lite.cc
@@ -80,8 +80,8 @@
       internal::WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
-  (*variables)["deprecation"] = descriptor->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  (*variables)["deprecation"] =
+      descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
   (*variables)["required"] = descriptor->is_required() ? "true" : "false";
 
   if (SupportFieldPresence(descriptor->file())) {
@@ -100,8 +100,8 @@
     (*variables)["clear_has_field_bit_message"] = "";
 
     (*variables)["is_field_present_message"] =
-        (*variables)["name"] + "_ != " +
-        (*variables)["default"] + ".getNumber()";
+        (*variables)["name"] + "_ != " + (*variables)["default"] +
+        ".getNumber()";
   }
 
   // For repeated builders, the underlying list tracks mutability state.
@@ -123,12 +123,12 @@
 
 // ===================================================================
 
-ImmutableEnumFieldLiteGenerator::
-ImmutableEnumFieldLiteGenerator(const FieldDescriptor* descriptor,
-                            int messageBitIndex,
-                            Context* context)
-  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
-    context_(context), name_resolver_(context->GetNameResolver()) {
+ImmutableEnumFieldLiteGenerator::ImmutableEnumFieldLiteGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, Context* context)
+    : descriptor_(descriptor),
+      messageBitIndex_(messageBitIndex),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   SetEnumVariables(descriptor, messageBitIndex, 0,
                    context->GetFieldGeneratorInfo(descriptor), name_resolver_,
                    &variables_);
@@ -140,221 +140,197 @@
   return SupportFieldPresence(descriptor_->file()) ? 1 : 0;
 }
 
-void ImmutableEnumFieldLiteGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void ImmutableEnumFieldLiteGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$boolean has$capitalized_name$();\n");
+                   "$deprecation$boolean has$capitalized_name$();\n");
   }
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$int get$capitalized_name$Value();\n");
+                   "$deprecation$int get$capitalized_name$Value();\n");
   }
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$();\n");
+  printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n");
 }
 
-void ImmutableEnumFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private int $name$_;\n");
+void ImmutableEnumFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_, "private int $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
-      "  return $name$_;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+        "  return $name$_;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  $type$ result = $type$.forNumber($name$_);\n"
-    "  return result == null ? $unknown$ : result;\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  $type$ result = $type$.forNumber($name$_);\n"
+                 "  return result == null ? $unknown$ : result;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Generate private setters for the builder to proxy into.
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "private void set$capitalized_name$Value(int value) {\n"
-      "  $set_has_field_bit_message$"
-      "  $name$_ = value;\n"
-      "}\n");
+                   "private void set$capitalized_name$Value(int value) {\n"
+                   "  $set_has_field_bit_message$"
+                   "  $name$_ = value;\n"
+                   "}\n");
   }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  $set_has_field_bit_message$\n"
-    "  $name$_ = value.getNumber();\n"
-    "}\n");
+                 "private void set$capitalized_name$($type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  $set_has_field_bit_message$\n"
+                 "  $name$_ = value.getNumber();\n"
+                 "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void clear$capitalized_name$() {\n"
-    "  $clear_has_field_bit_message$\n"
-    "  $name$_ = $default_number$;\n"
-    "}\n");
+                 "private void clear$capitalized_name$() {\n"
+                 "  $clear_has_field_bit_message$\n"
+                 "  $name$_ = $default_number$;\n"
+                 "}\n");
 }
 
-void ImmutableEnumFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutableEnumFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return instance.has$capitalized_name$();\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return instance.has$capitalized_name$();\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
-      "  return instance.get$capitalized_name$Value();\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+        "  return instance.get$capitalized_name$Value();\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public Builder "
-      "${$set$capitalized_name$Value$}$(int value) {\n"
-      "  copyOnWrite();\n"
-      "  instance.set$capitalized_name$Value(value);\n"
-      "  return this;\n"
-      "}\n");
+                   "$deprecation$public Builder "
+                   "${$set$capitalized_name$Value$}$(int value) {\n"
+                   "  copyOnWrite();\n"
+                   "  instance.set$capitalized_name$Value(value);\n"
+                   "  return this;\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  return instance.get$capitalized_name$();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  return instance.get$capitalized_name$();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$set$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  copyOnWrite();\n"
+      "  instance.clear$capitalized_name$();\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableEnumFieldLiteGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
-  // noop for enums
-}
-
-void ImmutableEnumFieldLiteGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void ImmutableEnumFieldLiteGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   if (!IsDefaultValueJavaDefault(descriptor_)) {
     printer->Print(variables_, "$name$_ = $default_number$;\n");
   }
 }
 
-void ImmutableEnumFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
+void ImmutableEnumFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
-    printer->Print(variables_,
-      "$name$_ = visitor.visitInt(has$capitalized_name$(), $name$_,\n"
-      "    other.has$capitalized_name$(), other.$name$_);\n");
-  } else if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(variables_,
-      "$name$_ = visitor.visitInt($name$_ != $default_number$, $name$_,"
-      "    other.$name$_ != $default_number$, other.$name$_);\n");
+    if (descriptor_->is_required()) {
+      printer->Print(
+          variables_,
+          "fieldInfoForProto2Required(\n"
+          "    reflectField($classname$.class, \"$name$_\"),\n"
+          "    $number$,\n"
+          "    com.google.protobuf.FieldType.$annotation_field_type$,\n"
+          "    $bit_field_name$,\n"
+          "    $bit_field_mask$,\n"
+          "    false,\n"
+          "    $type$.internalGetValueMap())");
+    } else {
+      printer->Print(
+          variables_,
+          "fieldInfoForProto2Optional(\n"
+          "    reflectField($classname$.class, \"$name$_\"),\n"
+          "    $number$,\n"
+          "    com.google.protobuf.FieldType.$annotation_field_type$,\n"
+          "    $bit_field_name$,\n"
+          "    $bit_field_mask$,\n"
+          "    false,\n"
+          "    $type$.internalGetValueMap())");
+    }
   } else {
-    GOOGLE_LOG(FATAL) << "Can't reach here.";
+    printer->Print(
+        variables_,
+        "fieldInfoWithEnumMap(\n"
+        "    reflectField($classname$.class, \"$name$_\"),\n"
+        "    $number$,\n"
+        "    com.google.protobuf.FieldType.$annotation_field_type$,\n"
+        "    $type$.internalGetValueMap())");
   }
 }
-
-void ImmutableEnumFieldLiteGenerator::
-GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const {
-  // noop for scalars
-}
-
-void ImmutableEnumFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "$set_has_field_bit_message$\n"
-      "$name$_ = rawValue;\n");
-  } else {
-    printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "$type$ value = $type$.forNumber(rawValue);\n"
-      "if (value == null) {\n"
-      "  super.mergeVarintField($number$, rawValue);\n"
-      "} else {\n"
-      "  $set_has_field_bit_message$\n"
-      "  $name$_ = rawValue;\n"
-      "}\n");
+void ImmutableEnumFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
+  if (SupportFieldPresence(descriptor_->file())) {
+    WriteIntToUtf16CharSequence(messageBitIndex_, output);
   }
-}
-
-void ImmutableEnumFieldLiteGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  // noop for enums
-}
-
-
-void ImmutableEnumFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  output.writeEnum($number$, $name$_);\n"
-    "}\n");
-}
-
-void ImmutableEnumFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .computeEnumSize($number$, $name$_);\n"
-    "}\n");
-}
-
-void ImmutableEnumFieldLiteGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "result = result && $name$_ == other.$name$_;\n");
-}
-
-void ImmutableEnumFieldLiteGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "hash = (37 * hash) + $constant_name$;\n"
-    "hash = (53 * hash) + $name$_;\n");
+  printer->Print(variables_, "\"$name$_\",\n");
+  if (SupportFieldPresence(descriptor_->file())) {
+    PrintEnumVerifierLogic(printer, descriptor_, variables_,
+                           /*var_name=*/"$type$",
+                           /*terminating_string=*/",\n",
+                           /*enforce_lite=*/context_->EnforceLite());
+  }
 }
 
 std::string ImmutableEnumFieldLiteGenerator::GetBoxedType() const {
@@ -371,196 +347,154 @@
   SetCommonOneofVariables(descriptor, info, &variables_);
 }
 
-ImmutableEnumOneofFieldLiteGenerator::
-~ImmutableEnumOneofFieldLiteGenerator() {}
+ImmutableEnumOneofFieldLiteGenerator::~ImmutableEnumOneofFieldLiteGenerator() {}
 
-void ImmutableEnumOneofFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutableEnumOneofFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
   PrintExtraFieldInfo(variables_, printer);
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $has_oneof_case_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $has_oneof_case_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
-      "  if ($has_oneof_case_message$) {\n"
-      "    return (java.lang.Integer) $oneof_name$_;\n"
-      "  }\n"
-      "  return $default_number$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+        "  if ($has_oneof_case_message$) {\n"
+        "    return (java.lang.Integer) $oneof_name$_;\n"
+        "  }\n"
+        "  return $default_number$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    $type$ result = $type$.forNumber((java.lang.Integer) $oneof_name$_);\n"
-    "    return result == null ? $unknown$ : result;\n"
-    "  }\n"
-    "  return $default$;\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    $type$ result = $type$.forNumber((java.lang.Integer) "
+                 "$oneof_name$_);\n"
+                 "    return result == null ? $unknown$ : result;\n"
+                 "  }\n"
+                 "  return $default$;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Generate private setters for the builder to proxy into.
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "private void set$capitalized_name$Value(int value) {\n"
-      "  $set_oneof_case_message$;\n"
-      "  $oneof_name$_ = value;\n"
-      "}\n");
+                   "private void set$capitalized_name$Value(int value) {\n"
+                   "  $set_oneof_case_message$;\n"
+                   "  $oneof_name$_ = value;\n"
+                   "}\n");
   }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  $set_oneof_case_message$;\n"
-    "  $oneof_name$_ = value.getNumber();\n"
-    "}\n");
+                 "private void set$capitalized_name$($type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  $set_oneof_case_message$;\n"
+                 "  $oneof_name$_ = value.getNumber();\n"
+                 "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void clear$capitalized_name$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    $clear_oneof_case_message$;\n"
-    "    $oneof_name$_ = null;\n"
-    "  }\n"
-    "}\n");
+                 "private void clear$capitalized_name$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    $clear_oneof_case_message$;\n"
+                 "    $oneof_name$_ = null;\n"
+                 "  }\n"
+                 "}\n");
 }
 
+void ImmutableEnumOneofFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "fieldInfoForOneofEnum(\n"
+                 "    $number$,\n"
+                 "    $oneof_name$_,\n"
+                 "    $oneof_stored_type$.class,\n"
+                 "    $type$.internalGetValueMap())");
+}
+void ImmutableEnumOneofFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
+  WriteIntToUtf16CharSequence(descriptor_->containing_oneof()->index(), output);
+  if (SupportFieldPresence(descriptor_->file())) {
+    PrintEnumVerifierLogic(printer, descriptor_, variables_,
+                           /*var_name=*/"$type$",
+                           /*terminating_string=*/",\n",
+                           /*enforce_lite=*/context_->EnforceLite());
+  }
+}
 
-void ImmutableEnumOneofFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutableEnumOneofFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return instance.has$capitalized_name$();\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return instance.has$capitalized_name$();\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
-      "  return instance.get$capitalized_name$Value();\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public int ${$get$capitalized_name$Value$}$() {\n"
+        "  return instance.get$capitalized_name$Value();\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public Builder "
-      "${$set$capitalized_name$Value$}$(int value) {\n"
+                   "$deprecation$public Builder "
+                   "${$set$capitalized_name$Value$}$(int value) {\n"
+                   "  copyOnWrite();\n"
+                   "  instance.set$capitalized_name$Value(value);\n"
+                   "  return this;\n"
+                   "}\n");
+    printer->Annotate("{", "}", descriptor_);
+  }
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  return instance.get$capitalized_name$();\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder "
+                 "${$set$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
       "  copyOnWrite();\n"
-      "  instance.set$capitalized_name$Value(value);\n"
+      "  instance.clear$capitalized_name$();\n"
       "  return this;\n"
       "}\n");
-    printer->Annotate("{", "}", descriptor_);
-  }
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  return instance.get$capitalized_name$();\n"
-    "}\n");
   printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-}
-
-void ImmutableEnumOneofFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$oneof_name$_ = visitor.visitOneofInt(\n"
-    "   $has_oneof_case_message$, $oneof_name$_, other.$oneof_name$_);\n");
-}
-
-void ImmutableEnumOneofFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "$set_oneof_case_message$;\n"
-      "$oneof_name$_ = rawValue;\n");
-  } else {
-    printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "$type$ value = $type$.forNumber(rawValue);\n"
-      "if (value == null) {\n"
-      "  super.mergeVarintField($number$, rawValue);\n"
-      "} else {\n"
-      "  $set_oneof_case_message$;\n"
-      "  $oneof_name$_ = rawValue;\n"
-      "}\n");
-  }
-}
-
-void ImmutableEnumOneofFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  output.writeEnum($number$, ((java.lang.Integer) $oneof_name$_));\n"
-    "}\n");
-}
-
-void ImmutableEnumOneofFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .computeEnumSize($number$, ((java.lang.Integer) $oneof_name$_));\n"
-    "}\n");
-}
-
-void ImmutableEnumOneofFieldLiteGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(variables_,
-      "result = result && get$capitalized_name$Value()\n"
-      "    == other.get$capitalized_name$Value();\n");
-  } else {
-    printer->Print(variables_,
-      "result = result && get$capitalized_name$()\n"
-      "    .equals(other.get$capitalized_name$());\n");
-  }
-}
-
-void ImmutableEnumOneofFieldLiteGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(variables_,
-      "hash = (37 * hash) + $constant_name$;\n"
-      "hash = (53 * hash) + get$capitalized_name$Value();\n");
-  } else {
-    printer->Print(variables_,
-      "hash = (37 * hash) + $constant_name$;\n"
-      "hash = (53 * hash) + get$capitalized_name$().getNumber();\n");
-  }
 }
 
 // ===================================================================
@@ -579,433 +513,309 @@
 }
 
 RepeatedImmutableEnumFieldLiteGenerator::
-~RepeatedImmutableEnumFieldLiteGenerator() {}
+    ~RepeatedImmutableEnumFieldLiteGenerator() {}
 
 int RepeatedImmutableEnumFieldLiteGenerator::GetNumBitsForMessage() const {
   return 0;
 }
 
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldLiteGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$java.util.List<$type$> get$capitalized_name$List();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.util.List<$type$> get$capitalized_name$List();\n");
+                 "$deprecation$int get$capitalized_name$Count();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$int get$capitalized_name$Count();\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$(int index);\n");
+                 "$deprecation$$type$ get$capitalized_name$(int index);\n");
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$java.util.List<java.lang.Integer>\n"
-      "get$capitalized_name$ValueList();\n");
+                   "$deprecation$java.util.List<java.lang.Integer>\n"
+                   "get$capitalized_name$ValueList();\n");
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$int get$capitalized_name$Value(int index);\n");
+                   "$deprecation$int get$capitalized_name$Value(int index);\n");
   }
 }
 
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private com.google.protobuf.Internal.IntList $name$_;\n"
-    "private static final com.google.protobuf.Internal.ListAdapter.Converter<\n"
-    "    java.lang.Integer, $type$> $name$_converter_ =\n"
-    "        new com.google.protobuf.Internal.ListAdapter.Converter<\n"
-    "            java.lang.Integer, $type$>() {\n"
-    "          @java.lang.Override\n"
-    "          public $type$ convert(java.lang.Integer from) {\n"
-    "            $type$ result = $type$.forNumber(from);\n"
-    "            return result == null ? $unknown$ : result;\n"
-    "          }\n"
-    "        };\n");
+void RepeatedImmutableEnumFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "private com.google.protobuf.Internal.IntList $name$_;\n"
+      "private static final "
+      "com.google.protobuf.Internal.ListAdapter.Converter<\n"
+      "    java.lang.Integer, $type$> $name$_converter_ =\n"
+      "        new com.google.protobuf.Internal.ListAdapter.Converter<\n"
+      "            java.lang.Integer, $type$>() {\n"
+      "          @java.lang.Override\n"
+      "          public $type$ convert(java.lang.Integer from) {\n"
+      "            $type$ result = $type$.forNumber(from);\n"
+      "            return result == null ? $unknown$ : result;\n"
+      "          }\n"
+      "        };\n");
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\n"
-    "  return new com.google.protobuf.Internal.ListAdapter<\n"
-    "      java.lang.Integer, $type$>($name$_, $name$_converter_);\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public java.util.List<$type$> "
+      "${$get$capitalized_name$List$}$() {\n"
+      "  return new com.google.protobuf.Internal.ListAdapter<\n"
+      "      java.lang.Integer, $type$>($name$_, $name$_converter_);\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return $name$_converter_.convert($name$_.getInt(index));\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return $name$_converter_.convert($name$_.getInt(index));\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public java.util.List<java.lang.Integer>\n"
-      "${$get$capitalized_name$ValueList$}$() {\n"
-      "  return $name$_;\n"
-      "}\n");
+                   "@java.lang.Override\n"
+                   "$deprecation$public java.util.List<java.lang.Integer>\n"
+                   "${$get$capitalized_name$ValueList$}$() {\n"
+                   "  return $name$_;\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public int ${$get$capitalized_name$Value$}$(int index) {\n"
-      "  return $name$_.getInt(index);\n"
-      "}\n");
+                   "@java.lang.Override\n"
+                   "$deprecation$public int "
+                   "${$get$capitalized_name$Value$}$(int index) {\n"
+                   "  return $name$_.getInt(index);\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   if (!EnableExperimentalRuntimeForLite() && descriptor_->is_packed() &&
       context_->HasGeneratedMethods(descriptor_->containing_type())) {
-    printer->Print(variables_,
-      "private int $name$MemoizedSerializedSize;\n");
+    printer->Print(variables_, "private int $name$MemoizedSerializedSize;\n");
   }
 
   // Generate private setters for the builder to proxy into.
-  printer->Print(variables_,
-    "private void ensure$capitalized_name$IsMutable() {\n"
-    "  if (!$is_mutable$) {\n"
-    "    $name$_ =\n"
-    "        com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
-    "  }\n"
-    "}\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void set$capitalized_name$(\n"
-    "    int index, $type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.setInt(index, value.getNumber());\n"
-    "}\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void add$capitalized_name$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.addInt(value.getNumber());\n"
-    "}\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void addAll$capitalized_name$(\n"
-    "    java.lang.Iterable<? extends $type$> values) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  for ($type$ value : values) {\n"
-    "    $name$_.addInt(value.getNumber());\n"
-    "  }\n"
-    "}\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void clear$capitalized_name$() {\n"
-    "  $name$_ = emptyIntList();\n"
-    "}\n");
-
-  if (SupportUnknownEnumValue(descriptor_->file())) {
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "private void set$capitalized_name$Value(\n"
-      "    int index, int value) {\n"
-      "  ensure$capitalized_name$IsMutable();\n"
-      "  $name$_.setInt(index, value);\n"
-      "}\n");
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "private void add$capitalized_name$Value(int value) {\n"
-      "  ensure$capitalized_name$IsMutable();\n"
-      "  $name$_.addInt(value);\n"
-      "}\n");
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "private void addAll$capitalized_name$Value(\n"
-      "    java.lang.Iterable<java.lang.Integer> values) {\n"
-      "  ensure$capitalized_name$IsMutable();\n"
-      "  for (int value : values) {\n"
-      "    $name$_.addInt(value);\n"
+  printer->Print(
+      variables_,
+      "private void ensure$capitalized_name$IsMutable() {\n"
+      "  if (!$is_mutable$) {\n"
+      "    $name$_ =\n"
+      "        com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
       "  }\n"
       "}\n");
-  }
-}
-
-
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\n"
-    "  return instance.get$capitalized_name$List();\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
+                 "private void set$capitalized_name$(\n"
+                 "    int index, $type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.setInt(index, value.getNumber());\n"
+                 "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return instance.get$capitalized_name$Count();\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
+                 "private void add$capitalized_name$($type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.addInt(value.getNumber());\n"
+                 "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return instance.get$capitalized_name$(index);\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
+                 "private void addAll$capitalized_name$(\n"
+                 "    java.lang.Iterable<? extends $type$> values) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  for ($type$ value : values) {\n"
+                 "    $name$_.addInt(value.getNumber());\n"
+                 "  }\n"
+                 "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    int index, $type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(index, value);\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.add$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
-    "    java.lang.Iterable<? extends $type$> values) {\n"
-    "  copyOnWrite();\n"
-    "  instance.addAll$capitalized_name$(values);"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
+                 "private void clear$capitalized_name$() {\n"
+                 "  $name$_ = emptyIntList();\n"
+                 "}\n");
 
   if (SupportUnknownEnumValue(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public java.util.List<java.lang.Integer>\n"
-      "${$get$capitalized_name$ValueList$}$() {\n"
-      "  return java.util.Collections.unmodifiableList(\n"
-      "      instance.get$capitalized_name$ValueList());\n"
-      "}\n");
-    printer->Annotate("{", "}", descriptor_);
+                   "private void set$capitalized_name$Value(\n"
+                   "    int index, int value) {\n"
+                   "  ensure$capitalized_name$IsMutable();\n"
+                   "  $name$_.setInt(index, value);\n"
+                   "}\n");
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public int ${$get$capitalized_name$Value$}$(int index) {\n"
-      "  return instance.get$capitalized_name$Value(index);\n"
-      "}\n");
-    printer->Annotate("{", "}", descriptor_);
+                   "private void add$capitalized_name$Value(int value) {\n"
+                   "  ensure$capitalized_name$IsMutable();\n"
+                   "  $name$_.addInt(value);\n"
+                   "}\n");
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public Builder ${$set$capitalized_name$Value$}$(\n"
-      "    int index, int value) {\n"
-      "  copyOnWrite();\n"
-      "  instance.set$capitalized_name$Value(index, value);\n"
-      "  return this;\n"
-      "}\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public Builder "
-      "${$add$capitalized_name$Value$}$(int value) {\n"
-      "  instance.add$capitalized_name$Value(value);\n"
-      "  return this;\n"
-      "}\n");
-    printer->Annotate("{", "}", descriptor_);
-    WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public Builder ${$addAll$capitalized_name$Value$}$(\n"
-      "    java.lang.Iterable<java.lang.Integer> values) {\n"
-      "  copyOnWrite();\n"
-      "  instance.addAll$capitalized_name$Value(values);\n"
-      "  return this;\n"
-      "}\n");
-    printer->Annotate("{", "}", descriptor_);
+                   "private void addAll$capitalized_name$Value(\n"
+                   "    java.lang.Iterable<java.lang.Integer> values) {\n"
+                   "  ensure$capitalized_name$IsMutable();\n"
+                   "  for (int value : values) {\n"
+                   "    $name$_.addInt(value);\n"
+                   "  }\n"
+                   "}\n");
   }
 }
 
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
-  // noop for enums
-}
-
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_ = emptyIntList();\n");
-}
-
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$name$_= visitor.visitIntList($name$_, other.$name$_);\n");
+                 "fieldInfoWithEnumMap(\n"
+                 "    reflectField($classname$.class, \"$name$_\"),\n"
+                 "    $number$,\n"
+                 "    com.google.protobuf.FieldType.$annotation_field_type$,\n"
+                 "    $type$.internalGetValueMap())");
 }
-
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$name$_.makeImmutable();\n");
-}
-
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  // Read and store the enum
-  printer->Print(variables_,
-    "if (!$is_mutable$) {\n"
-    "  $name$_ =\n"
-    "      com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
-    "}\n");
-
-  if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(variables_,
-      "$name$_.addInt(input.readEnum());\n");
-  } else {
-    printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "$type$ value = $type$.forNumber(rawValue);\n"
-      "if (value == null) {\n"
-      // We store the unknown value in unknown fields.
-      "  super.mergeVarintField($number$, rawValue);\n"
-      "} else {\n"
-      "  $name$_.addInt(rawValue);\n"
-      "}\n");
+void RepeatedImmutableEnumFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
+  printer->Print(variables_, "\"$name$_\",\n");
+  if (SupportFieldPresence(descriptor_->file())) {
+    PrintEnumVerifierLogic(printer, descriptor_, variables_,
+                           /*var_name=*/"$type$",
+                           /*terminating_string=*/",\n",
+                           /*enforce_lite=*/context_->EnforceLite());
   }
 }
 
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateParsingCodeFromPacked(io::Printer* printer) const {
+void RepeatedImmutableEnumFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
+  WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "if (!$is_mutable$) {\n"
-    "  $name$_ =\n"
-    "      com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
-    "}\n");
-
-  printer->Print(variables_,
-    "int length = input.readRawVarint32();\n"
-    "int oldLimit = input.pushLimit(length);\n"
-    "while(input.getBytesUntilLimit() > 0) {\n");
-  printer->Indent();
-
-  // Read and store the enum
-  if (SupportUnknownEnumValue(descriptor_->file())) {
-    printer->Print(variables_,
-      "$name$_.addInt(input.readEnum());\n");
-  } else {
-    printer->Print(variables_,
-      "int rawValue = input.readEnum();\n"
-      "$type$ value = $type$.forNumber(rawValue);\n"
-      "if (value == null) {\n"
-      // We store the unknown value in unknown fields.
-      "  super.mergeVarintField($number$, rawValue);\n"
-      "} else {\n"
-      "  $name$_.addInt(rawValue);\n"
-      "}\n");
-  }
-
-  printer->Outdent();
-  printer->Print(variables_,
-    "}\n"
-    "input.popLimit(oldLimit);\n");
-}
-
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_mutable$) {\n"
-    "  $name$_.makeImmutable();\n"
-    "}\n");
-}
-
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  GOOGLE_CHECK(!EnableExperimentalRuntimeForLite());
-
-  if (descriptor_->is_packed()) {
-    printer->Print(variables_,
-      "if (get$capitalized_name$List().size() > 0) {\n"
-      "  output.writeUInt32NoTag($tag$);\n"
-      "  output.writeUInt32NoTag($name$MemoizedSerializedSize);\n"
-      "}\n"
-      "for (int i = 0; i < $name$_.size(); i++) {\n"
-      "  output.writeEnumNoTag($name$_.getInt(i));\n"
-      "}\n");
-  } else {
-    printer->Print(variables_,
-      "for (int i = 0; i < $name$_.size(); i++) {\n"
-      "  output.writeEnum($number$, $name$_.getInt(i));\n"
-      "}\n");
-  }
-}
-
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  GOOGLE_CHECK(!EnableExperimentalRuntimeForLite());
-
-  printer->Print(variables_,
-    "{\n"
-    "  int dataSize = 0;\n");
-  printer->Indent();
-
-  printer->Print(variables_,
-    "for (int i = 0; i < $name$_.size(); i++) {\n"
-    "  dataSize += com.google.protobuf.CodedOutputStream\n"
-    "    .computeEnumSizeNoTag($name$_.getInt(i));\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public java.util.List<$type$> "
+                 "${$get$capitalized_name$List$}$() {\n"
+                 "  return instance.get$capitalized_name$List();\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
   printer->Print(
-    "size += dataSize;\n");
-  if (descriptor_->is_packed()) {
-    printer->Print(variables_,
-      "if (!get$capitalized_name$List().isEmpty()) {"
-      "  size += $tag_size$;\n"
-      "  size += com.google.protobuf.CodedOutputStream\n"
-      "    .computeUInt32SizeNoTag(dataSize);\n"
-      "}");
-  } else {
-    printer->Print(variables_,
-      "size += $tag_size$ * $name$_.size();\n");
-  }
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return instance.get$capitalized_name$Count();\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return instance.get$capitalized_name$(index);\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    int index, $type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(index, value);\n"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder "
+                 "${$add$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.add$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
+                 "    java.lang.Iterable<? extends $type$> values) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.addAll$capitalized_name$(values);"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  copyOnWrite();\n"
+      "  instance.clear$capitalized_name$();\n"
+      "  return this;\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
 
-  // cache the data size for packed fields.
-  if (descriptor_->is_packed()) {
+  if (SupportUnknownEnumValue(descriptor_->file())) {
+    WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$name$MemoizedSerializedSize = dataSize;\n");
+                   "@java.lang.Override\n"
+                   "$deprecation$public java.util.List<java.lang.Integer>\n"
+                   "${$get$capitalized_name$ValueList$}$() {\n"
+                   "  return java.util.Collections.unmodifiableList(\n"
+                   "      instance.get$capitalized_name$ValueList());\n"
+                   "}\n");
+    printer->Annotate("{", "}", descriptor_);
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(variables_,
+                   "@java.lang.Override\n"
+                   "$deprecation$public int "
+                   "${$get$capitalized_name$Value$}$(int index) {\n"
+                   "  return instance.get$capitalized_name$Value(index);\n"
+                   "}\n");
+    printer->Annotate("{", "}", descriptor_);
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(
+        variables_,
+        "$deprecation$public Builder ${$set$capitalized_name$Value$}$(\n"
+        "    int index, int value) {\n"
+        "  copyOnWrite();\n"
+        "  instance.set$capitalized_name$Value(index, value);\n"
+        "  return this;\n"
+        "}\n");
+    printer->Annotate("{", "}", descriptor_);
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(variables_,
+                   "$deprecation$public Builder "
+                   "${$add$capitalized_name$Value$}$(int value) {\n"
+                   "  instance.add$capitalized_name$Value(value);\n"
+                   "  return this;\n"
+                   "}\n");
+    printer->Annotate("{", "}", descriptor_);
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(
+        variables_,
+        "$deprecation$public Builder ${$addAll$capitalized_name$Value$}$(\n"
+        "    java.lang.Iterable<java.lang.Integer> values) {\n"
+        "  copyOnWrite();\n"
+        "  instance.addAll$capitalized_name$Value(values);\n"
+        "  return this;\n"
+        "}\n");
+    printer->Annotate("{", "}", descriptor_);
   }
-
-  printer->Outdent();
-  printer->Print("}\n");
 }
 
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "result = result && $name$_.equals(other.$name$_);\n");
-}
-
-void RepeatedImmutableEnumFieldLiteGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (get$capitalized_name$Count() > 0) {\n"
-    "  hash = (37 * hash) + $constant_name$;\n"
-    "  hash = (53 * hash) + $name$_.hashCode();\n"
-    "}\n");
+void RepeatedImmutableEnumFieldLiteGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
+  printer->Print(variables_, "$name$_ = emptyIntList();\n");
 }
 
 std::string RepeatedImmutableEnumFieldLiteGenerator::GetBoxedType() const {
diff --git a/src/google/protobuf/compiler/java/java_enum_field_lite.h b/src/google/protobuf/compiler/java/java_enum_field_lite.h
index bf25ffa..a895587 100644
--- a/src/google/protobuf/compiler/java/java_enum_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_enum_field_lite.h
@@ -69,15 +69,9 @@
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
   void GenerateInitializationCode(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateParsingDoneCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;
-  void GenerateEqualsCode(io::Printer* printer) const;
-  void GenerateHashCode(io::Printer* printer) const;
+  void GenerateFieldInfo(io::Printer* printer) const;
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
   std::string GetBoxedType() const;
 
@@ -101,12 +95,9 @@
 
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-  void GenerateEqualsCode(io::Printer* printer) const;
-  void GenerateHashCode(io::Printer* printer) const;
+  void GenerateFieldInfo(io::Printer* printer) const;
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableEnumOneofFieldLiteGenerator);
@@ -125,16 +116,9 @@
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
   void GenerateInitializationCode(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateParsingCodeFromPacked(io::Printer* printer) const;
-  void GenerateParsingDoneCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;
-  void GenerateEqualsCode(io::Printer* printer) const;
-  void GenerateHashCode(io::Printer* printer) const;
+  void GenerateFieldInfo(io::Printer* printer) const;
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
   std::string GetBoxedType() const;
 
diff --git a/src/google/protobuf/compiler/java/java_enum_lite.cc b/src/google/protobuf/compiler/java/java_enum_lite.cc
index 8e41429..c4d6f8a 100644
--- a/src/google/protobuf/compiler/java/java_enum_lite.cc
+++ b/src/google/protobuf/compiler/java/java_enum_lite.cc
@@ -60,7 +60,7 @@
   for (int i = 0; i < descriptor_->value_count(); i++) {
     const EnumValueDescriptor* value = descriptor_->value(i);
     const EnumValueDescriptor* canonical_value =
-      descriptor_->FindValueByNumber(value->number());
+        descriptor_->FindValueByNumber(value->number());
 
     if (value == canonical_value) {
       canonical_values_.push_back(value);
@@ -93,8 +93,7 @@
     if (canonical_values_[i]->options().deprecated()) {
       printer->Print("@java.lang.Deprecated\n");
     }
-    printer->Print(vars,
-      "$name$($number$),\n");
+    printer->Print(vars, "$name$($number$),\n");
     printer->Annotate("name", canonical_values_[i]);
   }
 
@@ -104,8 +103,8 @@
   }
 
   printer->Print(
-    ";\n"
-    "\n");
+      ";\n"
+      "\n");
 
   // -----------------------------------------------------------------
 
@@ -115,8 +114,8 @@
     vars["name"] = aliases_[i].value->name();
     vars["canonical_name"] = aliases_[i].canonical_value->name();
     WriteEnumValueDocComment(printer, aliases_[i].value);
-    printer->Print(vars,
-      "public static final $classname$ $name$ = $canonical_name$;\n");
+    printer->Print(
+        vars, "public static final $classname$ $name$ = $canonical_name$;\n");
     printer->Annotate("name", aliases_[i].value);
   }
 
@@ -128,7 +127,7 @@
     vars["}"] = "";
     WriteEnumValueDocComment(printer, descriptor_->value(i));
     printer->Print(vars,
-      "public static final int ${$$name$_VALUE$}$ = $number$;\n");
+                   "public static final int ${$$name$_VALUE$}$ = $number$;\n");
     printer->Annotate("{", "}", descriptor_->value(i));
   }
   printer->Print("\n");
@@ -208,17 +207,17 @@
       "classname", descriptor_->name());
 
   printer->Print(
-    "private final int value;\n\n"
-    "private $classname$(int value) {\n",
-    "classname", descriptor_->name());
+      "private final int value;\n\n"
+      "private $classname$(int value) {\n",
+      "classname", descriptor_->name());
   printer->Print(
-    "  this.value = value;\n"
-    "}\n");
+      "  this.value = value;\n"
+      "}\n");
 
   printer->Print(
-    "\n"
-    "// @@protoc_insertion_point(enum_scope:$full_name$)\n",
-    "full_name", descriptor_->full_name());
+      "\n"
+      "// @@protoc_insertion_point(enum_scope:$full_name$)\n",
+      "full_name", descriptor_->full_name());
 
   printer->Outdent();
   printer->Print("}\n\n");
diff --git a/src/google/protobuf/compiler/java/java_enum_lite.h b/src/google/protobuf/compiler/java/java_enum_lite.h
index 9e20e6f..996d44e 100644
--- a/src/google/protobuf/compiler/java/java_enum_lite.h
+++ b/src/google/protobuf/compiler/java/java_enum_lite.h
@@ -42,13 +42,13 @@
 namespace google {
 namespace protobuf {
 namespace compiler {
-  namespace java {
-    class Context;           // context.h
-    class ClassNameResolver; // name_resolver.h
-  }
-}
+namespace java {
+class Context;            // context.h
+class ClassNameResolver;  // name_resolver.h
+}  // namespace java
+}  // namespace compiler
 namespace io {
-  class Printer;             // printer.h
+class Printer;  // printer.h
 }
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/compiler/java/java_extension.cc b/src/google/protobuf/compiler/java/java_extension.cc
index 5b744aa..f197d41 100644
--- a/src/google/protobuf/compiler/java/java_extension.cc
+++ b/src/google/protobuf/compiler/java/java_extension.cc
@@ -49,11 +49,12 @@
 
 ImmutableExtensionGenerator::ImmutableExtensionGenerator(
     const FieldDescriptor* descriptor, Context* context)
-  : descriptor_(descriptor), context_(context),
-    name_resolver_(context->GetNameResolver()) {
+    : descriptor_(descriptor),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   if (descriptor_->extension_scope() != NULL) {
-    scope_ = name_resolver_->GetImmutableClassName(
-        descriptor_->extension_scope());
+    scope_ =
+        name_resolver_->GetImmutableClassName(descriptor_->extension_scope());
   } else {
     scope_ = name_resolver_->GetImmutableClassName(descriptor_->file());
   }
@@ -74,8 +75,9 @@
   vars["number"] = StrCat(descriptor->number());
   vars["constant_name"] = FieldConstantName(descriptor);
   vars["index"] = StrCat(descriptor->index());
-  vars["default"] = descriptor->is_repeated() ?
-      "" : DefaultValue(descriptor, immutable, name_resolver);
+  vars["default"] = descriptor->is_repeated()
+                        ? ""
+                        : DefaultValue(descriptor, immutable, name_resolver);
   vars["type_constant"] = FieldTypeName(GetType(descriptor));
   vars["packed"] = descriptor->is_packed() ? "true" : "false";
   vars["enum_map"] = "null";
@@ -85,13 +87,13 @@
   std::string singular_type;
   switch (java_type) {
     case JAVATYPE_MESSAGE:
-      singular_type = name_resolver->GetClassName(descriptor->message_type(),
-                                                   immutable);
+      singular_type =
+          name_resolver->GetClassName(descriptor->message_type(), immutable);
       vars["prototype"] = singular_type + ".getDefaultInstance()";
       break;
     case JAVATYPE_ENUM:
-      singular_type = name_resolver->GetClassName(descriptor->enum_type(),
-                                                   immutable);
+      singular_type =
+          name_resolver->GetClassName(descriptor->enum_type(), immutable);
       vars["enum_map"] = singular_type + ".internalGetValueMap()";
       break;
     case JAVATYPE_STRING:
@@ -104,8 +106,9 @@
       singular_type = BoxedPrimitiveTypeName(java_type);
       break;
   }
-  vars["type"] = descriptor->is_repeated() ?
-      "java.util.List<" + singular_type + ">" : singular_type;
+  vars["type"] = descriptor->is_repeated()
+                     ? "java.util.List<" + singular_type + ">"
+                     : singular_type;
   vars["singular_type"] = singular_type;
 }
 
@@ -114,8 +117,7 @@
   const bool kUseImmutableNames = true;
   InitTemplateVars(descriptor_, scope_, kUseImmutableNames, name_resolver_,
                    &vars);
-  printer->Print(vars,
-      "public static final int $constant_name$ = $number$;\n");
+  printer->Print(vars, "public static final int $constant_name$ = $number$;\n");
 
   WriteFieldDocComment(printer, descriptor_);
   if (descriptor_->extension_scope() == NULL) {
@@ -162,10 +164,8 @@
 
 int ImmutableExtensionGenerator::GenerateRegistrationCode(
     io::Printer* printer) {
-  printer->Print(
-    "registry.add($scope$.$name$);\n",
-    "scope", scope_,
-    "name", UnderscoresToCamelCaseCheckReserved(descriptor_));
+  printer->Print("registry.add($scope$.$name$);\n", "scope", scope_, "name",
+                 UnderscoresToCamelCaseCheckReserved(descriptor_));
   return 7;
 }
 
diff --git a/src/google/protobuf/compiler/java/java_extension_lite.cc b/src/google/protobuf/compiler/java/java_extension_lite.cc
index 9db28a4..27225ac 100644
--- a/src/google/protobuf/compiler/java/java_extension_lite.cc
+++ b/src/google/protobuf/compiler/java/java_extension_lite.cc
@@ -44,11 +44,12 @@
 
 ImmutableExtensionLiteGenerator::ImmutableExtensionLiteGenerator(
     const FieldDescriptor* descriptor, Context* context)
-  : descriptor_(descriptor), context_(context),
-    name_resolver_(context->GetNameResolver()) {
+    : descriptor_(descriptor),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   if (descriptor_->extension_scope() != NULL) {
-    scope_ = name_resolver_->GetImmutableClassName(
-        descriptor_->extension_scope());
+    scope_ =
+        name_resolver_->GetImmutableClassName(descriptor_->extension_scope());
   } else {
     scope_ = name_resolver_->GetImmutableClassName(descriptor_->file());
   }
@@ -61,8 +62,7 @@
   const bool kUseImmutableNames = true;
   InitTemplateVars(descriptor_, scope_, kUseImmutableNames, name_resolver_,
                    &vars);
-  printer->Print(vars,
-      "public static final int $constant_name$ = $number$;\n");
+  printer->Print(vars, "public static final int $constant_name$ = $number$;\n");
 
   WriteFieldDocComment(printer, descriptor_);
   if (descriptor_->is_repeated()) {
@@ -106,10 +106,8 @@
 
 int ImmutableExtensionLiteGenerator::GenerateRegistrationCode(
     io::Printer* printer) {
-  printer->Print(
-    "registry.add($scope$.$name$);\n",
-    "scope", scope_,
-    "name", UnderscoresToCamelCaseCheckReserved(descriptor_));
+  printer->Print("registry.add($scope$.$name$);\n", "scope", scope_, "name",
+                 UnderscoresToCamelCaseCheckReserved(descriptor_));
   return 7;
 }
 
diff --git a/src/google/protobuf/compiler/java/java_field.cc b/src/google/protobuf/compiler/java/java_field.cc
index a18f02f..18a86ba 100644
--- a/src/google/protobuf/compiler/java/java_field.cc
+++ b/src/google/protobuf/compiler/java/java_field.cc
@@ -63,15 +63,16 @@
 
 namespace {
 
-ImmutableFieldGenerator* MakeImmutableGenerator(
-    const FieldDescriptor* field, int messageBitIndex, int builderBitIndex,
-    Context* context) {
+ImmutableFieldGenerator* MakeImmutableGenerator(const FieldDescriptor* field,
+                                                int messageBitIndex,
+                                                int builderBitIndex,
+                                                Context* context) {
   if (field->is_repeated()) {
     switch (GetJavaType(field)) {
       case JAVATYPE_MESSAGE:
         if (IsMapEntry(field->message_type())) {
-          return new ImmutableMapFieldGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          return new ImmutableMapFieldGenerator(field, messageBitIndex,
+                                                builderBitIndex, context);
         } else {
           return new RepeatedImmutableMessageFieldGenerator(
               field, messageBitIndex, builderBitIndex, context);
@@ -93,8 +94,8 @@
           return new ImmutableMessageOneofFieldGenerator(
               field, messageBitIndex, builderBitIndex, context);
         case JAVATYPE_ENUM:
-          return new ImmutableEnumOneofFieldGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          return new ImmutableEnumOneofFieldGenerator(field, messageBitIndex,
+                                                      builderBitIndex, context);
         case JAVATYPE_STRING:
           return new ImmutableStringOneofFieldGenerator(
               field, messageBitIndex, builderBitIndex, context);
@@ -105,17 +106,17 @@
     } else {
       switch (GetJavaType(field)) {
         case JAVATYPE_MESSAGE:
-          return new ImmutableMessageFieldGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          return new ImmutableMessageFieldGenerator(field, messageBitIndex,
+                                                    builderBitIndex, context);
         case JAVATYPE_ENUM:
-          return new ImmutableEnumFieldGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          return new ImmutableEnumFieldGenerator(field, messageBitIndex,
+                                                 builderBitIndex, context);
         case JAVATYPE_STRING:
-          return new ImmutableStringFieldGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          return new ImmutableStringFieldGenerator(field, messageBitIndex,
+                                                   builderBitIndex, context);
         default:
-          return new ImmutablePrimitiveFieldGenerator(
-              field, messageBitIndex, builderBitIndex, context);
+          return new ImmutablePrimitiveFieldGenerator(field, messageBitIndex,
+                                                      builderBitIndex, context);
       }
     }
   }
@@ -193,18 +194,13 @@
 
 ImmutableFieldGenerator::~ImmutableFieldGenerator() {}
 
-void ImmutableFieldGenerator::
-GenerateParsingCodeFromPacked(io::Printer* printer) const {
+void ImmutableFieldGenerator::GenerateParsingCodeFromPacked(
+    io::Printer* printer) const {
   ReportUnexpectedPackedFieldsCall(printer);
 }
 
 ImmutableFieldLiteGenerator::~ImmutableFieldLiteGenerator() {}
 
-void ImmutableFieldLiteGenerator::
-GenerateParsingCodeFromPacked(io::Printer* printer) const {
-  ReportUnexpectedPackedFieldsCall(printer);
-}
-
 // ===================================================================
 
 template <>
@@ -224,7 +220,7 @@
   }
 }
 
-template<>
+template <>
 FieldGeneratorMap<ImmutableFieldGenerator>::~FieldGeneratorMap() {}
 
 template <>
@@ -242,7 +238,7 @@
   }
 }
 
-template<>
+template <>
 FieldGeneratorMap<ImmutableFieldLiteGenerator>::~FieldGeneratorMap() {}
 
 
@@ -271,10 +267,10 @@
   (*variables)["oneof_capitalized_name"] = info->capitalized_name;
   (*variables)["oneof_index"] =
       StrCat(descriptor->containing_oneof()->index());
+  (*variables)["oneof_stored_type"] = GetOneofStoredType(descriptor);
   (*variables)["set_oneof_case_message"] =
       info->name + "Case_ = " + StrCat(descriptor->number());
-  (*variables)["clear_oneof_case_message"] = info->name +
-      "Case_ = 0";
+  (*variables)["clear_oneof_case_message"] = info->name + "Case_ = 0";
   (*variables)["has_oneof_case_message"] =
       info->name + "Case_ == " + StrCat(descriptor->number());
 }
diff --git a/src/google/protobuf/compiler/java/java_field.h b/src/google/protobuf/compiler/java/java_field.h
index abefc58..8a88d69 100644
--- a/src/google/protobuf/compiler/java/java_field.h
+++ b/src/google/protobuf/compiler/java/java_field.h
@@ -39,9 +39,9 @@
 #include <memory>
 #include <string>
 
+#include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/logging.h>
 
 namespace google {
 namespace protobuf {
@@ -103,20 +103,8 @@
   virtual void GenerateMembers(io::Printer* printer) const = 0;
   virtual void GenerateBuilderMembers(io::Printer* printer) const = 0;
   virtual void GenerateInitializationCode(io::Printer* printer) const = 0;
-  virtual void GenerateVisitCode(io::Printer* printer) const = 0;
-  virtual void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer)
-      const = 0;
-  virtual void GenerateParsingCode(io::Printer* printer) const = 0;
-  virtual void GenerateParsingCodeFromPacked(io::Printer* printer) const;
-  virtual void GenerateParsingDoneCode(io::Printer* printer) const = 0;
-  virtual void GenerateSerializationCode(io::Printer* printer) const = 0;
-  virtual void GenerateSerializedSizeCode(io::Printer* printer) const = 0;
-  virtual void GenerateFieldBuilderInitializationCode(io::Printer* printer)
-      const = 0;
-
-  virtual void GenerateEqualsCode(io::Printer* printer) const = 0;
-  virtual void GenerateHashCode(io::Printer* printer) const = 0;
-
+  virtual void GenerateFieldInfo(io::Printer* printer,
+                                 std::vector<uint16>* output) const = 0;
 
   virtual std::string GetBoxedType() const = 0;
 
@@ -126,11 +114,10 @@
 
 
 // Convenience class which constructs FieldGenerators for a Descriptor.
-template<typename FieldGeneratorType>
+template <typename FieldGeneratorType>
 class FieldGeneratorMap {
  public:
-  explicit FieldGeneratorMap(const Descriptor* descriptor,
-                             Context* context);
+  explicit FieldGeneratorMap(const Descriptor* descriptor, Context* context);
   ~FieldGeneratorMap();
 
   const FieldGeneratorType& get(const FieldDescriptor* field) const;
@@ -144,20 +131,19 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap);
 };
 
-template<typename FieldGeneratorType>
-inline const FieldGeneratorType&
-FieldGeneratorMap<FieldGeneratorType>::get(const FieldDescriptor* field) const {
+template <typename FieldGeneratorType>
+inline const FieldGeneratorType& FieldGeneratorMap<FieldGeneratorType>::get(
+    const FieldDescriptor* field) const {
   GOOGLE_CHECK_EQ(field->containing_type(), descriptor_);
   return *field_generators_[field->index()];
 }
 
 // Instantiate template for mutable and immutable maps.
-template<>
-FieldGeneratorMap<ImmutableFieldGenerator>::
-FieldGeneratorMap(const Descriptor* descriptor,
-                  Context* context);
+template <>
+FieldGeneratorMap<ImmutableFieldGenerator>::FieldGeneratorMap(
+    const Descriptor* descriptor, Context* context);
 
-template<>
+template <>
 FieldGeneratorMap<ImmutableFieldGenerator>::~FieldGeneratorMap();
 
 
diff --git a/src/google/protobuf/compiler/java/java_file.cc b/src/google/protobuf/compiler/java/java_file.cc
index e963035..e895391 100644
--- a/src/google/protobuf/compiler/java/java_file.cc
+++ b/src/google/protobuf/compiler/java/java_file.cc
@@ -63,26 +63,26 @@
 namespace {
 
 struct FieldDescriptorCompare {
-  bool operator ()(const FieldDescriptor* f1, const FieldDescriptor* f2) const {
-    if(f1 == NULL) {
+  bool operator()(const FieldDescriptor* f1, const FieldDescriptor* f2) const {
+    if (f1 == NULL) {
       return false;
     }
-    if(f2 == NULL) {
+    if (f2 == NULL) {
       return true;
     }
     return f1->full_name() < f2->full_name();
   }
 };
 
-typedef std::set<const FieldDescriptor*, FieldDescriptorCompare> FieldDescriptorSet;
+typedef std::set<const FieldDescriptor*, FieldDescriptorCompare>
+    FieldDescriptorSet;
 
 // Recursively searches the given message to collect extensions.
 // Returns true if all the extensions can be recognized. The extensions will be
 // appended in to the extensions parameter.
 // Returns false when there are unknown fields, in which case the data in the
 // extensions output parameter is not reliable and should be discarded.
-bool CollectExtensions(const Message& message,
-                       FieldDescriptorSet* extensions) {
+bool CollectExtensions(const Message& message, FieldDescriptorSet* extensions) {
   const Reflection* reflection = message.GetReflection();
 
   // There are unknown fields that could be extensions, thus this call fails.
@@ -99,7 +99,7 @@
         int size = reflection->FieldSize(message, fields[i]);
         for (int j = 0; j < size; j++) {
           const Message& sub_message =
-            reflection->GetRepeatedMessage(message, fields[i], j);
+              reflection->GetRepeatedMessage(message, fields[i], j);
           if (!CollectExtensions(sub_message, extensions)) return false;
         }
       } else {
@@ -160,11 +160,9 @@
 // extend our methods by simply chaining them to another method
 // with a tail call. This inserts the sequence call-next-method,
 // end this one, begin-next-method as needed.
-void MaybeRestartJavaMethod(io::Printer* printer,
-                            int *bytecode_estimate,
-                            int *method_num,
-                            const char *chain_statement,
-                            const char *method_decl) {
+void MaybeRestartJavaMethod(io::Printer* printer, int* bytecode_estimate,
+                            int* method_num, const char* chain_statement,
+                            const char* method_decl) {
   // The goal here is to stay under 64K bytes of jvm bytecode/method,
   // since otherwise we hit a hardcoded limit in the jvm and javac will
   // then fail with the error "code too large". This limit lets our
@@ -194,8 +192,7 @@
       options_(options),
       immutable_api_(immutable_api) {
   classname_ = name_resolver_->GetFileClassName(file, immutable_api);
-  generator_factory_.reset(
-      new ImmutableGeneratorFactory(context_.get()));
+  generator_factory_.reset(new ImmutableGeneratorFactory(context_.get()));
   for (int i = 0; i < file_->message_type_count(); ++i) {
     message_generators_[i].reset(
         generator_factory_->NewMessageGenerator(file_->message_type(i)));
@@ -217,12 +214,13 @@
                                               NameEquality::EXACT_EQUAL)) {
     error->assign(file_->name());
     error->append(
-      ": Cannot generate Java output because the file's outer class name, \"");
+        ": Cannot generate Java output because the file's outer class name, "
+        "\"");
     error->append(classname_);
     error->append(
-      "\", matches the name of one of the types declared inside it.  "
-      "Please either rename the type or use the java_outer_classname "
-      "option to specify a different outer class name for the .proto file.");
+        "\", matches the name of one of the types declared inside it.  "
+        "Please either rename the type or use the java_outer_classname "
+        "option to specify a different outer class name for the .proto file.");
     return false;
   }
   // Similar to the check above, but ignore the case this time. This is not a
@@ -243,8 +241,7 @@
   if (file_->options().optimize_for() == FileOptions::LITE_RUNTIME) {
     GOOGLE_LOG(WARNING)
         << "The optimize_for = LITE_RUNTIME option is no longer supported by "
-        << "protobuf Java code generator and may generate broken code. It "
-        << "will be ignored by protoc in the future and protoc will always "
+        << "protobuf Java code generator and is ignored--protoc will always "
         << "generate full runtime code for Java. To use Java Lite runtime, "
         << "users should use the Java Lite plugin instead. See:\n"
         << "  "
@@ -258,33 +255,32 @@
   // We don't import anything because we refer to all classes by their
   // fully-qualified names in the generated source.
   printer->Print(
-    "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
-    "// source: $filename$\n"
-    "\n",
-    "filename", file_->name());
+      "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
+      "// source: $filename$\n"
+      "\n",
+      "filename", file_->name());
   if (!java_package_.empty()) {
     printer->Print(
-      "package $package$;\n"
-      "\n",
-      "package", java_package_);
+        "package $package$;\n"
+        "\n",
+        "package", java_package_);
   }
   PrintGeneratedAnnotation(
       printer, '$', options_.annotate_code ? classname_ + ".java.pb.meta" : "");
   printer->Print(
       "$deprecation$public final class $classname$ {\n"
       "  private $ctor$() {}\n",
-      "deprecation", file_->options().deprecated() ?
-          "@java.lang.Deprecated " : "",
-      "classname", classname_,
-      "ctor", classname_);
+      "deprecation",
+      file_->options().deprecated() ? "@java.lang.Deprecated " : "",
+      "classname", classname_, "ctor", classname_);
   printer->Annotate("classname", file_->name());
   printer->Indent();
 
   // -----------------------------------------------------------------
 
   printer->Print(
-    "public static void registerAllExtensions(\n"
-    "    com.google.protobuf.ExtensionRegistryLite registry) {\n");
+      "public static void registerAllExtensions(\n"
+      "    com.google.protobuf.ExtensionRegistryLite registry) {\n");
 
   printer->Indent();
 
@@ -297,8 +293,7 @@
   }
 
   printer->Outdent();
-  printer->Print(
-    "}\n");
+  printer->Print("}\n");
   if (HasDescriptorMethods(file_, context_->EnforceLite())) {
     // Overload registerAllExtensions for the non-lite usage to
     // redundantly maintain the original signature (this is
@@ -306,12 +301,12 @@
     // ExtensionRegistry in the non-lite usage). Intent is
     // to remove this in the future.
     printer->Print(
-      "\n"
-      "public static void registerAllExtensions(\n"
-      "    com.google.protobuf.ExtensionRegistry registry) {\n"
-      "  registerAllExtensions(\n"
-      "      (com.google.protobuf.ExtensionRegistryLite) registry);\n"
-      "}\n");
+        "\n"
+        "public static void registerAllExtensions(\n"
+        "    com.google.protobuf.ExtensionRegistry registry) {\n"
+        "  registerAllExtensions(\n"
+        "      (com.google.protobuf.ExtensionRegistryLite) registry);\n"
+        "}\n");
   }
 
   // -----------------------------------------------------------------
@@ -363,29 +358,27 @@
       GenerateDescriptorInitializationCodeForMutable(printer);
     }
   } else {
-    printer->Print(
-      "static {\n");
+    printer->Print("static {\n");
     printer->Indent();
     int bytecode_estimate = 0;
     int method_num = 0;
 
     for (int i = 0; i < file_->message_type_count(); i++) {
-      bytecode_estimate += message_generators_[i]->GenerateStaticVariableInitializers(printer);
+      bytecode_estimate +=
+          message_generators_[i]->GenerateStaticVariableInitializers(printer);
       MaybeRestartJavaMethod(
-        printer,
-        &bytecode_estimate, &method_num,
-        "_clinit_autosplit_$method_num$();\n",
-        "private static void _clinit_autosplit_$method_num$() {\n");
+          printer, &bytecode_estimate, &method_num,
+          "_clinit_autosplit_$method_num$();\n",
+          "private static void _clinit_autosplit_$method_num$() {\n");
     }
 
     printer->Outdent();
-    printer->Print(
-      "}\n");
+    printer->Print("}\n");
   }
 
   printer->Print(
-    "\n"
-    "// @@protoc_insertion_point(outer_class_scope)\n");
+      "\n"
+      "// @@protoc_insertion_point(outer_class_scope)\n");
 
   printer->Outdent();
   printer->Print("}\n");
@@ -394,15 +387,15 @@
 void FileGenerator::GenerateDescriptorInitializationCodeForImmutable(
     io::Printer* printer) {
   printer->Print(
-    "public static com.google.protobuf.Descriptors.FileDescriptor\n"
-    "    getDescriptor() {\n"
-    "  return descriptor;\n"
-    "}\n"
-    "private static $final$ com.google.protobuf.Descriptors.FileDescriptor\n"
-    "    descriptor;\n"
-    "static {\n",
-    // TODO(dweis): Mark this as final.
-    "final", "");
+      "public static com.google.protobuf.Descriptors.FileDescriptor\n"
+      "    getDescriptor() {\n"
+      "  return descriptor;\n"
+      "}\n"
+      "private static $final$ com.google.protobuf.Descriptors.FileDescriptor\n"
+      "    descriptor;\n"
+      "static {\n",
+      // TODO(dweis): Mark this as final.
+      "final", "");
   printer->Indent();
 
   SharedCodeGenerator shared_code_generator(file_, options_);
@@ -412,20 +405,20 @@
   int method_num = 0;
 
   for (int i = 0; i < file_->message_type_count(); i++) {
-    bytecode_estimate += message_generators_[i]->GenerateStaticVariableInitializers(printer);
+    bytecode_estimate +=
+        message_generators_[i]->GenerateStaticVariableInitializers(printer);
     MaybeRestartJavaMethod(
-      printer,
-      &bytecode_estimate, &method_num,
-      "_clinit_autosplit_dinit_$method_num$();\n",
-      "private static void _clinit_autosplit_dinit_$method_num$() {\n");
+        printer, &bytecode_estimate, &method_num,
+        "_clinit_autosplit_dinit_$method_num$();\n",
+        "private static void _clinit_autosplit_dinit_$method_num$() {\n");
   }
   for (int i = 0; i < file_->extension_count(); i++) {
-    bytecode_estimate += extension_generators_[i]->GenerateNonNestedInitializationCode(printer);
+    bytecode_estimate +=
+        extension_generators_[i]->GenerateNonNestedInitializationCode(printer);
     MaybeRestartJavaMethod(
-      printer,
-      &bytecode_estimate, &method_num,
-      "_clinit_autosplit_dinit_$method_num$();\n",
-      "private static void _clinit_autosplit_dinit_$method_num$() {\n");
+        printer, &bytecode_estimate, &method_num,
+        "_clinit_autosplit_dinit_$method_num$();\n",
+        "private static void _clinit_autosplit_dinit_$method_num$() {\n");
   }
 
   // Proto compiler builds a DescriptorPool, which holds all the descriptors to
@@ -454,23 +447,22 @@
     // Must construct an ExtensionRegistry containing all existing extensions
     // and use it to parse the descriptor data again to recognize extensions.
     printer->Print(
-      "com.google.protobuf.ExtensionRegistry registry =\n"
-      "    com.google.protobuf.ExtensionRegistry.newInstance();\n");
+        "com.google.protobuf.ExtensionRegistry registry =\n"
+        "    com.google.protobuf.ExtensionRegistry.newInstance();\n");
     FieldDescriptorSet::iterator it;
     for (it = extensions.begin(); it != extensions.end(); it++) {
       std::unique_ptr<ExtensionGenerator> generator(
           generator_factory_->NewExtensionGenerator(*it));
       bytecode_estimate += generator->GenerateRegistrationCode(printer);
       MaybeRestartJavaMethod(
-        printer,
-        &bytecode_estimate, &method_num,
-        "_clinit_autosplit_dinit_$method_num$(registry);\n",
-        "private static void _clinit_autosplit_dinit_$method_num$(\n"
-        "    com.google.protobuf.ExtensionRegistry registry) {\n");
+          printer, &bytecode_estimate, &method_num,
+          "_clinit_autosplit_dinit_$method_num$(registry);\n",
+          "private static void _clinit_autosplit_dinit_$method_num$(\n"
+          "    com.google.protobuf.ExtensionRegistry registry) {\n");
     }
     printer->Print(
-      "com.google.protobuf.Descriptors.FileDescriptor\n"
-      "    .internalUpdateFileDescriptor(descriptor, registry);\n");
+        "com.google.protobuf.Descriptors.FileDescriptor\n"
+        "    .internalUpdateFileDescriptor(descriptor, registry);\n");
   }
 
   // Force descriptor initialization of all dependencies.
@@ -478,32 +470,31 @@
     if (ShouldIncludeDependency(file_->dependency(i), true)) {
       std::string dependency =
           name_resolver_->GetImmutableClassName(file_->dependency(i));
-      printer->Print(
-        "$dependency$.getDescriptor();\n",
-        "dependency", dependency);
+      printer->Print("$dependency$.getDescriptor();\n", "dependency",
+                     dependency);
     }
   }
 
   printer->Outdent();
-  printer->Print(
-    "}\n");
+  printer->Print("}\n");
 }
 
-void FileGenerator::GenerateDescriptorInitializationCodeForMutable(io::Printer* printer) {
+void FileGenerator::GenerateDescriptorInitializationCodeForMutable(
+    io::Printer* printer) {
   printer->Print(
-    "public static com.google.protobuf.Descriptors.FileDescriptor\n"
-    "    getDescriptor() {\n"
-    "  return descriptor;\n"
-    "}\n"
-    "private static final com.google.protobuf.Descriptors.FileDescriptor\n"
-    "    descriptor;\n"
-    "static {\n");
+      "public static com.google.protobuf.Descriptors.FileDescriptor\n"
+      "    getDescriptor() {\n"
+      "  return descriptor;\n"
+      "}\n"
+      "private static final com.google.protobuf.Descriptors.FileDescriptor\n"
+      "    descriptor;\n"
+      "static {\n");
   printer->Indent();
 
   printer->Print(
-    "descriptor = $immutable_package$.$descriptor_classname$.descriptor;\n",
-    "immutable_package", FileJavaPackage(file_, true),
-    "descriptor_classname", name_resolver_->GetDescriptorClassName(file_));
+      "descriptor = $immutable_package$.$descriptor_classname$.descriptor;\n",
+      "immutable_package", FileJavaPackage(file_, true), "descriptor_classname",
+      name_resolver_->GetDescriptorClassName(file_));
 
   for (int i = 0; i < file_->message_type_count(); i++) {
     message_generators_[i]->GenerateStaticVariableInitializers(printer);
@@ -583,15 +574,13 @@
     if (ShouldIncludeDependency(file_->dependency(i), false)) {
       std::string dependency =
           name_resolver_->GetMutableClassName(file_->dependency(i));
-      printer->Print(
-        "$dependency$.getDescriptor();\n",
-        "dependency", dependency);
+      printer->Print("$dependency$.getDescriptor();\n", "dependency",
+                     dependency);
     }
   }
 
   printer->Outdent();
-  printer->Print(
-    "}\n");
+  printer->Print("}\n");
 }
 
 template <typename GeneratorClass, typename DescriptorClass>
@@ -615,15 +604,15 @@
                       annotate_code ? &annotation_collector : NULL);
 
   printer.Print(
-    "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
-    "// source: $filename$\n"
-    "\n",
-    "filename", descriptor->file()->name());
+      "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
+      "// source: $filename$\n"
+      "\n",
+      "filename", descriptor->file()->name());
   if (!java_package.empty()) {
     printer.Print(
-      "package $package$;\n"
-      "\n",
-      "package", java_package);
+        "package $package$;\n"
+        "\n",
+        "package", java_package);
   }
 
   (generator->*pfn)(&printer);
@@ -683,8 +672,8 @@
   }
 }
 
-bool FileGenerator::ShouldIncludeDependency(
-    const FileDescriptor* descriptor, bool immutable_api) {
+bool FileGenerator::ShouldIncludeDependency(const FileDescriptor* descriptor,
+                                            bool immutable_api) {
   return true;
 }
 
diff --git a/src/google/protobuf/compiler/java/java_file.h b/src/google/protobuf/compiler/java/java_file.h
index 9dca82b..bb3e4a5 100644
--- a/src/google/protobuf/compiler/java/java_file.h
+++ b/src/google/protobuf/compiler/java/java_file.h
@@ -43,20 +43,20 @@
 
 namespace google {
 namespace protobuf {
-class FileDescriptor;          // descriptor.h
+class FileDescriptor;  // descriptor.h
 namespace io {
-  class Printer;               // printer.h
+class Printer;  // printer.h
 }
 namespace compiler {
-  class GeneratorContext;      // code_generator.h
-  namespace java {
-    class Context;             // context.h
-    class MessageGenerator;    // message.h
-    class GeneratorFactory;    // generator_factory.h
-    class ExtensionGenerator;  // extension.h
-    class ClassNameResolver;   // name_resolver.h
-  }
-}
+class GeneratorContext;  // code_generator.h
+namespace java {
+class Context;             // context.h
+class MessageGenerator;    // message.h
+class GeneratorFactory;    // generator_factory.h
+class ExtensionGenerator;  // extension.h
+class ClassNameResolver;   // name_resolver.h
+}  // namespace java
+}  // namespace compiler
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/compiler/java/java_generator.cc b/src/google/protobuf/compiler/java/java_generator.cc
index 78bb6dc..5045cfd 100644
--- a/src/google/protobuf/compiler/java/java_generator.cc
+++ b/src/google/protobuf/compiler/java/java_generator.cc
@@ -78,6 +78,10 @@
       file_options.generate_mutable_code = true;
     } else if (options[i].first == "shared") {
       file_options.generate_shared_code = true;
+    } else if (options[i].first == "lite") {
+      // Note: Java Lite does not guarantee API/ABI stability. We may choose to
+      // break existing API in order to boost performance / reduce code size.
+      file_options.enforce_lite = true;
     } else if (options[i].first == "annotate_code") {
       file_options.annotate_code = true;
     } else if (options[i].first == "annotation_list_file") {
@@ -147,9 +151,9 @@
     GeneratedCodeInfo annotations;
     io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
         &annotations);
-    io::Printer printer(output.get(), '$', file_options.annotate_code
-                                               ? &annotation_collector
-                                               : NULL);
+    io::Printer printer(
+        output.get(), '$',
+        file_options.annotate_code ? &annotation_collector : NULL);
 
     file_generator->Generate(&printer);
 
diff --git a/src/google/protobuf/compiler/java/java_generator_factory.cc b/src/google/protobuf/compiler/java/java_generator_factory.cc
index 3218b41..3a62adb 100644
--- a/src/google/protobuf/compiler/java/java_generator_factory.cc
+++ b/src/google/protobuf/compiler/java/java_generator_factory.cc
@@ -52,9 +52,8 @@
 
 // ===================================================================
 
-ImmutableGeneratorFactory::ImmutableGeneratorFactory(
-    Context* context) : context_(context) {
-}
+ImmutableGeneratorFactory::ImmutableGeneratorFactory(Context* context)
+    : context_(context) {}
 ImmutableGeneratorFactory::~ImmutableGeneratorFactory() {}
 
 MessageGenerator* ImmutableGeneratorFactory::NewMessageGenerator(
diff --git a/src/google/protobuf/compiler/java/java_generator_factory.h b/src/google/protobuf/compiler/java/java_generator_factory.h
index 505cd3a..16688a5 100644
--- a/src/google/protobuf/compiler/java/java_generator_factory.h
+++ b/src/google/protobuf/compiler/java/java_generator_factory.h
@@ -37,17 +37,17 @@
 
 namespace google {
 namespace protobuf {
-class FieldDescriptor;         // descriptor.h
-class Descriptor;              // descriptor.h
-class ServiceDescriptor;       // descriptor.h
+class FieldDescriptor;    // descriptor.h
+class Descriptor;         // descriptor.h
+class ServiceDescriptor;  // descriptor.h
 namespace compiler {
-  namespace java {
-    class MessageGenerator;    // message.h
-    class ExtensionGenerator;  // extension.h
-    class ServiceGenerator;    // service.h
-    class Context;             // context.h
-  }
-}
+namespace java {
+class MessageGenerator;    // message.h
+class ExtensionGenerator;  // extension.h
+class ServiceGenerator;    // service.h
+class Context;             // context.h
+}  // namespace java
+}  // namespace compiler
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/compiler/java/java_helpers.cc b/src/google/protobuf/compiler/java/java_helpers.cc
index 93b9294..6e52b1d 100644
--- a/src/google/protobuf/compiler/java/java_helpers.cc
+++ b/src/google/protobuf/compiler/java/java_helpers.cc
@@ -58,9 +58,9 @@
 using internal::WireFormatLite;
 
 const char kThickSeparator[] =
-  "// ===================================================================\n";
+    "// ===================================================================\n";
 const char kThinSeparator[] =
-  "// -------------------------------------------------------------------\n";
+    "// -------------------------------------------------------------------\n";
 
 namespace {
 
@@ -70,21 +70,26 @@
 // Using them will cause the compiler to generate accessors whose names are
 // colliding with methods defined in base classes.
 const char* kForbiddenWordList[] = {
-  // message base class:
-  "cached_size", "serialized_size",
-  // java.lang.Object:
-  "class",
+    // message base class:
+    "cached_size",
+    "serialized_size",
+    // java.lang.Object:
+    "class",
 };
 
-const std::unordered_set<string> kReservedNames = {
-  "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char",
-  "class", "const", "continue", "default", "do", "double", "else", "enum",
-  "extends", "final", "finally", "float", "for", "goto", "if", "implements",
-  "import", "instanceof", "int", "interface", "long", "native", "new", "package",
-  "private", "protected", "public", "return", "short", "static", "strictfp", "super",
-  "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", 
-  "volatile", "while",
-};
+const std::unordered_set<string>* kReservedNames =
+    new std::unordered_set<string>({
+        "abstract",   "assert",       "boolean",   "break",      "byte",
+        "case",       "catch",        "char",      "class",      "const",
+        "continue",   "default",      "do",        "double",     "else",
+        "enum",       "extends",      "final",     "finally",    "float",
+        "for",        "goto",         "if",        "implements", "import",
+        "instanceof", "int",          "interface", "long",       "native",
+        "new",        "package",      "private",   "protected",  "public",
+        "return",     "short",        "static",    "strictfp",   "super",
+        "switch",     "synchronized", "this",      "throw",      "throws",
+        "transient",  "try",          "void",      "volatile",   "while",
+    });
 
 const int kDefaultLookUpStartFieldNumber = 40;
 
@@ -138,17 +143,16 @@
                             const char* var_name,
                             const char* terminating_string, bool enforce_lite) {
   std::string enum_verifier_string =
-      (descriptor->enum_type()->file()->options().optimize_for() ==
-       FileOptions::LITE_RUNTIME) || enforce_lite
-          ? StrCat(var_name, ".internalGetVerifier()")
-          : StrCat(
-              "new com.google.protobuf.Internal.EnumVerifier() {\n"
-              "        @java.lang.Override\n"
-              "        public boolean isInRange(int number) {\n"
-              "          return ", var_name, ".forNumber(number) != null;\n"
-              "        }\n"
-              "      }"
-      );
+      enforce_lite ? StrCat(var_name, ".internalGetVerifier()")
+                   : StrCat(
+                         "new com.google.protobuf.Internal.EnumVerifier() {\n"
+                         "        @java.lang.Override\n"
+                         "        public boolean isInRange(int number) {\n"
+                         "          return ",
+                         var_name,
+                         ".forNumber(number) != null;\n"
+                         "        }\n"
+                         "      }");
   printer->Print(
       variables,
       StrCat(enum_verifier_string, terminating_string).c_str());
@@ -208,7 +212,7 @@
 
 std::string UnderscoresToCamelCaseCheckReserved(const FieldDescriptor* field) {
   std::string name = UnderscoresToCamelCase(field);
-  if (kReservedNames.find(name) != kReservedNames.end()) {
+  if (kReservedNames->find(name) != kReservedNames->end()) {
     return name + "_";
   }
   return name;
@@ -376,8 +380,8 @@
     case FieldDescriptor::TYPE_MESSAGE:
       return JAVATYPE_MESSAGE;
 
-    // No default because we want the compiler to complain if any new
-    // types are added.
+      // No default because we want the compiler to complain if any new
+      // types are added.
   }
 
   GOOGLE_LOG(FATAL) << "Can't get here.";
@@ -386,18 +390,27 @@
 
 const char* PrimitiveTypeName(JavaType type) {
   switch (type) {
-    case JAVATYPE_INT    : return "int";
-    case JAVATYPE_LONG   : return "long";
-    case JAVATYPE_FLOAT  : return "float";
-    case JAVATYPE_DOUBLE : return "double";
-    case JAVATYPE_BOOLEAN: return "boolean";
-    case JAVATYPE_STRING : return "java.lang.String";
-    case JAVATYPE_BYTES  : return "com.google.protobuf.ByteString";
-    case JAVATYPE_ENUM   : return NULL;
-    case JAVATYPE_MESSAGE: return NULL;
+    case JAVATYPE_INT:
+      return "int";
+    case JAVATYPE_LONG:
+      return "long";
+    case JAVATYPE_FLOAT:
+      return "float";
+    case JAVATYPE_DOUBLE:
+      return "double";
+    case JAVATYPE_BOOLEAN:
+      return "boolean";
+    case JAVATYPE_STRING:
+      return "java.lang.String";
+    case JAVATYPE_BYTES:
+      return "com.google.protobuf.ByteString";
+    case JAVATYPE_ENUM:
+      return NULL;
+    case JAVATYPE_MESSAGE:
+      return NULL;
 
-    // No default because we want the compiler to complain if any new
-    // JavaTypes are added.
+      // No default because we want the compiler to complain if any new
+      // JavaTypes are added.
   }
 
   GOOGLE_LOG(FATAL) << "Can't get here.";
@@ -410,18 +423,27 @@
 
 const char* BoxedPrimitiveTypeName(JavaType type) {
   switch (type) {
-    case JAVATYPE_INT    : return "java.lang.Integer";
-    case JAVATYPE_LONG   : return "java.lang.Long";
-    case JAVATYPE_FLOAT  : return "java.lang.Float";
-    case JAVATYPE_DOUBLE : return "java.lang.Double";
-    case JAVATYPE_BOOLEAN: return "java.lang.Boolean";
-    case JAVATYPE_STRING : return "java.lang.String";
-    case JAVATYPE_BYTES  : return "com.google.protobuf.ByteString";
-    case JAVATYPE_ENUM   : return NULL;
-    case JAVATYPE_MESSAGE: return NULL;
+    case JAVATYPE_INT:
+      return "java.lang.Integer";
+    case JAVATYPE_LONG:
+      return "java.lang.Long";
+    case JAVATYPE_FLOAT:
+      return "java.lang.Float";
+    case JAVATYPE_DOUBLE:
+      return "java.lang.Double";
+    case JAVATYPE_BOOLEAN:
+      return "java.lang.Boolean";
+    case JAVATYPE_STRING:
+      return "java.lang.String";
+    case JAVATYPE_BYTES:
+      return "com.google.protobuf.ByteString";
+    case JAVATYPE_ENUM:
+      return NULL;
+    case JAVATYPE_MESSAGE:
+      return NULL;
 
-    // No default because we want the compiler to complain if any new
-    // JavaTypes are added.
+      // No default because we want the compiler to complain if any new
+      // JavaTypes are added.
   }
 
   GOOGLE_LOG(FATAL) << "Can't get here.";
@@ -432,30 +454,59 @@
   return BoxedPrimitiveTypeName(GetJavaType(descriptor));
 }
 
+std::string GetOneofStoredType(const FieldDescriptor* field) {
+  const JavaType javaType = GetJavaType(field);
+  switch (javaType) {
+    case JAVATYPE_ENUM:
+      return "java.lang.Integer";
+    case JAVATYPE_MESSAGE:
+      return ClassName(field->message_type());
+    default:
+      return BoxedPrimitiveTypeName(javaType);
+  }
+}
 
 const char* FieldTypeName(FieldDescriptor::Type field_type) {
   switch (field_type) {
-    case FieldDescriptor::TYPE_INT32   : return "INT32";
-    case FieldDescriptor::TYPE_UINT32  : return "UINT32";
-    case FieldDescriptor::TYPE_SINT32  : return "SINT32";
-    case FieldDescriptor::TYPE_FIXED32 : return "FIXED32";
-    case FieldDescriptor::TYPE_SFIXED32: return "SFIXED32";
-    case FieldDescriptor::TYPE_INT64   : return "INT64";
-    case FieldDescriptor::TYPE_UINT64  : return "UINT64";
-    case FieldDescriptor::TYPE_SINT64  : return "SINT64";
-    case FieldDescriptor::TYPE_FIXED64 : return "FIXED64";
-    case FieldDescriptor::TYPE_SFIXED64: return "SFIXED64";
-    case FieldDescriptor::TYPE_FLOAT   : return "FLOAT";
-    case FieldDescriptor::TYPE_DOUBLE  : return "DOUBLE";
-    case FieldDescriptor::TYPE_BOOL    : return "BOOL";
-    case FieldDescriptor::TYPE_STRING  : return "STRING";
-    case FieldDescriptor::TYPE_BYTES   : return "BYTES";
-    case FieldDescriptor::TYPE_ENUM    : return "ENUM";
-    case FieldDescriptor::TYPE_GROUP   : return "GROUP";
-    case FieldDescriptor::TYPE_MESSAGE : return "MESSAGE";
+    case FieldDescriptor::TYPE_INT32:
+      return "INT32";
+    case FieldDescriptor::TYPE_UINT32:
+      return "UINT32";
+    case FieldDescriptor::TYPE_SINT32:
+      return "SINT32";
+    case FieldDescriptor::TYPE_FIXED32:
+      return "FIXED32";
+    case FieldDescriptor::TYPE_SFIXED32:
+      return "SFIXED32";
+    case FieldDescriptor::TYPE_INT64:
+      return "INT64";
+    case FieldDescriptor::TYPE_UINT64:
+      return "UINT64";
+    case FieldDescriptor::TYPE_SINT64:
+      return "SINT64";
+    case FieldDescriptor::TYPE_FIXED64:
+      return "FIXED64";
+    case FieldDescriptor::TYPE_SFIXED64:
+      return "SFIXED64";
+    case FieldDescriptor::TYPE_FLOAT:
+      return "FLOAT";
+    case FieldDescriptor::TYPE_DOUBLE:
+      return "DOUBLE";
+    case FieldDescriptor::TYPE_BOOL:
+      return "BOOL";
+    case FieldDescriptor::TYPE_STRING:
+      return "STRING";
+    case FieldDescriptor::TYPE_BYTES:
+      return "BYTES";
+    case FieldDescriptor::TYPE_ENUM:
+      return "ENUM";
+    case FieldDescriptor::TYPE_GROUP:
+      return "GROUP";
+    case FieldDescriptor::TYPE_MESSAGE:
+      return "MESSAGE";
 
-    // No default because we want the compiler to complain if any new
-    // types are added.
+      // No default because we want the compiler to complain if any new
+      // types are added.
   }
 
   GOOGLE_LOG(FATAL) << "Can't get here.";
@@ -517,8 +568,8 @@
         if (field->has_default_value()) {
           // See comments in Internal.java for gory details.
           return strings::Substitute(
-            "com.google.protobuf.Internal.bytesDefaultValue(\"$0\")",
-            CEscape(field->default_value_string()));
+              "com.google.protobuf.Internal.bytesDefaultValue(\"$0\")",
+              CEscape(field->default_value_string()));
         } else {
           return "com.google.protobuf.ByteString.EMPTY";
         }
@@ -536,14 +587,14 @@
 
     case FieldDescriptor::CPPTYPE_ENUM:
       return name_resolver->GetClassName(field->enum_type(), immutable) + "." +
-          field->default_value_enum()->name();
+             field->default_value_enum()->name();
 
     case FieldDescriptor::CPPTYPE_MESSAGE:
       return name_resolver->GetClassName(field->message_type(), immutable) +
-          ".getDefaultInstance()";
+             ".getDefaultInstance()";
 
-    // No default because we want the compiler to complain if any new
-    // types are added.
+      // No default because we want the compiler to complain if any new
+      // types are added.
   }
 
   GOOGLE_LOG(FATAL) << "Can't get here.";
@@ -574,8 +625,8 @@
     case FieldDescriptor::CPPTYPE_MESSAGE:
       return false;
 
-    // No default because we want the compiler to complain if any new
-    // types are added.
+      // No default because we want the compiler to complain if any new
+      // types are added.
   }
 
   GOOGLE_LOG(FATAL) << "Can't get here.";
@@ -588,41 +639,17 @@
 }
 
 const char* bit_masks[] = {
-  "0x00000001",
-  "0x00000002",
-  "0x00000004",
-  "0x00000008",
-  "0x00000010",
-  "0x00000020",
-  "0x00000040",
-  "0x00000080",
+    "0x00000001", "0x00000002", "0x00000004", "0x00000008",
+    "0x00000010", "0x00000020", "0x00000040", "0x00000080",
 
-  "0x00000100",
-  "0x00000200",
-  "0x00000400",
-  "0x00000800",
-  "0x00001000",
-  "0x00002000",
-  "0x00004000",
-  "0x00008000",
+    "0x00000100", "0x00000200", "0x00000400", "0x00000800",
+    "0x00001000", "0x00002000", "0x00004000", "0x00008000",
 
-  "0x00010000",
-  "0x00020000",
-  "0x00040000",
-  "0x00080000",
-  "0x00100000",
-  "0x00200000",
-  "0x00400000",
-  "0x00800000",
+    "0x00010000", "0x00020000", "0x00040000", "0x00080000",
+    "0x00100000", "0x00200000", "0x00400000", "0x00800000",
 
-  "0x01000000",
-  "0x02000000",
-  "0x04000000",
-  "0x08000000",
-  "0x10000000",
-  "0x20000000",
-  "0x40000000",
-  "0x80000000",
+    "0x01000000", "0x02000000", "0x04000000", "0x08000000",
+    "0x10000000", "0x20000000", "0x40000000", "0x80000000",
 };
 
 std::string GetBitFieldName(int index) {
@@ -693,18 +720,27 @@
 
 bool IsReferenceType(JavaType type) {
   switch (type) {
-    case JAVATYPE_INT    : return false;
-    case JAVATYPE_LONG   : return false;
-    case JAVATYPE_FLOAT  : return false;
-    case JAVATYPE_DOUBLE : return false;
-    case JAVATYPE_BOOLEAN: return false;
-    case JAVATYPE_STRING : return true;
-    case JAVATYPE_BYTES  : return true;
-    case JAVATYPE_ENUM   : return true;
-    case JAVATYPE_MESSAGE: return true;
+    case JAVATYPE_INT:
+      return false;
+    case JAVATYPE_LONG:
+      return false;
+    case JAVATYPE_FLOAT:
+      return false;
+    case JAVATYPE_DOUBLE:
+      return false;
+    case JAVATYPE_BOOLEAN:
+      return false;
+    case JAVATYPE_STRING:
+      return true;
+    case JAVATYPE_BYTES:
+      return true;
+    case JAVATYPE_ENUM:
+      return true;
+    case JAVATYPE_MESSAGE:
+      return true;
 
-    // No default because we want the compiler to complain if any new
-    // JavaTypes are added.
+      // No default because we want the compiler to complain if any new
+      // JavaTypes are added.
   }
 
   GOOGLE_LOG(FATAL) << "Can't get here.";
@@ -713,29 +749,46 @@
 
 const char* GetCapitalizedType(const FieldDescriptor* field, bool immutable) {
   switch (GetType(field)) {
-    case FieldDescriptor::TYPE_INT32   : return "Int32";
-    case FieldDescriptor::TYPE_UINT32  : return "UInt32";
-    case FieldDescriptor::TYPE_SINT32  : return "SInt32";
-    case FieldDescriptor::TYPE_FIXED32 : return "Fixed32";
-    case FieldDescriptor::TYPE_SFIXED32: return "SFixed32";
-    case FieldDescriptor::TYPE_INT64   : return "Int64";
-    case FieldDescriptor::TYPE_UINT64  : return "UInt64";
-    case FieldDescriptor::TYPE_SINT64  : return "SInt64";
-    case FieldDescriptor::TYPE_FIXED64 : return "Fixed64";
-    case FieldDescriptor::TYPE_SFIXED64: return "SFixed64";
-    case FieldDescriptor::TYPE_FLOAT   : return "Float";
-    case FieldDescriptor::TYPE_DOUBLE  : return "Double";
-    case FieldDescriptor::TYPE_BOOL    : return "Bool";
-    case FieldDescriptor::TYPE_STRING  : return "String";
-    case FieldDescriptor::TYPE_BYTES   : {
+    case FieldDescriptor::TYPE_INT32:
+      return "Int32";
+    case FieldDescriptor::TYPE_UINT32:
+      return "UInt32";
+    case FieldDescriptor::TYPE_SINT32:
+      return "SInt32";
+    case FieldDescriptor::TYPE_FIXED32:
+      return "Fixed32";
+    case FieldDescriptor::TYPE_SFIXED32:
+      return "SFixed32";
+    case FieldDescriptor::TYPE_INT64:
+      return "Int64";
+    case FieldDescriptor::TYPE_UINT64:
+      return "UInt64";
+    case FieldDescriptor::TYPE_SINT64:
+      return "SInt64";
+    case FieldDescriptor::TYPE_FIXED64:
+      return "Fixed64";
+    case FieldDescriptor::TYPE_SFIXED64:
+      return "SFixed64";
+    case FieldDescriptor::TYPE_FLOAT:
+      return "Float";
+    case FieldDescriptor::TYPE_DOUBLE:
+      return "Double";
+    case FieldDescriptor::TYPE_BOOL:
+      return "Bool";
+    case FieldDescriptor::TYPE_STRING:
+      return "String";
+    case FieldDescriptor::TYPE_BYTES: {
       return "Bytes";
     }
-    case FieldDescriptor::TYPE_ENUM    : return "Enum";
-    case FieldDescriptor::TYPE_GROUP   : return "Group";
-    case FieldDescriptor::TYPE_MESSAGE : return "Message";
+    case FieldDescriptor::TYPE_ENUM:
+      return "Enum";
+    case FieldDescriptor::TYPE_GROUP:
+      return "Group";
+    case FieldDescriptor::TYPE_MESSAGE:
+      return "Message";
 
-    // No default because we want the compiler to complain if any new
-    // types are added.
+      // No default because we want the compiler to complain if any new
+      // types are added.
   }
 
   GOOGLE_LOG(FATAL) << "Can't get here.";
@@ -746,29 +799,47 @@
 // returns -1.
 int FixedSize(FieldDescriptor::Type type) {
   switch (type) {
-    case FieldDescriptor::TYPE_INT32   : return -1;
-    case FieldDescriptor::TYPE_INT64   : return -1;
-    case FieldDescriptor::TYPE_UINT32  : return -1;
-    case FieldDescriptor::TYPE_UINT64  : return -1;
-    case FieldDescriptor::TYPE_SINT32  : return -1;
-    case FieldDescriptor::TYPE_SINT64  : return -1;
-    case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size;
-    case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size;
-    case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size;
-    case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size;
-    case FieldDescriptor::TYPE_FLOAT   : return WireFormatLite::kFloatSize;
-    case FieldDescriptor::TYPE_DOUBLE  : return WireFormatLite::kDoubleSize;
+    case FieldDescriptor::TYPE_INT32:
+      return -1;
+    case FieldDescriptor::TYPE_INT64:
+      return -1;
+    case FieldDescriptor::TYPE_UINT32:
+      return -1;
+    case FieldDescriptor::TYPE_UINT64:
+      return -1;
+    case FieldDescriptor::TYPE_SINT32:
+      return -1;
+    case FieldDescriptor::TYPE_SINT64:
+      return -1;
+    case FieldDescriptor::TYPE_FIXED32:
+      return WireFormatLite::kFixed32Size;
+    case FieldDescriptor::TYPE_FIXED64:
+      return WireFormatLite::kFixed64Size;
+    case FieldDescriptor::TYPE_SFIXED32:
+      return WireFormatLite::kSFixed32Size;
+    case FieldDescriptor::TYPE_SFIXED64:
+      return WireFormatLite::kSFixed64Size;
+    case FieldDescriptor::TYPE_FLOAT:
+      return WireFormatLite::kFloatSize;
+    case FieldDescriptor::TYPE_DOUBLE:
+      return WireFormatLite::kDoubleSize;
 
-    case FieldDescriptor::TYPE_BOOL    : return WireFormatLite::kBoolSize;
-    case FieldDescriptor::TYPE_ENUM    : return -1;
+    case FieldDescriptor::TYPE_BOOL:
+      return WireFormatLite::kBoolSize;
+    case FieldDescriptor::TYPE_ENUM:
+      return -1;
 
-    case FieldDescriptor::TYPE_STRING  : return -1;
-    case FieldDescriptor::TYPE_BYTES   : return -1;
-    case FieldDescriptor::TYPE_GROUP   : return -1;
-    case FieldDescriptor::TYPE_MESSAGE : return -1;
+    case FieldDescriptor::TYPE_STRING:
+      return -1;
+    case FieldDescriptor::TYPE_BYTES:
+      return -1;
+    case FieldDescriptor::TYPE_GROUP:
+      return -1;
+    case FieldDescriptor::TYPE_MESSAGE:
+      return -1;
 
-    // No default because we want the compiler to complain if any new
-    // types are added.
+      // No default because we want the compiler to complain if any new
+      // types are added.
   }
   GOOGLE_LOG(FATAL) << "Can't get here.";
   return -1;
@@ -778,7 +849,7 @@
 // and return it. The caller should delete the returned array.
 const FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) {
   const FieldDescriptor** fields =
-    new const FieldDescriptor*[descriptor->field_count()];
+      new const FieldDescriptor*[descriptor->field_count()];
   for (int i = 0; i < descriptor->field_count(); i++) {
     fields[i] = descriptor->field(i);
   }
diff --git a/src/google/protobuf/compiler/java/java_helpers.h b/src/google/protobuf/compiler/java/java_helpers.h
index 7bdd09f..3d36ec4 100644
--- a/src/google/protobuf/compiler/java/java_helpers.h
+++ b/src/google/protobuf/compiler/java/java_helpers.h
@@ -157,10 +157,14 @@
          descriptor->file()->name() == "google/protobuf/descriptor.proto";
 }
 
+// Returns the stored type string used by the experimental runtime for oneof
+// fields.
+std::string GetOneofStoredType(const FieldDescriptor* field);
+
 
 // Whether we should generate multiple java files for messages.
-inline bool MultipleJavaFiles(
-    const FileDescriptor* descriptor, bool immutable) {
+inline bool MultipleJavaFiles(const FileDescriptor* descriptor,
+                              bool immutable) {
   return descriptor->options().java_multiple_files();
 }
 
@@ -245,24 +249,19 @@
 // Does this message class have descriptor and reflection methods?
 inline bool HasDescriptorMethods(const Descriptor* descriptor,
                                  bool enforce_lite) {
-  return !enforce_lite &&
-         descriptor->file()->options().optimize_for() !=
-             FileOptions::LITE_RUNTIME;
+  return !enforce_lite;
 }
 inline bool HasDescriptorMethods(const EnumDescriptor* descriptor,
                                  bool enforce_lite) {
-  return !enforce_lite &&
-         descriptor->file()->options().optimize_for() !=
-             FileOptions::LITE_RUNTIME;
+  return !enforce_lite;
 }
 inline bool HasDescriptorMethods(const FileDescriptor* descriptor,
                                  bool enforce_lite) {
-  return !enforce_lite &&
-         descriptor->options().optimize_for() != FileOptions::LITE_RUNTIME;
+  return !enforce_lite;
 }
 
 // Should we generate generic services for this file?
-inline bool HasGenericServices(const FileDescriptor *file, bool enforce_lite) {
+inline bool HasGenericServices(const FileDescriptor* file, bool enforce_lite) {
   return file->service_count() > 0 &&
          HasDescriptorMethods(file, enforce_lite) &&
          file->options().java_generic_services();
@@ -399,7 +398,7 @@
 
 inline bool CheckUtf8(const FieldDescriptor* descriptor) {
   return descriptor->file()->syntax() == FileDescriptor::SYNTAX_PROTO3 ||
-      descriptor->file()->options().java_string_check_utf8();
+         descriptor->file()->options().java_string_check_utf8();
 }
 
 inline std::string GeneratedCodeVersionSuffix() {
diff --git a/src/google/protobuf/compiler/java/java_map_field.cc b/src/google/protobuf/compiler/java/java_map_field.cc
index a8b1074..5353745 100644
--- a/src/google/protobuf/compiler/java/java_map_field.cc
+++ b/src/google/protobuf/compiler/java/java_map_field.cc
@@ -96,10 +96,14 @@
       boxed_key_type.substr(boxed_key_type.rfind('.') + 1);
   (*variables)["key_wire_type"] = WireType(key);
   (*variables)["key_default_value"] = DefaultValue(key, true, name_resolver);
-  (*variables)["key_null_check"] = IsReferenceType(keyJavaType) ?
-      "if (key == null) { throw new java.lang.NullPointerException(); }" : "";
-  (*variables)["value_null_check"] = IsReferenceType(valueJavaType) ?
-      "if (value == null) { throw new java.lang.NullPointerException(); }" : "";
+  (*variables)["key_null_check"] =
+      IsReferenceType(keyJavaType)
+          ? "if (key == null) { throw new java.lang.NullPointerException(); }"
+          : "";
+  (*variables)["value_null_check"] =
+      IsReferenceType(valueJavaType)
+          ? "if (value == null) { throw new java.lang.NullPointerException(); }"
+          : "";
   if (valueJavaType == JAVATYPE_ENUM) {
     // We store enums as Integers internally.
     (*variables)["value_type"] = "int";
@@ -130,8 +134,8 @@
       (*variables)["boxed_key_type"] + ", " + (*variables)["boxed_value_type"];
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
-  (*variables)["deprecation"] = descriptor->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  (*variables)["deprecation"] =
+      descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
   (*variables)["on_changed"] = "onChanged();";
 
   // For repeated fields, one bit is used for whether the array is immutable
@@ -141,62 +145,51 @@
   (*variables)["set_mutable_bit_parser"] =
       GenerateSetBitMutableLocal(builderBitIndex);
 
-  (*variables)["default_entry"] = (*variables)["capitalized_name"] +
-      "DefaultEntryHolder.defaultEntry";
+  (*variables)["default_entry"] =
+      (*variables)["capitalized_name"] + "DefaultEntryHolder.defaultEntry";
   (*variables)["map_field_parameter"] = (*variables)["default_entry"];
   (*variables)["descriptor"] =
-      name_resolver->GetImmutableClassName(descriptor->file()) +
-      ".internal_" + UniqueFileScopeIdentifier(descriptor->message_type()) +
-      "_descriptor, ";
+      name_resolver->GetImmutableClassName(descriptor->file()) + ".internal_" +
+      UniqueFileScopeIdentifier(descriptor->message_type()) + "_descriptor, ";
   (*variables)["ver"] = GeneratedCodeVersionSuffix();
 }
 
 }  // namespace
 
-ImmutableMapFieldGenerator::
-ImmutableMapFieldGenerator(const FieldDescriptor* descriptor,
-                                       int messageBitIndex,
-                                       int builderBitIndex,
-                                       Context* context)
-  : descriptor_(descriptor), name_resolver_(context->GetNameResolver())  {
+ImmutableMapFieldGenerator::ImmutableMapFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : descriptor_(descriptor), name_resolver_(context->GetNameResolver()) {
   SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
-                      context->GetFieldGeneratorInfo(descriptor),
-                      context, &variables_);
+                      context->GetFieldGeneratorInfo(descriptor), context,
+                      &variables_);
 }
 
-ImmutableMapFieldGenerator::
-~ImmutableMapFieldGenerator() {}
+ImmutableMapFieldGenerator::~ImmutableMapFieldGenerator() {}
 
-int ImmutableMapFieldGenerator::GetNumBitsForMessage() const {
-  return 0;
-}
+int ImmutableMapFieldGenerator::GetNumBitsForMessage() const { return 0; }
 
-int ImmutableMapFieldGenerator::GetNumBitsForBuilder() const {
-  return 1;
-}
+int ImmutableMapFieldGenerator::GetNumBitsForBuilder() const { return 1; }
 
-void ImmutableMapFieldGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void ImmutableMapFieldGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecation$int ${$get$capitalized_name$Count$}$();\n");
+  printer->Print(variables_,
+                 "$deprecation$int ${$get$capitalized_name$Count$}$();\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecation$boolean ${$contains$capitalized_name$$}$(\n"
-      "    $key_type$ key);\n");
+  printer->Print(variables_,
+                 "$deprecation$boolean ${$contains$capitalized_name$$}$(\n"
+                 "    $key_type$ key);\n");
   printer->Annotate("{", "}", descriptor_);
   if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use {@link #get$capitalized_name$Map()} instead.\n"
-        " */\n"
-        "@java.lang.Deprecated\n"
-        "java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "${$get$capitalized_name$$}$();\n");
+    printer->Print(variables_,
+                   "/**\n"
+                   " * Use {@link #get$capitalized_name$Map()} instead.\n"
+                   " */\n"
+                   "@java.lang.Deprecated\n"
+                   "java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+                   "${$get$capitalized_name$$}$();\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
@@ -228,63 +221,55 @@
           "${$get$capitalized_name$Value$}$();\n");
       printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$java.util.Map<$type_parameters$>\n"
-          "${$get$capitalized_name$ValueMap$}$();\n");
+      printer->Print(variables_,
+                     "$deprecation$java.util.Map<$type_parameters$>\n"
+                     "${$get$capitalized_name$ValueMap$}$();\n");
       printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$\n"
-          "$value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
-          "    $key_type$ key,\n"
-          "    $value_type$ defaultValue);\n");
+      printer->Print(variables_,
+                     "$deprecation$\n"
+                     "$value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
+                     "    $key_type$ key,\n"
+                     "    $value_type$ defaultValue);\n");
       printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$\n"
-          "$value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n"
-          "    $key_type$ key);\n");
+      printer->Print(variables_,
+                     "$deprecation$\n"
+                     "$value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n"
+                     "    $key_type$ key);\n");
       printer->Annotate("{", "}", descriptor_);
     }
   } else {
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use {@link #get$capitalized_name$Map()} instead.\n"
-        " */\n"
-        "@java.lang.Deprecated\n"
-        "java.util.Map<$type_parameters$>\n"
-        "${$get$capitalized_name$$}$();\n");
+    printer->Print(variables_,
+                   "/**\n"
+                   " * Use {@link #get$capitalized_name$Map()} instead.\n"
+                   " */\n"
+                   "@java.lang.Deprecated\n"
+                   "java.util.Map<$type_parameters$>\n"
+                   "${$get$capitalized_name$$}$();\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$java.util.Map<$type_parameters$>\n"
-        "${$get$capitalized_name$Map$}$();\n");
+    printer->Print(variables_,
+                   "$deprecation$java.util.Map<$type_parameters$>\n"
+                   "${$get$capitalized_name$Map$}$();\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "$value_type$ ${$get$capitalized_name$OrDefault$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_type$ defaultValue);\n");
+    printer->Print(variables_,
+                   "$deprecation$\n"
+                   "$value_type$ ${$get$capitalized_name$OrDefault$}$(\n"
+                   "    $key_type$ key,\n"
+                   "    $value_type$ defaultValue);\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "$value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key);\n");
+    printer->Print(variables_,
+                   "$deprecation$\n"
+                   "$value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
+                   "    $key_type$ key);\n");
     printer->Annotate("{", "}", descriptor_);
   }
 }
 
-void ImmutableMapFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutableMapFieldGenerator::GenerateMembers(io::Printer* printer) const {
   printer->Print(
       variables_,
       "private static final class $capitalized_name$DefaultEntryHolder {\n"
@@ -298,18 +283,17 @@
       "              $value_wire_type$,\n"
       "              $value_default_value$);\n"
       "}\n");
-  printer->Print(
-      variables_,
-      "private com.google.protobuf.MapField<\n"
-      "    $type_parameters$> $name$_;\n"
-      "private com.google.protobuf.MapField<$type_parameters$>\n"
-      "internalGet$capitalized_name$() {\n"
-      "  if ($name$_ == null) {\n"
-      "    return com.google.protobuf.MapField.emptyMapField(\n"
-      "        $map_field_parameter$);\n"
-      "  }\n"
-      "  return $name$_;\n"
-      "}\n");
+  printer->Print(variables_,
+                 "private com.google.protobuf.MapField<\n"
+                 "    $type_parameters$> $name$_;\n"
+                 "private com.google.protobuf.MapField<$type_parameters$>\n"
+                 "internalGet$capitalized_name$() {\n"
+                 "  if ($name$_ == null) {\n"
+                 "    return com.google.protobuf.MapField.emptyMapField(\n"
+                 "        $map_field_parameter$);\n"
+                 "  }\n"
+                 "  return $name$_;\n"
+                 "}\n");
   if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
     printer->Print(
         variables_,
@@ -333,53 +317,50 @@
   GenerateMapGetters(printer);
 }
 
-void ImmutableMapFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "private com.google.protobuf.MapField<\n"
-      "    $type_parameters$> $name$_;\n"
-      "private com.google.protobuf.MapField<$type_parameters$>\n"
-      "internalGet$capitalized_name$() {\n"
-      "  if ($name$_ == null) {\n"
-      "    return com.google.protobuf.MapField.emptyMapField(\n"
-      "        $map_field_parameter$);\n"
-      "  }\n"
-      "  return $name$_;\n"
-      "}\n"
-      "private com.google.protobuf.MapField<$type_parameters$>\n"
-      "internalGetMutable$capitalized_name$() {\n"
-      "  $on_changed$;\n"
-      "  if ($name$_ == null) {\n"
-      "    $name$_ = com.google.protobuf.MapField.newMapField(\n"
-      "        $map_field_parameter$);\n"
-      "  }\n"
-      "  if (!$name$_.isMutable()) {\n"
-      "    $name$_ = $name$_.copy();\n"
-      "  }\n"
-      "  return $name$_;\n"
-      "}\n");
+void ImmutableMapFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "private com.google.protobuf.MapField<\n"
+                 "    $type_parameters$> $name$_;\n"
+                 "private com.google.protobuf.MapField<$type_parameters$>\n"
+                 "internalGet$capitalized_name$() {\n"
+                 "  if ($name$_ == null) {\n"
+                 "    return com.google.protobuf.MapField.emptyMapField(\n"
+                 "        $map_field_parameter$);\n"
+                 "  }\n"
+                 "  return $name$_;\n"
+                 "}\n"
+                 "private com.google.protobuf.MapField<$type_parameters$>\n"
+                 "internalGetMutable$capitalized_name$() {\n"
+                 "  $on_changed$;\n"
+                 "  if ($name$_ == null) {\n"
+                 "    $name$_ = com.google.protobuf.MapField.newMapField(\n"
+                 "        $map_field_parameter$);\n"
+                 "  }\n"
+                 "  if (!$name$_.isMutable()) {\n"
+                 "    $name$_ = $name$_.copy();\n"
+                 "  }\n"
+                 "  return $name$_;\n"
+                 "}\n");
   GenerateMapGetters(printer);
-  printer->Print(
-      variables_,
-      "$deprecation$\n"
-      "public Builder ${$clear$capitalized_name$$}$() {\n"
-      "  internalGetMutable$capitalized_name$().getMutableMap()\n"
-      "      .clear();\n"
-      "  return this;\n"
-      "}\n");
+  printer->Print(variables_,
+                 "$deprecation$\n"
+                 "public Builder ${$clear$capitalized_name$$}$() {\n"
+                 "  internalGetMutable$capitalized_name$().getMutableMap()\n"
+                 "      .clear();\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecation$\n"
-      "public Builder ${$remove$capitalized_name$$}$(\n"
-      "    $key_type$ key) {\n"
-      "  $key_null_check$\n"
-      "  internalGetMutable$capitalized_name$().getMutableMap()\n"
-      "      .remove(key);\n"
-      "  return this;\n"
-      "}\n");
+  printer->Print(variables_,
+                 "$deprecation$\n"
+                 "public Builder ${$remove$capitalized_name$$}$(\n"
+                 "    $key_type$ key) {\n"
+                 "  $key_null_check$\n"
+                 "  internalGetMutable$capitalized_name$().getMutableMap()\n"
+                 "      .remove(key);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
     printer->Print(
@@ -465,41 +446,38 @@
         "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$"
-        "public Builder ${$put$capitalized_name$$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_type$ value) {\n"
-        "  $key_null_check$\n"
-        "  $value_null_check$\n"
-        "  internalGetMutable$capitalized_name$().getMutableMap()\n"
-        "      .put(key, value);\n"
-        "  return this;\n"
-        "}\n");
+    printer->Print(variables_,
+                   "$deprecation$"
+                   "public Builder ${$put$capitalized_name$$}$(\n"
+                   "    $key_type$ key,\n"
+                   "    $value_type$ value) {\n"
+                   "  $key_null_check$\n"
+                   "  $value_null_check$\n"
+                   "  internalGetMutable$capitalized_name$().getMutableMap()\n"
+                   "      .put(key, value);\n"
+                   "  return this;\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "public Builder ${$putAll$capitalized_name$$}$(\n"
-        "    java.util.Map<$type_parameters$> values) {\n"
-        "  internalGetMutable$capitalized_name$().getMutableMap()\n"
-        "      .putAll(values);\n"
-        "  return this;\n"
-        "}\n");
+    printer->Print(variables_,
+                   "$deprecation$\n"
+                   "public Builder ${$putAll$capitalized_name$$}$(\n"
+                   "    java.util.Map<$type_parameters$> values) {\n"
+                   "  internalGetMutable$capitalized_name$().getMutableMap()\n"
+                   "      .putAll(values);\n"
+                   "  return this;\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 }
 
-void ImmutableMapFieldGenerator::
-GenerateMapGetters(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "$deprecation$\n"
-      "public int ${$get$capitalized_name$Count$}$() {\n"
-      "  return internalGet$capitalized_name$().getMap().size();\n"
-      "}\n");
+void ImmutableMapFieldGenerator::GenerateMapGetters(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "$deprecation$\n"
+                 "public int ${$get$capitalized_name$Count$}$() {\n"
+                 "  return internalGet$capitalized_name$().getMap().size();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(
@@ -512,26 +490,24 @@
       "}\n");
   printer->Annotate("{", "}", descriptor_);
   if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use {@link #get$capitalized_name$Map()} instead.\n"
-        " */\n"
-        "@java.lang.Deprecated\n"
-        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "${$get$capitalized_name$$}$() {\n"
-        "  return get$capitalized_name$Map();\n"
-        "}\n");
+    printer->Print(variables_,
+                   "/**\n"
+                   " * Use {@link #get$capitalized_name$Map()} instead.\n"
+                   " */\n"
+                   "@java.lang.Deprecated\n"
+                   "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+                   "${$get$capitalized_name$$}$() {\n"
+                   "  return get$capitalized_name$Map();\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "${$get$capitalized_name$Map$}$() {\n"
-        "  return internalGetAdapted$capitalized_name$Map(\n"
-        "      internalGet$capitalized_name$().getMap());"
-        "}\n");
+    printer->Print(variables_,
+                   "$deprecation$\n"
+                   "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+                   "${$get$capitalized_name$Map$}$() {\n"
+                   "  return internalGetAdapted$capitalized_name$Map(\n"
+                   "      internalGet$capitalized_name$().getMap());"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
@@ -614,25 +590,23 @@
       printer->Annotate("{", "}", descriptor_);
     }
   } else {
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use {@link #get$capitalized_name$Map()} instead.\n"
-        " */\n"
-        "@java.lang.Deprecated\n"
-        "public java.util.Map<$type_parameters$> "
-        "${$get$capitalized_name$$}$() {\n"
-        "  return get$capitalized_name$Map();\n"
-        "}\n");
+    printer->Print(variables_,
+                   "/**\n"
+                   " * Use {@link #get$capitalized_name$Map()} instead.\n"
+                   " */\n"
+                   "@java.lang.Deprecated\n"
+                   "public java.util.Map<$type_parameters$> "
+                   "${$get$capitalized_name$$}$() {\n"
+                   "  return get$capitalized_name$Map();\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "public java.util.Map<$type_parameters$> "
-        "${$get$capitalized_name$Map$}$() {\n"
-        "  return internalGet$capitalized_name$().getMap();\n"
-        "}\n");
+    printer->Print(variables_,
+                   "$deprecation$\n"
+                   "public java.util.Map<$type_parameters$> "
+                   "${$get$capitalized_name$Map$}$() {\n"
+                   "  return internalGet$capitalized_name$().getMap();\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
@@ -648,65 +622,60 @@
         "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "public $value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$type_parameters$> map =\n"
-        "      internalGet$capitalized_name$().getMap();\n"
-        "  if (!map.containsKey(key)) {\n"
-        "    throw new java.lang.IllegalArgumentException();\n"
-        "  }\n"
-        "  return map.get(key);\n"
-        "}\n");
+    printer->Print(variables_,
+                   "$deprecation$\n"
+                   "public $value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
+                   "    $key_type$ key) {\n"
+                   "  $key_null_check$\n"
+                   "  java.util.Map<$type_parameters$> map =\n"
+                   "      internalGet$capitalized_name$().getMap();\n"
+                   "  if (!map.containsKey(key)) {\n"
+                   "    throw new java.lang.IllegalArgumentException();\n"
+                   "  }\n"
+                   "  return map.get(key);\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 }
 
-void ImmutableMapFieldGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+void ImmutableMapFieldGenerator::GenerateFieldBuilderInitializationCode(
+    io::Printer* printer) const {
   // Nothing to initialize.
 }
 
-void ImmutableMapFieldGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void ImmutableMapFieldGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   // Nothing to initialize.
 }
 
-void ImmutableMapFieldGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "internalGetMutable$capitalized_name$().clear();\n");
+void ImmutableMapFieldGenerator::GenerateBuilderClearCode(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "internalGetMutable$capitalized_name$().clear();\n");
 }
 
-void ImmutableMapFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "internalGetMutable$capitalized_name$().mergeFrom(\n"
-      "    other.internalGet$capitalized_name$());\n");
+void ImmutableMapFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "internalGetMutable$capitalized_name$().mergeFrom(\n"
+                 "    other.internalGet$capitalized_name$());\n");
 }
 
-void ImmutableMapFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "result.$name$_ = internalGet$capitalized_name$();\n"
-      "result.$name$_.makeImmutable();\n");
+void ImmutableMapFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "result.$name$_ = internalGet$capitalized_name$();\n"
+                 "result.$name$_.makeImmutable();\n");
 }
 
-void ImmutableMapFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "if (!$get_mutable_bit_parser$) {\n"
-      "  $name$_ = com.google.protobuf.MapField.newMapField(\n"
-      "      $map_field_parameter$);\n"
-      "  $set_mutable_bit_parser$;\n"
-      "}\n");
+void ImmutableMapFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "if (!$get_mutable_bit_parser$) {\n"
+                 "  $name$_ = com.google.protobuf.MapField.newMapField(\n"
+                 "      $map_field_parameter$);\n"
+                 "  $set_mutable_bit_parser$;\n"
+                 "}\n");
   if (!SupportUnknownEnumValue(descriptor_->file()) &&
       GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
     printer->Print(
@@ -733,25 +702,24 @@
   }
 }
 
-void ImmutableMapFieldGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
+void ImmutableMapFieldGenerator::GenerateParsingDoneCode(
+    io::Printer* printer) const {
   // Nothing to do here.
 }
 
-void ImmutableMapFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "com.google.protobuf.GeneratedMessage$ver$\n"
-      "  .serialize$short_key_type$MapTo(\n"
-      "    output,\n"
-      "    internalGet$capitalized_name$(),\n"
-      "    $default_entry$,\n"
-      "    $number$);\n");
+void ImmutableMapFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "com.google.protobuf.GeneratedMessage$ver$\n"
+                 "  .serialize$short_key_type$MapTo(\n"
+                 "    output,\n"
+                 "    internalGet$capitalized_name$(),\n"
+                 "    $default_entry$,\n"
+                 "    $number$);\n");
 }
 
-void ImmutableMapFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
+void ImmutableMapFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
   printer->Print(
       variables_,
       "for (java.util.Map.Entry<$type_parameters$> entry\n"
@@ -766,16 +734,14 @@
       "}\n");
 }
 
-void ImmutableMapFieldGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "if (!internalGet$capitalized_name$().equals(\n"
-      "    other.internalGet$capitalized_name$())) return false;\n");
+void ImmutableMapFieldGenerator::GenerateEqualsCode(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "if (!internalGet$capitalized_name$().equals(\n"
+                 "    other.internalGet$capitalized_name$())) return false;\n");
 }
 
-void ImmutableMapFieldGenerator::
-GenerateHashCode(io::Printer* printer) const {
+void ImmutableMapFieldGenerator::GenerateHashCode(io::Printer* printer) const {
   printer->Print(
       variables_,
       "if (!internalGet$capitalized_name$().getMap().isEmpty()) {\n"
diff --git a/src/google/protobuf/compiler/java/java_map_field.h b/src/google/protobuf/compiler/java/java_map_field.h
index b123b04..2ff1f76 100644
--- a/src/google/protobuf/compiler/java/java_map_field.h
+++ b/src/google/protobuf/compiler/java/java_map_field.h
@@ -40,9 +40,9 @@
 
 class ImmutableMapFieldGenerator : public ImmutableFieldGenerator {
  public:
-  explicit ImmutableMapFieldGenerator(
-      const FieldDescriptor* descriptor, int messageBitIndex,
-      int builderBitIndex, Context* context);
+  explicit ImmutableMapFieldGenerator(const FieldDescriptor* descriptor,
+                                      int messageBitIndex, int builderBitIndex,
+                                      Context* context);
   ~ImmutableMapFieldGenerator();
 
   // implements ImmutableFieldGenerator ---------------------------------------
diff --git a/src/google/protobuf/compiler/java/java_map_field_lite.cc b/src/google/protobuf/compiler/java/java_map_field_lite.cc
index c6ffa5b..9055774 100644
--- a/src/google/protobuf/compiler/java/java_map_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_map_field_lite.cc
@@ -92,10 +92,14 @@
   (*variables)["boxed_key_type"] = TypeName(key, name_resolver, true);
   (*variables)["key_wire_type"] = WireType(key);
   (*variables)["key_default_value"] = DefaultValue(key, true, name_resolver);
-  (*variables)["key_null_check"] = IsReferenceType(keyJavaType) ?
-      "if (key == null) { throw new java.lang.NullPointerException(); }" : "";
-  (*variables)["value_null_check"] = IsReferenceType(valueJavaType) ?
-      "if (value == null) { throw new java.lang.NullPointerException(); }" : "";
+  (*variables)["key_null_check"] =
+      IsReferenceType(keyJavaType)
+          ? "if (key == null) { throw new java.lang.NullPointerException(); }"
+          : "";
+  (*variables)["value_null_check"] =
+      IsReferenceType(valueJavaType)
+          ? "if (value == null) { throw new java.lang.NullPointerException(); }"
+          : "";
 
   if (GetJavaType(value) == JAVATYPE_ENUM) {
     // We store enums as Integers internally.
@@ -127,55 +131,48 @@
       (*variables)["boxed_key_type"] + ", " + (*variables)["boxed_value_type"];
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
-  (*variables)["deprecation"] = descriptor->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  (*variables)["deprecation"] =
+      descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
 
-  (*variables)["default_entry"] = (*variables)["capitalized_name"] +
-      "DefaultEntryHolder.defaultEntry";
+  (*variables)["default_entry"] =
+      (*variables)["capitalized_name"] + "DefaultEntryHolder.defaultEntry";
 }
 
 }  // namespace
 
-ImmutableMapFieldLiteGenerator::
-ImmutableMapFieldLiteGenerator(const FieldDescriptor* descriptor,
-                                       int messageBitIndex,
-                                       Context* context)
-  : descriptor_(descriptor), context_(context),
-    name_resolver_(context->GetNameResolver()){
+ImmutableMapFieldLiteGenerator::ImmutableMapFieldLiteGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, Context* context)
+    : descriptor_(descriptor),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   SetMessageVariables(descriptor, messageBitIndex, 0,
                       context->GetFieldGeneratorInfo(descriptor), context,
                       &variables_);
 }
 
-ImmutableMapFieldLiteGenerator::
-~ImmutableMapFieldLiteGenerator() {}
+ImmutableMapFieldLiteGenerator::~ImmutableMapFieldLiteGenerator() {}
 
-int ImmutableMapFieldLiteGenerator::GetNumBitsForMessage() const {
-  return 0;
-}
+int ImmutableMapFieldLiteGenerator::GetNumBitsForMessage() const { return 0; }
 
-void ImmutableMapFieldLiteGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void ImmutableMapFieldLiteGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecation$int ${$get$capitalized_name$Count$}$();\n");
+  printer->Print(variables_,
+                 "$deprecation$int ${$get$capitalized_name$Count$}$();\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecation$boolean ${$contains$capitalized_name$$}$(\n"
-      "    $key_type$ key);\n");
+  printer->Print(variables_,
+                 "$deprecation$boolean ${$contains$capitalized_name$$}$(\n"
+                 "    $key_type$ key);\n");
   printer->Annotate("{", "}", descriptor_);
   if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use {@link #get$capitalized_name$Map()} instead.\n"
-        " */\n"
-        "@java.lang.Deprecated\n"
-        "java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "${$get$capitalized_name$$}$();\n");
+    printer->Print(variables_,
+                   "/**\n"
+                   " * Use {@link #get$capitalized_name$Map()} instead.\n"
+                   " */\n"
+                   "@java.lang.Deprecated\n"
+                   "java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+                   "${$get$capitalized_name$$}$();\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
@@ -207,63 +204,56 @@
           "${$get$capitalized_name$Value$}$();\n");
       printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$java.util.Map<$type_parameters$>\n"
-          "${$get$capitalized_name$ValueMap$}$();\n");
+      printer->Print(variables_,
+                     "$deprecation$java.util.Map<$type_parameters$>\n"
+                     "${$get$capitalized_name$ValueMap$}$();\n");
       printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$\n"
-          "$value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
-          "    $key_type$ key,\n"
-          "    $value_type$ defaultValue);\n");
+      printer->Print(variables_,
+                     "$deprecation$\n"
+                     "$value_type$ ${$get$capitalized_name$ValueOrDefault$}$(\n"
+                     "    $key_type$ key,\n"
+                     "    $value_type$ defaultValue);\n");
       printer->Annotate("{", "}", descriptor_);
       WriteFieldDocComment(printer, descriptor_);
-      printer->Print(
-          variables_,
-          "$deprecation$\n"
-          "$value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n"
-          "    $key_type$ key);\n");
+      printer->Print(variables_,
+                     "$deprecation$\n"
+                     "$value_type$ ${$get$capitalized_name$ValueOrThrow$}$(\n"
+                     "    $key_type$ key);\n");
       printer->Annotate("{", "}", descriptor_);
     }
   } else {
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use {@link #get$capitalized_name$Map()} instead.\n"
-        " */\n"
-        "@java.lang.Deprecated\n"
-        "java.util.Map<$type_parameters$>\n"
-        "${$get$capitalized_name$$}$();\n");
+    printer->Print(variables_,
+                   "/**\n"
+                   " * Use {@link #get$capitalized_name$Map()} instead.\n"
+                   " */\n"
+                   "@java.lang.Deprecated\n"
+                   "java.util.Map<$type_parameters$>\n"
+                   "${$get$capitalized_name$$}$();\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$java.util.Map<$type_parameters$>\n"
-        "${$get$capitalized_name$Map$}$();\n");
+    printer->Print(variables_,
+                   "$deprecation$java.util.Map<$type_parameters$>\n"
+                   "${$get$capitalized_name$Map$}$();\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "$value_type$ ${$get$capitalized_name$OrDefault$}$(\n"
-        "    $key_type$ key,\n"
-        "    $value_type$ defaultValue);\n");
+    printer->Print(variables_,
+                   "$deprecation$\n"
+                   "$value_type$ ${$get$capitalized_name$OrDefault$}$(\n"
+                   "    $key_type$ key,\n"
+                   "    $value_type$ defaultValue);\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "$deprecation$\n"
-        "$value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key);\n");
+    printer->Print(variables_,
+                   "$deprecation$\n"
+                   "$value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
+                   "    $key_type$ key);\n");
     printer->Annotate("{", "}", descriptor_);
   }
 }
 
-void ImmutableMapFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutableMapFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
   printer->Print(
       variables_,
       "private static final class $capitalized_name$DefaultEntryHolder {\n"
@@ -276,40 +266,37 @@
       "              $value_wire_type$,\n"
       "              $value_default_value$);\n"
       "}\n");
-  printer->Print(
-      variables_,
-      "private com.google.protobuf.MapFieldLite<\n"
-      "    $type_parameters$> $name$_ =\n"
-      "        com.google.protobuf.MapFieldLite.emptyMapField();\n"
-      "private com.google.protobuf.MapFieldLite<$type_parameters$>\n"
-      "internalGet$capitalized_name$() {\n"
-      "  return $name$_;\n"
-      "}\n"
-      "private com.google.protobuf.MapFieldLite<$type_parameters$>\n"
-      "internalGetMutable$capitalized_name$() {\n"
-      "  if (!$name$_.isMutable()) {\n"
-      "    $name$_ = $name$_.mutableCopy();\n"
-      "  }\n"
-      "  return $name$_;\n"
-      "}\n");
-  printer->Print(
-      variables_,
-      "@java.lang.Override\n"
-      "$deprecation$\n"
-      "public int ${$get$capitalized_name$Count$}$() {\n"
-      "  return internalGet$capitalized_name$().size();\n"
-      "}\n");
+  printer->Print(variables_,
+                 "private com.google.protobuf.MapFieldLite<\n"
+                 "    $type_parameters$> $name$_ =\n"
+                 "        com.google.protobuf.MapFieldLite.emptyMapField();\n"
+                 "private com.google.protobuf.MapFieldLite<$type_parameters$>\n"
+                 "internalGet$capitalized_name$() {\n"
+                 "  return $name$_;\n"
+                 "}\n"
+                 "private com.google.protobuf.MapFieldLite<$type_parameters$>\n"
+                 "internalGetMutable$capitalized_name$() {\n"
+                 "  if (!$name$_.isMutable()) {\n"
+                 "    $name$_ = $name$_.mutableCopy();\n"
+                 "  }\n"
+                 "  return $name$_;\n"
+                 "}\n");
+  printer->Print(variables_,
+                 "@java.lang.Override\n"
+                 "$deprecation$\n"
+                 "public int ${$get$capitalized_name$Count$}$() {\n"
+                 "  return internalGet$capitalized_name$().size();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(
-      variables_,
-      "@java.lang.Override\n"
-      "$deprecation$\n"
-      "public boolean ${$contains$capitalized_name$$}$(\n"
-      "    $key_type$ key) {\n"
-      "  $key_null_check$\n"
-      "  return internalGet$capitalized_name$().containsKey(key);\n"
-      "}\n");
+  printer->Print(variables_,
+                 "@java.lang.Override\n"
+                 "$deprecation$\n"
+                 "public boolean ${$contains$capitalized_name$$}$(\n"
+                 "    $key_type$ key) {\n"
+                 "  $key_null_check$\n"
+                 "  return internalGet$capitalized_name$().containsKey(key);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
     printer->Print(
@@ -320,16 +307,15 @@
         "        com.google.protobuf.Internal.MapAdapter.newEnumConverter(\n"
         "            $value_enum_type$.internalGetValueMap(),\n"
         "            $unrecognized_value$);\n");
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use {@link #get$capitalized_name$Map()} instead.\n"
-        " */\n"
-        "@java.lang.Deprecated\n"
-        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "${$get$capitalized_name$$}$() {\n"
-        "  return get$capitalized_name$Map();\n"
-        "}\n");
+    printer->Print(variables_,
+                   "/**\n"
+                   " * Use {@link #get$capitalized_name$Map()} instead.\n"
+                   " */\n"
+                   "@java.lang.Deprecated\n"
+                   "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+                   "${$get$capitalized_name$$}$() {\n"
+                   "  return get$capitalized_name$Map();\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
@@ -433,28 +419,26 @@
       printer->Annotate("{", "}", descriptor_);
     }
   } else {
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use {@link #get$capitalized_name$Map()} instead.\n"
-        " */\n"
-        "@java.lang.Override\n"
-        "@java.lang.Deprecated\n"
-        "public java.util.Map<$type_parameters$> "
-        "${$get$capitalized_name$$}$() {\n"
-        "  return get$capitalized_name$Map();\n"
-        "}\n");
+    printer->Print(variables_,
+                   "/**\n"
+                   " * Use {@link #get$capitalized_name$Map()} instead.\n"
+                   " */\n"
+                   "@java.lang.Override\n"
+                   "@java.lang.Deprecated\n"
+                   "public java.util.Map<$type_parameters$> "
+                   "${$get$capitalized_name$$}$() {\n"
+                   "  return get$capitalized_name$Map();\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "@java.lang.Override\n"
-        "$deprecation$\n"
-        "public java.util.Map<$type_parameters$> "
-        "${$get$capitalized_name$Map$}$() {\n"
-        "  return java.util.Collections.unmodifiableMap(\n"
-        "      internalGet$capitalized_name$());\n"
-        "}\n");
+    printer->Print(variables_,
+                   "@java.lang.Override\n"
+                   "$deprecation$\n"
+                   "public java.util.Map<$type_parameters$> "
+                   "${$get$capitalized_name$Map$}$() {\n"
+                   "  return java.util.Collections.unmodifiableMap(\n"
+                   "      internalGet$capitalized_name$());\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
@@ -471,20 +455,19 @@
         "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "@java.lang.Override\n"
-        "$deprecation$\n"
-        "public $value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$type_parameters$> map =\n"
-        "      internalGet$capitalized_name$();\n"
-        "  if (!map.containsKey(key)) {\n"
-        "    throw new java.lang.IllegalArgumentException();\n"
-        "  }\n"
-        "  return map.get(key);\n"
-        "}\n");
+    printer->Print(variables_,
+                   "@java.lang.Override\n"
+                   "$deprecation$\n"
+                   "public $value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
+                   "    $key_type$ key) {\n"
+                   "  $key_null_check$\n"
+                   "  java.util.Map<$type_parameters$> map =\n"
+                   "      internalGet$capitalized_name$();\n"
+                   "  if (!map.containsKey(key)) {\n"
+                   "    throw new java.lang.IllegalArgumentException();\n"
+                   "  }\n"
+                   "  return map.get(key);\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
@@ -511,25 +494,39 @@
     }
   } else {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "private java.util.Map<$type_parameters$>\n"
-        "getMutable$capitalized_name$Map() {\n"
-        "  return internalGetMutable$capitalized_name$();\n"
-        "}\n");
+    printer->Print(variables_,
+                   "private java.util.Map<$type_parameters$>\n"
+                   "getMutable$capitalized_name$Map() {\n"
+                   "  return internalGetMutable$capitalized_name$();\n"
+                   "}\n");
   }
 }
 
+void ImmutableMapFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
+  printer->Print(variables_,
+                 "\"$name$_\",\n"
+                 "$default_entry$,\n");
+  if (SupportFieldPresence(descriptor_->file()) &&
+      GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
+    PrintEnumVerifierLogic(printer, ValueField(descriptor_), variables_,
+                           /*var_name=*/"$value_enum_type$",
+                           /*terminating_string=*/",\n",
+                           /*enforce_lite=*/context_->EnforceLite());
+  }
+}
 
-void ImmutableMapFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "@java.lang.Override\n"
-      "$deprecation$\n"
-      "public int ${$get$capitalized_name$Count$}$() {\n"
-      "  return instance.get$capitalized_name$Map().size();\n"
-      "}\n");
+void ImmutableMapFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "@java.lang.Override\n"
+                 "$deprecation$\n"
+                 "public int ${$get$capitalized_name$Count$}$() {\n"
+                 "  return instance.get$capitalized_name$Map().size();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(
@@ -542,49 +539,45 @@
       "  return instance.get$capitalized_name$Map().containsKey(key);\n"
       "}\n");
   printer->Annotate("{", "}", descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecation$\n"
-      "public Builder ${$clear$capitalized_name$$}$() {\n"
-      "  copyOnWrite();\n"
-      "  instance.getMutable$capitalized_name$Map().clear();\n"
-      "  return this;\n"
-      "}\n");
+  printer->Print(variables_,
+                 "$deprecation$\n"
+                 "public Builder ${$clear$capitalized_name$$}$() {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.getMutable$capitalized_name$Map().clear();\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(
-      variables_,
-      "$deprecation$\n"
-      "public Builder ${$remove$capitalized_name$$}$(\n"
-      "    $key_type$ key) {\n"
-      "  $key_null_check$\n"
-      "  copyOnWrite();\n"
-      "  instance.getMutable$capitalized_name$Map().remove(key);\n"
-      "  return this;\n"
-      "}\n");
+  printer->Print(variables_,
+                 "$deprecation$\n"
+                 "public Builder ${$remove$capitalized_name$$}$(\n"
+                 "    $key_type$ key) {\n"
+                 "  $key_null_check$\n"
+                 "  copyOnWrite();\n"
+                 "  instance.getMutable$capitalized_name$Map().remove(key);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   if (GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use {@link #get$capitalized_name$Map()} instead.\n"
-        " */\n"
-        "@java.lang.Deprecated\n"
-        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "${$get$capitalized_name$$}$() {\n"
-        "  return get$capitalized_name$Map();\n"
-        "}\n");
+    printer->Print(variables_,
+                   "/**\n"
+                   " * Use {@link #get$capitalized_name$Map()} instead.\n"
+                   " */\n"
+                   "@java.lang.Deprecated\n"
+                   "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+                   "${$get$capitalized_name$$}$() {\n"
+                   "  return get$capitalized_name$Map();\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "@java.lang.Override\n"
-        "$deprecation$\n"
-        "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
-        "${$get$capitalized_name$Map$}$() {\n"
-        "  return java.util.Collections.unmodifiableMap(\n"
-        "      instance.get$capitalized_name$Map());\n"
-        "}\n");
+    printer->Print(variables_,
+                   "@java.lang.Override\n"
+                   "$deprecation$\n"
+                   "public java.util.Map<$boxed_key_type$, $value_enum_type$>\n"
+                   "${$get$capitalized_name$Map$}$() {\n"
+                   "  return java.util.Collections.unmodifiableMap(\n"
+                   "      instance.get$capitalized_name$Map());\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
@@ -719,28 +712,26 @@
       printer->Annotate("{", "}", descriptor_);
     }
   } else {
-    printer->Print(
-        variables_,
-        "/**\n"
-        " * Use {@link #get$capitalized_name$Map()} instead.\n"
-        " */\n"
-        "@java.lang.Override\n"
-        "@java.lang.Deprecated\n"
-        "public java.util.Map<$type_parameters$> "
-        "${$get$capitalized_name$$}$() {\n"
-        "  return get$capitalized_name$Map();\n"
-        "}\n");
+    printer->Print(variables_,
+                   "/**\n"
+                   " * Use {@link #get$capitalized_name$Map()} instead.\n"
+                   " */\n"
+                   "@java.lang.Override\n"
+                   "@java.lang.Deprecated\n"
+                   "public java.util.Map<$type_parameters$> "
+                   "${$get$capitalized_name$$}$() {\n"
+                   "  return get$capitalized_name$Map();\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "@java.lang.Override\n"
-        "$deprecation$"
-        "public java.util.Map<$type_parameters$> "
-        "${$get$capitalized_name$Map$}$() {\n"
-        "  return java.util.Collections.unmodifiableMap(\n"
-        "      instance.get$capitalized_name$Map());\n"
-        "}\n");
+    printer->Print(variables_,
+                   "@java.lang.Override\n"
+                   "$deprecation$"
+                   "public java.util.Map<$type_parameters$> "
+                   "${$get$capitalized_name$Map$}$() {\n"
+                   "  return java.util.Collections.unmodifiableMap(\n"
+                   "      instance.get$capitalized_name$Map());\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
@@ -757,20 +748,19 @@
         "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(
-        variables_,
-        "@java.lang.Override\n"
-        "$deprecation$\n"
-        "public $value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
-        "    $key_type$ key) {\n"
-        "  $key_null_check$\n"
-        "  java.util.Map<$type_parameters$> map =\n"
-        "      instance.get$capitalized_name$Map();\n"
-        "  if (!map.containsKey(key)) {\n"
-        "    throw new java.lang.IllegalArgumentException();\n"
-        "  }\n"
-        "  return map.get(key);\n"
-        "}\n");
+    printer->Print(variables_,
+                   "@java.lang.Override\n"
+                   "$deprecation$\n"
+                   "public $value_type$ ${$get$capitalized_name$OrThrow$}$(\n"
+                   "    $key_type$ key) {\n"
+                   "  $key_null_check$\n"
+                   "  java.util.Map<$type_parameters$> map =\n"
+                   "      instance.get$capitalized_name$Map();\n"
+                   "  if (!map.containsKey(key)) {\n"
+                   "    throw new java.lang.IllegalArgumentException();\n"
+                   "  }\n"
+                   "  return map.get(key);\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(
@@ -800,103 +790,11 @@
   }
 }
 
-void ImmutableMapFieldLiteGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+void ImmutableMapFieldLiteGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   // Nothing to initialize.
 }
 
-void ImmutableMapFieldLiteGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
-  // Nothing to initialize.
-}
-
-void ImmutableMapFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "$name$_ = visitor.visitMap(\n"
-      "    $name$_, other.internalGet$capitalized_name$());\n");
-}
-
-void ImmutableMapFieldLiteGenerator::
-GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$name$_.makeImmutable();\n");
-}
-
-void ImmutableMapFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "if (!$name$_.isMutable()) {\n"
-      "  $name$_ = $name$_.mutableCopy();\n"
-      "}\n");
-  if (!SupportUnknownEnumValue(descriptor_->file()) &&
-      GetJavaType(ValueField(descriptor_)) == JAVATYPE_ENUM) {
-    printer->Print(
-        variables_,
-        "com.google.protobuf.ByteString bytes = input.readBytes();\n"
-        "java.util.Map.Entry<$type_parameters$> $name$__ =\n"
-        "    $default_entry$.parseEntry(bytes, extensionRegistry);\n");
-    printer->Print(
-        variables_,
-        "if ($value_enum_type$.forNumber($name$__.getValue()) == null) {\n"
-        "  super.mergeLengthDelimitedField($number$, bytes);\n"
-        "} else {\n"
-        "  $name$_.put($name$__);\n"
-        "}\n");
-  } else {
-    printer->Print(
-        variables_,
-        "$default_entry$.parseInto($name$_, input, extensionRegistry);");
-  }
-}
-
-void ImmutableMapFieldLiteGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  // Nothing to do here.
-}
-
-void ImmutableMapFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "for (java.util.Map.Entry<$type_parameters$> entry\n"
-      "     : internalGet$capitalized_name$().entrySet()) {\n"
-      "  $default_entry$.serializeTo(\n"
-      "      output, $number$, entry.getKey(), entry.getValue());\n"
-      "}\n");
-}
-
-void ImmutableMapFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "for (java.util.Map.Entry<$type_parameters$> entry\n"
-      "     : internalGet$capitalized_name$().entrySet()) {\n"
-      "  size += $default_entry$.computeMessageSize(\n"
-      "    $number$, entry.getKey(), entry.getValue());\n"
-      "}\n");
-}
-
-void ImmutableMapFieldLiteGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "result = result && internalGet$capitalized_name$().equals(\n"
-      "    other.internalGet$capitalized_name$());\n");
-}
-
-void ImmutableMapFieldLiteGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "if (!internalGet$capitalized_name$().isEmpty()) {\n"
-      "  hash = (37 * hash) + $constant_name$;\n"
-      "  hash = (53 * hash) + internalGet$capitalized_name$().hashCode();\n"
-      "}\n");
-}
-
 std::string ImmutableMapFieldLiteGenerator::GetBoxedType() const {
   return name_resolver_->GetImmutableClassName(descriptor_->message_type());
 }
diff --git a/src/google/protobuf/compiler/java/java_map_field_lite.h b/src/google/protobuf/compiler/java/java_map_field_lite.h
index df5fe64..49cbf6c 100644
--- a/src/google/protobuf/compiler/java/java_map_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_map_field_lite.h
@@ -51,16 +51,8 @@
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
   void GenerateInitializationCode(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateParsingDoneCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;
-  void GenerateEqualsCode(io::Printer* printer) const;
-  void GenerateHashCode(io::Printer* printer) const;
-
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
   std::string GetBoxedType() const;
 
diff --git a/src/google/protobuf/compiler/java/java_message.cc b/src/google/protobuf/compiler/java/java_message.cc
index 39b5d7c..5bbdcce 100644
--- a/src/google/protobuf/compiler/java/java_message.cc
+++ b/src/google/protobuf/compiler/java/java_message.cc
@@ -77,16 +77,17 @@
 // ===================================================================
 
 MessageGenerator::MessageGenerator(const Descriptor* descriptor)
-  : descriptor_(descriptor) {}
+    : descriptor_(descriptor) {}
 
 MessageGenerator::~MessageGenerator() {}
 
 // ===================================================================
 ImmutableMessageGenerator::ImmutableMessageGenerator(
     const Descriptor* descriptor, Context* context)
-  : MessageGenerator(descriptor), context_(context),
-    name_resolver_(context->GetNameResolver()),
-    field_generators_(descriptor, context_) {
+    : MessageGenerator(descriptor),
+      context_(context),
+      name_resolver_(context->GetNameResolver()),
+      field_generators_(descriptor, context_) {
   GOOGLE_CHECK(HasDescriptorMethods(descriptor->file(), context->EnforceLite()))
       << "Generator factory error: A non-lite message generator is used to "
          "generate lite messages.";
@@ -108,8 +109,7 @@
   vars["index"] = StrCat(descriptor_->index());
   vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_);
   if (descriptor_->containing_type() != NULL) {
-    vars["parent"] = UniqueFileScopeIdentifier(
-        descriptor_->containing_type());
+    vars["parent"] = UniqueFileScopeIdentifier(descriptor_->containing_type());
   }
   if (MultipleJavaFiles(descriptor_->file(), /* immutable = */ true)) {
     // We can only make these package-private since the classes that use them
@@ -125,12 +125,13 @@
   }
 
   // The descriptor for this type.
-  printer->Print(vars,
-    // TODO(teboring): final needs to be added back. The way to fix it is to
-    // generate methods that can construct the types, and then still declare the
-    // types, and then init them in clinit with the new method calls.
-    "$private$static $final$com.google.protobuf.Descriptors.Descriptor\n"
-    "  internal_$identifier$_descriptor;\n");
+  printer->Print(
+      vars,
+      // TODO(teboring): final needs to be added back. The way to fix it is to
+      // generate methods that can construct the types, and then still declare
+      // the types, and then init them in clinit with the new method calls.
+      "$private$static $final$com.google.protobuf.Descriptors.Descriptor\n"
+      "  internal_$identifier$_descriptor;\n");
   *bytecode_estimate += 30;
 
   // And the FieldAccessorTable.
@@ -152,20 +153,20 @@
   vars["index"] = StrCat(descriptor_->index());
   vars["classname"] = name_resolver_->GetImmutableClassName(descriptor_);
   if (descriptor_->containing_type() != NULL) {
-    vars["parent"] = UniqueFileScopeIdentifier(
-        descriptor_->containing_type());
+    vars["parent"] = UniqueFileScopeIdentifier(descriptor_->containing_type());
   }
 
   // The descriptor for this type.
   if (descriptor_->containing_type() == NULL) {
     printer->Print(vars,
-      "internal_$identifier$_descriptor =\n"
-      "  getDescriptor().getMessageTypes().get($index$);\n");
+                   "internal_$identifier$_descriptor =\n"
+                   "  getDescriptor().getMessageTypes().get($index$);\n");
     bytecode_estimate += 30;
   } else {
-    printer->Print(vars,
-      "internal_$identifier$_descriptor =\n"
-      "  internal_$parent$_descriptor.getNestedTypes().get($index$);\n");
+    printer->Print(
+        vars,
+        "internal_$identifier$_descriptor =\n"
+        "  internal_$parent$_descriptor.getNestedTypes().get($index$);\n");
     bytecode_estimate += 30;
   }
 
@@ -182,8 +183,8 @@
   return bytecode_estimate;
 }
 
-void ImmutableMessageGenerator::
-GenerateFieldAccessorTable(io::Printer* printer, int* bytecode_estimate) {
+void ImmutableMessageGenerator::GenerateFieldAccessorTable(
+    io::Printer* printer, int* bytecode_estimate) {
   std::map<std::string, std::string> vars;
   vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
   if (MultipleJavaFiles(descriptor_->file(), /* immutable = */ true)) {
@@ -199,41 +200,38 @@
     vars["final"] = "";
   }
   vars["ver"] = GeneratedCodeVersionSuffix();
-  printer->Print(vars,
-    "$private$static $final$\n"
-    "  com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n"
-    "    internal_$identifier$_fieldAccessorTable;\n");
+  printer->Print(
+      vars,
+      "$private$static $final$\n"
+      "  com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n"
+      "    internal_$identifier$_fieldAccessorTable;\n");
 
   // 6 bytes per field and oneof
-  *bytecode_estimate += 10 + 6 * descriptor_->field_count()
-      + 6 * descriptor_->oneof_decl_count();
+  *bytecode_estimate +=
+      10 + 6 * descriptor_->field_count() + 6 * descriptor_->oneof_decl_count();
 }
 
-int ImmutableMessageGenerator::
-GenerateFieldAccessorTableInitializer(io::Printer* printer) {
+int ImmutableMessageGenerator::GenerateFieldAccessorTableInitializer(
+    io::Printer* printer) {
   int bytecode_estimate = 10;
   printer->Print(
-    "internal_$identifier$_fieldAccessorTable = new\n"
-    "  com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable(\n"
-    "    internal_$identifier$_descriptor,\n"
-    "    new java.lang.String[] { ",
-    "identifier", UniqueFileScopeIdentifier(descriptor_),
-    "ver", GeneratedCodeVersionSuffix());
+      "internal_$identifier$_fieldAccessorTable = new\n"
+      "  com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable(\n"
+      "    internal_$identifier$_descriptor,\n"
+      "    new java.lang.String[] { ",
+      "identifier", UniqueFileScopeIdentifier(descriptor_), "ver",
+      GeneratedCodeVersionSuffix());
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
     const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field);
     bytecode_estimate += 6;
-    printer->Print(
-      "\"$field_name$\", ",
-      "field_name", info->capitalized_name);
+    printer->Print("\"$field_name$\", ", "field_name", info->capitalized_name);
   }
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     const OneofDescriptor* oneof = descriptor_->oneof_decl(i);
     const OneofGeneratorInfo* info = context_->GetOneofGeneratorInfo(oneof);
     bytecode_estimate += 6;
-    printer->Print(
-      "\"$oneof_name$\", ",
-      "oneof_name", info->capitalized_name);
+    printer->Print("\"$oneof_name$\", ", "oneof_name", info->capitalized_name);
   }
   printer->Print("});\n");
   return bytecode_estimate;
@@ -250,42 +248,40 @@
         "    $extra_interfaces$\n"
         "    com.google.protobuf.GeneratedMessage$ver$.\n"
         "        ExtendableMessageOrBuilder<$classname$> {\n",
-        "deprecation", descriptor_->options().deprecated() ?
-            "@java.lang.Deprecated " : "",
+        "deprecation",
+        descriptor_->options().deprecated() ? "@java.lang.Deprecated " : "",
         "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
-        "classname", descriptor_->name(),
-        "{", "", "}", "", "ver", GeneratedCodeVersionSuffix());
+        "classname", descriptor_->name(), "{", "", "}", "", "ver",
+        GeneratedCodeVersionSuffix());
   } else {
     printer->Print(
         "$deprecation$public interface ${$$classname$OrBuilder$}$ extends\n"
         "    $extra_interfaces$\n"
         "    com.google.protobuf.MessageOrBuilder {\n",
-        "deprecation", descriptor_->options().deprecated() ?
-            "@java.lang.Deprecated " : "",
+        "deprecation",
+        descriptor_->options().deprecated() ? "@java.lang.Deprecated " : "",
         "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
-        "classname", descriptor_->name(),
-        "{", "", "}", "");
+        "classname", descriptor_->name(), "{", "", "}", "");
   }
   printer->Annotate("{", "}", descriptor_);
 
   printer->Indent();
-    for (int i = 0; i < descriptor_->field_count(); i++) {
-      printer->Print("\n");
-      field_generators_.get(descriptor_->field(i))
-                       .GenerateInterfaceMembers(printer);
-    }
-    for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-      printer->Print(
-          "\n"
-          "public $classname$.$oneof_capitalized_name$Case "
-          "get$oneof_capitalized_name$Case();\n",
-          "oneof_capitalized_name",
-          context_->GetOneofGeneratorInfo(
-              descriptor_->oneof_decl(i))->capitalized_name,
-          "classname",
-          context_->GetNameResolver()->GetImmutableClassName(
-              descriptor_));
-    }
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    printer->Print("\n");
+    field_generators_.get(descriptor_->field(i))
+        .GenerateInterfaceMembers(printer);
+  }
+  for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
+    printer->Print(
+        "\n"
+        "public $classname$.$oneof_capitalized_name$Case "
+        "get$oneof_capitalized_name$Case();\n",
+        "oneof_capitalized_name",
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))
+            ->capitalized_name,
+        "classname",
+        context_->GetNameResolver()->GetImmutableClassName(descriptor_));
+  }
   printer->Outdent();
 
   printer->Print("}\n");
@@ -301,8 +297,8 @@
   variables["classname"] = descriptor_->name();
   variables["extra_interfaces"] = ExtraMessageInterfaces(descriptor_);
   variables["ver"] = GeneratedCodeVersionSuffix();
-  variables["deprecation"] = descriptor_->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  variables["deprecation"] =
+      descriptor_->options().deprecated() ? "@java.lang.Deprecated " : "";
 
   WriteMessageDocComment(printer, descriptor_);
   MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
@@ -331,15 +327,14 @@
         "$deprecation$public $static$final class $classname$ extends\n");
     printer->Annotate("classname", descriptor_);
     printer->Print(variables,
-      "    com.google.protobuf.GeneratedMessage$ver$ implements\n"
-      "    $extra_interfaces$\n"
-      "    $classname$OrBuilder {\n");
-    builder_type = strings::Substitute(
-        "com.google.protobuf.GeneratedMessage$0.Builder<?>",
-        GeneratedCodeVersionSuffix());
+                   "    com.google.protobuf.GeneratedMessage$ver$ implements\n"
+                   "    $extra_interfaces$\n"
+                   "    $classname$OrBuilder {\n");
+    builder_type =
+        strings::Substitute("com.google.protobuf.GeneratedMessage$0.Builder<?>",
+                            GeneratedCodeVersionSuffix());
   }
-  printer->Print(
-    "private static final long serialVersionUID = 0L;\n");
+  printer->Print("private static final long serialVersionUID = 0L;\n");
 
   printer->Indent();
   // Using builder_type, instead of Builder, prevents the Builder class from
@@ -347,29 +342,34 @@
   // This optimizes the PermGen space usage for clients that do not modify
   // messages.
   printer->Print(
-    "// Use $classname$.newBuilder() to construct.\n"
-    "private $classname$($buildertype$ builder) {\n"
-    "  super(builder);\n"
-    "}\n",
-    "classname", descriptor_->name(),
-    "buildertype", builder_type);
-  printer->Print(
-    "private $classname$() {\n",
-    "classname", descriptor_->name());
+      "// Use $classname$.newBuilder() to construct.\n"
+      "private $classname$($buildertype$ builder) {\n"
+      "  super(builder);\n"
+      "}\n",
+      "classname", descriptor_->name(), "buildertype", builder_type);
+  printer->Print("private $classname$() {\n", "classname", descriptor_->name());
   printer->Indent();
   GenerateInitializers(printer);
   printer->Outdent();
   printer->Print(
-    "}\n"
-    "\n");
+      "}\n"
+      "\n");
 
+  printer->Print(variables,
+                 "@java.lang.Override\n"
+                 "@SuppressWarnings({\"unused\"})\n"
+                 "protected java.lang.Object newInstance(\n"
+                 "    UnusedPrivateParameter unused) {\n"
+                 "  return new $classname$();\n"
+                 "}\n"
+                 "\n");
 
   printer->Print(
-    "@java.lang.Override\n"
-    "public final com.google.protobuf.UnknownFieldSet\n"
-    "getUnknownFields() {\n"
-    "  return this.unknownFields;\n"
-    "}\n");
+      "@java.lang.Override\n"
+      "public final com.google.protobuf.UnknownFieldSet\n"
+      "getUnknownFields() {\n"
+      "  return this.unknownFields;\n"
+      "}\n");
 
   if (context_->HasGeneratedMethods(descriptor_)) {
     GenerateParsingConstructor(printer);
@@ -379,15 +379,14 @@
 
   // Nested types
   for (int i = 0; i < descriptor_->enum_type_count(); i++) {
-    EnumGenerator(descriptor_->enum_type(i), true, context_)
-        .Generate(printer);
+    EnumGenerator(descriptor_->enum_type(i), true, context_).Generate(printer);
   }
 
   for (int i = 0; i < descriptor_->nested_type_count(); i++) {
     // Don't generate Java classes for map entry messages.
     if (IsMapEntry(descriptor_->nested_type(i))) continue;
-    ImmutableMessageGenerator messageGenerator(
-        descriptor_->nested_type(i), context_);
+    ImmutableMessageGenerator messageGenerator(descriptor_->nested_type(i),
+                                               context_);
     messageGenerator.GenerateInterface(printer);
     messageGenerator.Generate(printer);
   }
@@ -407,19 +406,20 @@
   // oneof
   std::map<std::string, std::string> vars;
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-    vars["oneof_name"] = context_->GetOneofGeneratorInfo(
-        descriptor_->oneof_decl(i))->name;
-    vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo(
-        descriptor_->oneof_decl(i))->capitalized_name;
+    vars["oneof_name"] =
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))->name;
+    vars["oneof_capitalized_name"] =
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))
+            ->capitalized_name;
     vars["oneof_index"] = StrCat(descriptor_->oneof_decl(i)->index());
     // oneofCase_ and oneof_
     printer->Print(vars,
-      "private int $oneof_name$Case_ = 0;\n"
-      "private java.lang.Object $oneof_name$_;\n");
+                   "private int $oneof_name$Case_ = 0;\n"
+                   "private java.lang.Object $oneof_name$_;\n");
     // OneofCase enum
     printer->Print(vars,
-      "public enum $oneof_capitalized_name$Case\n"
-      "    implements com.google.protobuf.Internal.EnumLite {\n");
+                   "public enum $oneof_capitalized_name$Case\n"
+                   "    implements com.google.protobuf.Internal.EnumLite {\n");
     printer->Indent();
     for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
       const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
@@ -429,26 +429,25 @@
           "field_name", ToUpper(field->name()), "field_number",
           StrCat(field->number()));
     }
+    printer->Print("$cap_oneof_name$_NOT_SET(0);\n", "cap_oneof_name",
+                   ToUpper(vars["oneof_name"]));
+    printer->Print(vars,
+                   "private final int value;\n"
+                   "private $oneof_capitalized_name$Case(int value) {\n"
+                   "  this.value = value;\n"
+                   "}\n");
     printer->Print(
-      "$cap_oneof_name$_NOT_SET(0);\n",
-      "cap_oneof_name",
-      ToUpper(vars["oneof_name"]));
-    printer->Print(vars,
-      "private final int value;\n"
-      "private $oneof_capitalized_name$Case(int value) {\n"
-      "  this.value = value;\n"
-      "}\n");
-    printer->Print(vars,
-      "/**\n"
-      " * @deprecated Use {@link #forNumber(int)} instead.\n"
-      " */\n"
-      "@java.lang.Deprecated\n"
-      "public static $oneof_capitalized_name$Case valueOf(int value) {\n"
-      "  return forNumber(value);\n"
-      "}\n"
-      "\n"
-      "public static $oneof_capitalized_name$Case forNumber(int value) {\n"
-      "  switch (value) {\n");
+        vars,
+        "/**\n"
+        " * @deprecated Use {@link #forNumber(int)} instead.\n"
+        " */\n"
+        "@java.lang.Deprecated\n"
+        "public static $oneof_capitalized_name$Case valueOf(int value) {\n"
+        "  return forNumber(value);\n"
+        "}\n"
+        "\n"
+        "public static $oneof_capitalized_name$Case forNumber(int value) {\n"
+        "  switch (value) {\n");
     for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
       const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
       printer->Print("    case $field_number$: return $field_name$;\n",
@@ -456,24 +455,24 @@
                      "field_name", ToUpper(field->name()));
     }
     printer->Print(
-      "    case 0: return $cap_oneof_name$_NOT_SET;\n"
-      "    default: return null;\n"
-      "  }\n"
-      "}\n"
-      "public int getNumber() {\n"
-      "  return this.value;\n"
-      "}\n",
-      "cap_oneof_name", ToUpper(vars["oneof_name"]));
+        "    case 0: return $cap_oneof_name$_NOT_SET;\n"
+        "    default: return null;\n"
+        "  }\n"
+        "}\n"
+        "public int getNumber() {\n"
+        "  return this.value;\n"
+        "}\n",
+        "cap_oneof_name", ToUpper(vars["oneof_name"]));
     printer->Outdent();
     printer->Print("};\n\n");
     // oneofCase()
     printer->Print(vars,
-      "public $oneof_capitalized_name$Case\n"
-      "get$oneof_capitalized_name$Case() {\n"
-      "  return $oneof_capitalized_name$Case.forNumber(\n"
-      "      $oneof_name$Case_);\n"
-      "}\n"
-      "\n");
+                   "public $oneof_capitalized_name$Case\n"
+                   "get$oneof_capitalized_name$Case() {\n"
+                   "  return $oneof_capitalized_name$Case.forNumber(\n"
+                   "      $oneof_name$Case_);\n"
+                   "}\n"
+                   "\n");
   }
 
   if (IsAnyMessage(descriptor_)) {
@@ -500,22 +499,21 @@
   GenerateBuilder(printer);
 
   printer->Print(
-    "\n"
-    "// @@protoc_insertion_point(class_scope:$full_name$)\n",
-    "full_name", descriptor_->full_name());
-
+      "\n"
+      "// @@protoc_insertion_point(class_scope:$full_name$)\n",
+      "full_name", descriptor_->full_name());
 
   // Carefully initialize the default instance in such a way that it doesn't
   // conflict with other initialization.
+  printer->Print("private static final $classname$ DEFAULT_INSTANCE;\n",
+                 "classname",
+                 name_resolver_->GetImmutableClassName(descriptor_));
   printer->Print(
-    "private static final $classname$ DEFAULT_INSTANCE;\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
-  printer->Print(
-    "static {\n"
-    "  DEFAULT_INSTANCE = new $classname$();\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "static {\n"
+      "  DEFAULT_INSTANCE = new $classname$();\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Print(
       "public static $classname$ getDefaultInstance() {\n"
@@ -538,12 +536,12 @@
   GenerateParser(printer);
 
   printer->Print(
-    "@java.lang.Override\n"
-    "public $classname$ getDefaultInstanceForType() {\n"
-    "  return DEFAULT_INSTANCE;\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "@java.lang.Override\n"
+      "public $classname$ getDefaultInstanceForType() {\n"
+      "  return DEFAULT_INSTANCE;\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   // Extensions must be declared after the DEFAULT_INSTANCE is initialized
   // because the DEFAULT_INSTANCE is used by the extension to lazily retrieve
@@ -557,12 +555,11 @@
   printer->Print("}\n\n");
 }
 
-
 // ===================================================================
 
-void ImmutableMessageGenerator::
-GenerateMessageSerializationMethods(io::Printer* printer) {
-  std::unique_ptr<const FieldDescriptor * []> sorted_fields(
+void ImmutableMessageGenerator::GenerateMessageSerializationMethods(
+    io::Printer* printer) {
+  std::unique_ptr<const FieldDescriptor*[]> sorted_fields(
       SortFieldsByNumber(descriptor_));
 
   std::vector<const Descriptor::ExtensionRange*> sorted_extensions;
@@ -572,9 +569,9 @@
   std::sort(sorted_extensions.begin(), sorted_extensions.end(),
             ExtensionRangeOrdering());
   printer->Print(
-    "@java.lang.Override\n"
-    "public void writeTo(com.google.protobuf.CodedOutputStream output)\n"
-    "                    throws java.io.IOException {\n");
+      "@java.lang.Override\n"
+      "public void writeTo(com.google.protobuf.CodedOutputStream output)\n"
+      "                    throws java.io.IOException {\n");
   printer->Indent();
 
   if (HasPackedFields(descriptor_)) {
@@ -639,8 +636,7 @@
   printer->Print("size = 0;\n");
 
   for (int i = 0; i < descriptor_->field_count(); i++) {
-    field_generators_.get(sorted_fields[i])
-        .GenerateSerializedSizeCode(printer);
+    field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer);
   }
 
   if (descriptor_->extension_range_count() > 0) {
@@ -652,8 +648,7 @@
   }
 
   if (descriptor_->options().message_set_wire_format()) {
-    printer->Print(
-        "size += unknownFields.getSerializedSizeAsMessageSet();\n");
+    printer->Print("size += unknownFields.getSerializedSizeAsMessageSet();\n");
   } else {
     printer->Print("size += unknownFields.getSerializedSize();\n");
   }
@@ -664,88 +659,89 @@
 
   printer->Outdent();
   printer->Print(
-    "}\n"
-    "\n");
+      "}\n"
+      "\n");
 }
 
-void ImmutableMessageGenerator::
-GenerateParseFromMethods(io::Printer* printer) {
+void ImmutableMessageGenerator::GenerateParseFromMethods(io::Printer* printer) {
   // Note:  These are separate from GenerateMessageSerializationMethods()
   //   because they need to be generated even for messages that are optimized
   //   for code size.
   printer->Print(
-    "public static $classname$ parseFrom(\n"
-    "    java.nio.ByteBuffer data)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return PARSER.parseFrom(data);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    java.nio.ByteBuffer data,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return PARSER.parseFrom(data, extensionRegistry);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    com.google.protobuf.ByteString data)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return PARSER.parseFrom(data);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    com.google.protobuf.ByteString data,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return PARSER.parseFrom(data, extensionRegistry);\n"
-    "}\n"
-    "public static $classname$ parseFrom(byte[] data)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return PARSER.parseFrom(data);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    byte[] data,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return PARSER.parseFrom(data, extensionRegistry);\n"
-    "}\n"
-    "public static $classname$ parseFrom(java.io.InputStream input)\n"
-    "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessage$ver$\n"
-    "      .parseWithIOException(PARSER, input);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    java.io.InputStream input,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessage$ver$\n"
-    "      .parseWithIOException(PARSER, input, extensionRegistry);\n"
-    "}\n"
-    "public static $classname$ parseDelimitedFrom(java.io.InputStream input)\n"
-    "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessage$ver$\n"
-    "      .parseDelimitedWithIOException(PARSER, input);\n"
-    "}\n"
-    "public static $classname$ parseDelimitedFrom(\n"
-    "    java.io.InputStream input,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessage$ver$\n"
-    "      .parseDelimitedWithIOException(PARSER, input, extensionRegistry);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    com.google.protobuf.CodedInputStream input)\n"
-    "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessage$ver$\n"
-    "      .parseWithIOException(PARSER, input);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    com.google.protobuf.CodedInputStream input,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessage$ver$\n"
-    "      .parseWithIOException(PARSER, input, extensionRegistry);\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_),
-    "ver", GeneratedCodeVersionSuffix());
+      "public static $classname$ parseFrom(\n"
+      "    java.nio.ByteBuffer data)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return PARSER.parseFrom(data);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    java.nio.ByteBuffer data,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return PARSER.parseFrom(data, extensionRegistry);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    com.google.protobuf.ByteString data)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return PARSER.parseFrom(data);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    com.google.protobuf.ByteString data,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return PARSER.parseFrom(data, extensionRegistry);\n"
+      "}\n"
+      "public static $classname$ parseFrom(byte[] data)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return PARSER.parseFrom(data);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    byte[] data,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return PARSER.parseFrom(data, extensionRegistry);\n"
+      "}\n"
+      "public static $classname$ parseFrom(java.io.InputStream input)\n"
+      "    throws java.io.IOException {\n"
+      "  return com.google.protobuf.GeneratedMessage$ver$\n"
+      "      .parseWithIOException(PARSER, input);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    java.io.InputStream input,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws java.io.IOException {\n"
+      "  return com.google.protobuf.GeneratedMessage$ver$\n"
+      "      .parseWithIOException(PARSER, input, extensionRegistry);\n"
+      "}\n"
+      "public static $classname$ parseDelimitedFrom(java.io.InputStream "
+      "input)\n"
+      "    throws java.io.IOException {\n"
+      "  return com.google.protobuf.GeneratedMessage$ver$\n"
+      "      .parseDelimitedWithIOException(PARSER, input);\n"
+      "}\n"
+      "public static $classname$ parseDelimitedFrom(\n"
+      "    java.io.InputStream input,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws java.io.IOException {\n"
+      "  return com.google.protobuf.GeneratedMessage$ver$\n"
+      "      .parseDelimitedWithIOException(PARSER, input, "
+      "extensionRegistry);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    com.google.protobuf.CodedInputStream input)\n"
+      "    throws java.io.IOException {\n"
+      "  return com.google.protobuf.GeneratedMessage$ver$\n"
+      "      .parseWithIOException(PARSER, input);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    com.google.protobuf.CodedInputStream input,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws java.io.IOException {\n"
+      "  return com.google.protobuf.GeneratedMessage$ver$\n"
+      "      .parseWithIOException(PARSER, input, extensionRegistry);\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_), "ver",
+      GeneratedCodeVersionSuffix());
 }
 
 void ImmutableMessageGenerator::GenerateSerializeOneField(
@@ -764,48 +760,48 @@
 void ImmutableMessageGenerator::GenerateBuilder(io::Printer* printer) {
   // LITE_RUNTIME implements this at the GeneratedMessageLite level.
   printer->Print(
-    "@java.lang.Override\n"
-    "public Builder newBuilderForType() { return newBuilder(); }\n");
+      "@java.lang.Override\n"
+      "public Builder newBuilderForType() { return newBuilder(); }\n");
 
   printer->Print(
-    "public static Builder newBuilder() {\n"
-    "  return DEFAULT_INSTANCE.toBuilder();\n"
-    "}\n"
-    "public static Builder newBuilder($classname$ prototype) {\n"
-    "  return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);\n"
-    "}\n"
-    "@java.lang.Override\n"
-    "public Builder toBuilder() {\n"
-    "  return this == DEFAULT_INSTANCE\n"
-    "      ? new Builder() : new Builder().mergeFrom(this);\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "public static Builder newBuilder() {\n"
+      "  return DEFAULT_INSTANCE.toBuilder();\n"
+      "}\n"
+      "public static Builder newBuilder($classname$ prototype) {\n"
+      "  return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);\n"
+      "}\n"
+      "@java.lang.Override\n"
+      "public Builder toBuilder() {\n"
+      "  return this == DEFAULT_INSTANCE\n"
+      "      ? new Builder() : new Builder().mergeFrom(this);\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Print(
-    "@java.lang.Override\n"
-    "protected Builder newBuilderForType(\n"
-    "    com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n"
-    "  Builder builder = new Builder(parent);\n"
-    "  return builder;\n"
-    "}\n",
-    "ver", GeneratedCodeVersionSuffix());
+      "@java.lang.Override\n"
+      "protected Builder newBuilderForType(\n"
+      "    com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n"
+      "  Builder builder = new Builder(parent);\n"
+      "  return builder;\n"
+      "}\n",
+      "ver", GeneratedCodeVersionSuffix());
 
   MessageBuilderGenerator builderGenerator(descriptor_, context_);
   builderGenerator.Generate(printer);
 }
 
-void ImmutableMessageGenerator::
-GenerateDescriptorMethods(io::Printer* printer) {
+void ImmutableMessageGenerator::GenerateDescriptorMethods(
+    io::Printer* printer) {
   if (!descriptor_->options().no_standard_descriptor_accessor()) {
     printer->Print(
-      "public static final com.google.protobuf.Descriptors.Descriptor\n"
-      "    getDescriptor() {\n"
-      "  return $fileclass$.internal_$identifier$_descriptor;\n"
-      "}\n"
-      "\n",
-      "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
-      "identifier", UniqueFileScopeIdentifier(descriptor_));
+        "public static final com.google.protobuf.Descriptors.Descriptor\n"
+        "    getDescriptor() {\n"
+        "  return $fileclass$.internal_$identifier$_descriptor;\n"
+        "}\n"
+        "\n",
+        "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
+        "identifier", UniqueFileScopeIdentifier(descriptor_));
   }
   std::vector<const FieldDescriptor*> map_fields;
   for (int i = 0; i < descriptor_->field_count(); i++) {
@@ -817,11 +813,11 @@
   }
   if (!map_fields.empty()) {
     printer->Print(
-      "@SuppressWarnings({\"rawtypes\"})\n"
-      "@java.lang.Override\n"
-      "protected com.google.protobuf.MapField internalGetMapField(\n"
-      "    int number) {\n"
-      "  switch (number) {\n");
+        "@SuppressWarnings({\"rawtypes\"})\n"
+        "@java.lang.Override\n"
+        "protected com.google.protobuf.MapField internalGetMapField(\n"
+        "    int number) {\n"
+        "  switch (number) {\n");
     printer->Indent();
     printer->Indent();
     for (int i = 0; i < map_fields.size(); ++i) {
@@ -844,40 +840,38 @@
         "}\n");
   }
   printer->Print(
-    "@java.lang.Override\n"
-    "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n"
-    "    internalGetFieldAccessorTable() {\n"
-    "  return $fileclass$.internal_$identifier$_fieldAccessorTable\n"
-    "      .ensureFieldAccessorsInitialized(\n"
-    "          $classname$.class, $classname$.Builder.class);\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_),
-    "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
-    "identifier", UniqueFileScopeIdentifier(descriptor_),
-    "ver", GeneratedCodeVersionSuffix());
+      "@java.lang.Override\n"
+      "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n"
+      "    internalGetFieldAccessorTable() {\n"
+      "  return $fileclass$.internal_$identifier$_fieldAccessorTable\n"
+      "      .ensureFieldAccessorsInitialized(\n"
+      "          $classname$.class, $classname$.Builder.class);\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_),
+      "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
+      "identifier", UniqueFileScopeIdentifier(descriptor_), "ver",
+      GeneratedCodeVersionSuffix());
 }
 
 // ===================================================================
 
-void ImmutableMessageGenerator::GenerateIsInitialized(
-    io::Printer* printer) {
+void ImmutableMessageGenerator::GenerateIsInitialized(io::Printer* printer) {
   // Memoizes whether the protocol buffer is fully initialized (has all
   // required fields). -1 means not yet computed. 0 means false and 1 means
   // true.
+  printer->Print("private byte memoizedIsInitialized = -1;\n");
   printer->Print(
-    "private byte memoizedIsInitialized = -1;\n");
-  printer->Print(
-    "@java.lang.Override\n"
-    "public final boolean isInitialized() {\n");
+      "@java.lang.Override\n"
+      "public final boolean isInitialized() {\n");
   printer->Indent();
 
   // Don't directly compare to -1 to avoid an Android x86 JIT bug.
   printer->Print(
-    "byte isInitialized = memoizedIsInitialized;\n"
-    "if (isInitialized == 1) return true;\n"
-    "if (isInitialized == 0) return false;\n"
-    "\n");
+      "byte isInitialized = memoizedIsInitialized;\n"
+      "if (isInitialized == 1) return true;\n"
+      "if (isInitialized == 0) return false;\n"
+      "\n");
 
   // Check that all required fields in this message are set.
   // TODO(kenton):  We can optimize this when we switch to putting all the
@@ -888,11 +882,11 @@
 
     if (field->is_required()) {
       printer->Print(
-        "if (!has$name$()) {\n"
-        "  memoizedIsInitialized = 0;\n"
-        "  return false;\n"
-        "}\n",
-        "name", info->capitalized_name);
+          "if (!has$name$()) {\n"
+          "  memoizedIsInitialized = 0;\n"
+          "  return false;\n"
+          "}\n",
+          "name", info->capitalized_name);
     }
   }
 
@@ -905,13 +899,13 @@
       switch (field->label()) {
         case FieldDescriptor::LABEL_REQUIRED:
           printer->Print(
-            "if (!get$name$().isInitialized()) {\n"
-             "  memoizedIsInitialized = 0;\n"
-             "  return false;\n"
-             "}\n",
-            "type", name_resolver_->GetImmutableClassName(
-                field->message_type()),
-            "name", info->capitalized_name);
+              "if (!get$name$().isInitialized()) {\n"
+              "  memoizedIsInitialized = 0;\n"
+              "  return false;\n"
+              "}\n",
+              "type",
+              name_resolver_->GetImmutableClassName(field->message_type()),
+              "name", info->capitalized_name);
           break;
         case FieldDescriptor::LABEL_OPTIONAL:
           if (!SupportFieldPresence(descriptor_->file()) &&
@@ -923,41 +917,41 @@
                            "oneof_name", oneof_info->name, "field_number",
                            StrCat(field->number()));
           } else {
-            printer->Print(
-              "if (has$name$()) {\n",
-              "name", info->capitalized_name);
+            printer->Print("if (has$name$()) {\n", "name",
+                           info->capitalized_name);
           }
           printer->Print(
-            "  if (!get$name$().isInitialized()) {\n"
-            "    memoizedIsInitialized = 0;\n"
-            "    return false;\n"
-            "  }\n"
-            "}\n",
-            "name", info->capitalized_name);
+              "  if (!get$name$().isInitialized()) {\n"
+              "    memoizedIsInitialized = 0;\n"
+              "    return false;\n"
+              "  }\n"
+              "}\n",
+              "name", info->capitalized_name);
           break;
         case FieldDescriptor::LABEL_REPEATED:
           if (IsMapEntry(field->message_type())) {
             printer->Print(
-              "for ($type$ item : get$name$Map().values()) {\n"
-              "  if (!item.isInitialized()) {\n"
-              "    memoizedIsInitialized = 0;\n"
-              "    return false;\n"
-              "  }\n"
-              "}\n",
-              "type", MapValueImmutableClassdName(field->message_type(),
-                                                  name_resolver_),
-              "name", info->capitalized_name);
+                "for ($type$ item : get$name$Map().values()) {\n"
+                "  if (!item.isInitialized()) {\n"
+                "    memoizedIsInitialized = 0;\n"
+                "    return false;\n"
+                "  }\n"
+                "}\n",
+                "type",
+                MapValueImmutableClassdName(field->message_type(),
+                                            name_resolver_),
+                "name", info->capitalized_name);
           } else {
             printer->Print(
-              "for (int i = 0; i < get$name$Count(); i++) {\n"
-              "  if (!get$name$(i).isInitialized()) {\n"
-              "    memoizedIsInitialized = 0;\n"
-              "    return false;\n"
-              "  }\n"
-              "}\n",
-              "type", name_resolver_->GetImmutableClassName(
-                  field->message_type()),
-              "name", info->capitalized_name);
+                "for (int i = 0; i < get$name$Count(); i++) {\n"
+                "  if (!get$name$(i).isInitialized()) {\n"
+                "    memoizedIsInitialized = 0;\n"
+                "    return false;\n"
+                "  }\n"
+                "}\n",
+                "type",
+                name_resolver_->GetImmutableClassName(field->message_type()),
+                "name", info->capitalized_name);
           }
           break;
       }
@@ -966,21 +960,20 @@
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "if (!extensionsAreInitialized()) {\n"
-      "  memoizedIsInitialized = 0;\n"
-      "  return false;\n"
-      "}\n");
+        "if (!extensionsAreInitialized()) {\n"
+        "  memoizedIsInitialized = 0;\n"
+        "  return false;\n"
+        "}\n");
   }
 
   printer->Outdent();
 
-  printer->Print(
-    "  memoizedIsInitialized = 1;\n");
+  printer->Print("  memoizedIsInitialized = 1;\n");
 
   printer->Print(
-    "  return true;\n"
-    "}\n"
-    "\n");
+      "  return true;\n"
+      "}\n"
+      "\n");
 }
 
 // ===================================================================
@@ -994,26 +987,26 @@
     return true;
   }
   return GetJavaType(field) == JAVATYPE_MESSAGE &&
-      field->containing_oneof() == NULL;
+         field->containing_oneof() == NULL;
 }
 }  // namespace
 
-void ImmutableMessageGenerator::
-GenerateEqualsAndHashCode(io::Printer* printer) {
+void ImmutableMessageGenerator::GenerateEqualsAndHashCode(
+    io::Printer* printer) {
   printer->Print(
-    "@java.lang.Override\n"
-    "public boolean equals(final java.lang.Object obj) {\n");
+      "@java.lang.Override\n"
+      "public boolean equals(final java.lang.Object obj) {\n");
   printer->Indent();
   printer->Print(
-    "if (obj == this) {\n"
-    " return true;\n"
-    "}\n"
-    "if (!(obj instanceof $classname$)) {\n"
-    "  return super.equals(obj);\n"
-    "}\n"
-    "$classname$ other = ($classname$) obj;\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "if (obj == this) {\n"
+      " return true;\n"
+      "}\n"
+      "if (!(obj instanceof $classname$)) {\n"
+      "  return super.equals(obj);\n"
+      "}\n"
+      "$classname$ other = ($classname$) obj;\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = descriptor_->field(i);
@@ -1022,16 +1015,15 @@
       bool check_has_bits = CheckHasBitsForEqualsAndHashCode(field);
       if (check_has_bits) {
         printer->Print(
-          "if (has$name$() != other.has$name$()) return false;\n"
-          "if (has$name$()) {\n",
-          "name", info->capitalized_name);
+            "if (has$name$() != other.has$name$()) return false;\n"
+            "if (has$name$()) {\n",
+            "name", info->capitalized_name);
         printer->Indent();
       }
       field_generators_.get(field).GenerateEqualsCode(printer);
       if (check_has_bits) {
         printer->Outdent();
-        printer->Print(
-          "}\n");
+        printer->Print("}\n");
       }
     }
   }
@@ -1039,16 +1031,14 @@
   // Compare oneofs.
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     printer->Print(
-      "if (!get$oneof_capitalized_name$Case().equals("
-      "other.get$oneof_capitalized_name$Case())) return false;\n",
-      "oneof_capitalized_name",
-      context_->GetOneofGeneratorInfo(
-          descriptor_->oneof_decl(i))->capitalized_name);
+        "if (!get$oneof_capitalized_name$Case().equals("
+        "other.get$oneof_capitalized_name$Case())) return false;\n",
+        "oneof_capitalized_name",
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))
+            ->capitalized_name);
     printer->Print(
-      "switch ($oneof_name$Case_) {\n",
-      "oneof_name",
-      context_->GetOneofGeneratorInfo(
-          descriptor_->oneof_decl(i))->name);
+        "switch ($oneof_name$Case_) {\n", "oneof_name",
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))->name);
     printer->Indent();
     for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
       const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
@@ -1060,8 +1050,8 @@
       printer->Outdent();
     }
     printer->Print(
-      "case 0:\n"
-      "default:\n");
+        "case 0:\n"
+        "default:\n");
     printer->Outdent();
     printer->Print("}\n");
   }
@@ -1073,29 +1063,26 @@
       "if (!unknownFields.equals(other.unknownFields)) return false;\n");
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "if (!getExtensionFields().equals(other.getExtensionFields()))\n"
-      "  return false;\n");
+        "if (!getExtensionFields().equals(other.getExtensionFields()))\n"
+        "  return false;\n");
   }
-  printer->Print(
-    "return true;\n");
+  printer->Print("return true;\n");
   printer->Outdent();
   printer->Print(
-    "}\n"
-    "\n");
+      "}\n"
+      "\n");
 
   printer->Print(
-    "@java.lang.Override\n"
-    "public int hashCode() {\n");
+      "@java.lang.Override\n"
+      "public int hashCode() {\n");
   printer->Indent();
-  printer->Print(
-    "if (memoizedHashCode != 0) {\n");
+  printer->Print("if (memoizedHashCode != 0) {\n");
   printer->Indent();
-  printer->Print(
-    "return memoizedHashCode;\n");
+  printer->Print("return memoizedHashCode;\n");
   printer->Outdent();
   printer->Print(
-    "}\n"
-    "int hash = 41;\n");
+      "}\n"
+      "int hash = 41;\n");
 
   // If we output a getDescriptor() method, use that as it is more efficient.
   if (descriptor_->options().no_standard_descriptor_accessor()) {
@@ -1111,9 +1098,7 @@
       const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field);
       bool check_has_bits = CheckHasBitsForEqualsAndHashCode(field);
       if (check_has_bits) {
-        printer->Print(
-          "if (has$name$()) {\n",
-          "name", info->capitalized_name);
+        printer->Print("if (has$name$()) {\n", "name", info->capitalized_name);
         printer->Indent();
       }
       field_generators_.get(field).GenerateHashCode(printer);
@@ -1127,10 +1112,8 @@
   // hashCode oneofs.
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     printer->Print(
-      "switch ($oneof_name$Case_) {\n",
-      "oneof_name",
-      context_->GetOneofGeneratorInfo(
-          descriptor_->oneof_decl(i))->name);
+        "switch ($oneof_name$Case_) {\n", "oneof_name",
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))->name);
     printer->Indent();
     for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
       const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
@@ -1142,47 +1125,45 @@
       printer->Outdent();
     }
     printer->Print(
-      "case 0:\n"
-      "default:\n");
+        "case 0:\n"
+        "default:\n");
     printer->Outdent();
     printer->Print("}\n");
   }
 
   if (descriptor_->extension_range_count() > 0) {
-    printer->Print(
-      "hash = hashFields(hash, getExtensionFields());\n");
+    printer->Print("hash = hashFields(hash, getExtensionFields());\n");
   }
 
+  printer->Print("hash = (29 * hash) + unknownFields.hashCode();\n");
   printer->Print(
-    "hash = (29 * hash) + unknownFields.hashCode();\n");
-  printer->Print(
-    "memoizedHashCode = hash;\n"
-    "return hash;\n");
+      "memoizedHashCode = hash;\n"
+      "return hash;\n");
   printer->Outdent();
   printer->Print(
-    "}\n"
-    "\n");
+      "}\n"
+      "\n");
 }
 
 // ===================================================================
 
-void ImmutableMessageGenerator::
-GenerateExtensionRegistrationCode(io::Printer* printer) {
+void ImmutableMessageGenerator::GenerateExtensionRegistrationCode(
+    io::Printer* printer) {
   for (int i = 0; i < descriptor_->extension_count(); i++) {
     ImmutableExtensionGenerator(descriptor_->extension(i), context_)
-      .GenerateRegistrationCode(printer);
+        .GenerateRegistrationCode(printer);
   }
 
   for (int i = 0; i < descriptor_->nested_type_count(); i++) {
     ImmutableMessageGenerator(descriptor_->nested_type(i), context_)
-      .GenerateExtensionRegistrationCode(printer);
+        .GenerateExtensionRegistrationCode(printer);
   }
 }
 
 // ===================================================================
-void ImmutableMessageGenerator::
-GenerateParsingConstructor(io::Printer* printer) {
-  std::unique_ptr<const FieldDescriptor * []> sorted_fields(
+void ImmutableMessageGenerator::GenerateParsingConstructor(
+    io::Printer* printer) {
+  std::unique_ptr<const FieldDescriptor*[]> sorted_fields(
       SortFieldsByNumber(descriptor_));
 
   printer->Print(
@@ -1209,26 +1190,25 @@
   }
   int totalBuilderInts = (totalBuilderBits + 31) / 32;
   for (int i = 0; i < totalBuilderInts; i++) {
-    printer->Print("int mutable_$bit_field_name$ = 0;\n",
-      "bit_field_name", GetBitFieldName(i));
+    printer->Print("int mutable_$bit_field_name$ = 0;\n", "bit_field_name",
+                   GetBitFieldName(i));
   }
 
   printer->Print(
       "com.google.protobuf.UnknownFieldSet.Builder unknownFields =\n"
       "    com.google.protobuf.UnknownFieldSet.newBuilder();\n");
 
-  printer->Print(
-      "try {\n");
+  printer->Print("try {\n");
   printer->Indent();
 
   printer->Print(
-    "boolean done = false;\n"
-    "while (!done) {\n");
+      "boolean done = false;\n"
+      "while (!done) {\n");
   printer->Indent();
 
   printer->Print(
-    "int tag = input.readTag();\n"
-    "switch (tag) {\n");
+      "int tag = input.readTag();\n"
+      "switch (tag) {\n");
   printer->Indent();
 
   printer->Print(
@@ -1238,8 +1218,8 @@
 
   for (int i = 0; i < descriptor_->field_count(); i++) {
     const FieldDescriptor* field = sorted_fields[i];
-    uint32 tag = WireFormatLite::MakeTag(field->number(),
-      WireFormat::WireTypeForFieldType(field->type()));
+    uint32 tag = WireFormatLite::MakeTag(
+        field->number(), WireFormat::WireTypeForFieldType(field->type()));
 
     printer->Print("case $tag$: {\n", "tag",
                    StrCat(static_cast<int32>(tag)));
@@ -1249,14 +1229,14 @@
 
     printer->Outdent();
     printer->Print(
-      "  break;\n"
-      "}\n");
+        "  break;\n"
+        "}\n");
 
     if (field->is_packable()) {
       // To make packed = true wire compatible, we generate parsing code from a
       // packed version of this field regardless of field->options().packed().
-      uint32 packed_tag = WireFormatLite::MakeTag(field->number(),
-        WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
+      uint32 packed_tag = WireFormatLite::MakeTag(
+          field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
       printer->Print("case $tag$: {\n", "tag",
                      StrCat(static_cast<int32>(packed_tag)));
       printer->Indent();
@@ -1265,8 +1245,8 @@
 
       printer->Outdent();
       printer->Print(
-        "  break;\n"
-        "}\n");
+          "  break;\n"
+          "}\n");
     }
   }
 
@@ -1282,8 +1262,8 @@
   printer->Outdent();
   printer->Outdent();
   printer->Print(
-      "  }\n"     // switch (tag)
-      "}\n");     // while (!done)
+      "  }\n"  // switch (tag)
+      "}\n");  // while (!done)
 
   printer->Outdent();
   printer->Print(
@@ -1305,13 +1285,12 @@
   printer->Print("this.unknownFields = unknownFields.build();\n");
 
   // Make extensions immutable.
-  printer->Print(
-      "makeExtensionsImmutable();\n");
+  printer->Print("makeExtensionsImmutable();\n");
 
   printer->Outdent();
   printer->Outdent();
   printer->Print(
-      "  }\n"     // finally
+      "  }\n"  // finally
       "}\n");
 }
 
@@ -1354,8 +1333,7 @@
         "return builder.buildPartial();\n");
     printer->Outdent();
   }
-  printer->Print(
-        "}\n");
+  printer->Print("}\n");
   printer->Outdent();
   printer->Print(
       "};\n"
@@ -1387,76 +1365,76 @@
 
 void ImmutableMessageGenerator::GenerateAnyMethods(io::Printer* printer) {
   printer->Print(
-    "private static String getTypeUrl(\n"
-    "    java.lang.String typeUrlPrefix,\n"
-    "    com.google.protobuf.Descriptors.Descriptor descriptor) {\n"
-    "  return typeUrlPrefix.endsWith(\"/\")\n"
-    "      ? typeUrlPrefix + descriptor.getFullName()\n"
-    "      : typeUrlPrefix + \"/\" + descriptor.getFullName();\n"
-    "}\n"
-    "\n"
-    "private static String getTypeNameFromTypeUrl(\n"
-    "    java.lang.String typeUrl) {\n"
-    "  int pos = typeUrl.lastIndexOf('/');\n"
-    "  return pos == -1 ? \"\" : typeUrl.substring(pos + 1);\n"
-    "}\n"
-    "\n"
-    "public static <T extends com.google.protobuf.Message> Any pack(\n"
-    "    T message) {\n"
-    "  return Any.newBuilder()\n"
-    "      .setTypeUrl(getTypeUrl(\"type.googleapis.com\",\n"
-    "                             message.getDescriptorForType()))\n"
-    "      .setValue(message.toByteString())\n"
-    "      .build();\n"
-    "}\n"
-    "\n"
-    "/**\n"
-    " * Packs a message using the given type URL prefix. The type URL will\n"
-    " * be constructed by concatenating the message type's full name to the\n"
-    " * prefix with an optional \"/\" separator if the prefix doesn't end\n"
-    " * with \"/\" already.\n"
-    " */\n"
-    "public static <T extends com.google.protobuf.Message> Any pack(\n"
-    "    T message, java.lang.String typeUrlPrefix) {\n"
-    "  return Any.newBuilder()\n"
-    "      .setTypeUrl(getTypeUrl(typeUrlPrefix,\n"
-    "                             message.getDescriptorForType()))\n"
-    "      .setValue(message.toByteString())\n"
-    "      .build();\n"
-    "}\n"
-    "\n"
-    "public <T extends com.google.protobuf.Message> boolean is(\n"
-    "    java.lang.Class<T> clazz) {\n"
-    "  T defaultInstance =\n"
-    "      com.google.protobuf.Internal.getDefaultInstance(clazz);\n"
-    "  return getTypeNameFromTypeUrl(getTypeUrl()).equals(\n"
-    "      defaultInstance.getDescriptorForType().getFullName());\n"
-    "}\n"
-    "\n"
-    "private volatile com.google.protobuf.Message cachedUnpackValue;\n"
-    "\n"
-    "@java.lang.SuppressWarnings(\"unchecked\")\n"
-    "public <T extends com.google.protobuf.Message> T unpack(\n"
-    "    java.lang.Class<T> clazz)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  boolean invalidClazz = false;\n"
-    "  if (cachedUnpackValue != null) {\n"
-    "    if (cachedUnpackValue.getClass() == clazz) {\n"
-    "      return (T) cachedUnpackValue;\n"
-    "    }\n"
-    "    invalidClazz = true;\n"
-    "  }\n"
-    "  if (invalidClazz || !is(clazz)) {\n"
-    "    throw new com.google.protobuf.InvalidProtocolBufferException(\n"
-    "        \"Type of the Any message does not match the given class.\");\n"
-    "  }\n"
-    "  T defaultInstance =\n"
-    "      com.google.protobuf.Internal.getDefaultInstance(clazz);\n"
-    "  T result = (T) defaultInstance.getParserForType()\n"
-    "      .parseFrom(getValue());\n"
-    "  cachedUnpackValue = result;\n"
-    "  return result;\n"
-    "}\n");
+      "private static String getTypeUrl(\n"
+      "    java.lang.String typeUrlPrefix,\n"
+      "    com.google.protobuf.Descriptors.Descriptor descriptor) {\n"
+      "  return typeUrlPrefix.endsWith(\"/\")\n"
+      "      ? typeUrlPrefix + descriptor.getFullName()\n"
+      "      : typeUrlPrefix + \"/\" + descriptor.getFullName();\n"
+      "}\n"
+      "\n"
+      "private static String getTypeNameFromTypeUrl(\n"
+      "    java.lang.String typeUrl) {\n"
+      "  int pos = typeUrl.lastIndexOf('/');\n"
+      "  return pos == -1 ? \"\" : typeUrl.substring(pos + 1);\n"
+      "}\n"
+      "\n"
+      "public static <T extends com.google.protobuf.Message> Any pack(\n"
+      "    T message) {\n"
+      "  return Any.newBuilder()\n"
+      "      .setTypeUrl(getTypeUrl(\"type.googleapis.com\",\n"
+      "                             message.getDescriptorForType()))\n"
+      "      .setValue(message.toByteString())\n"
+      "      .build();\n"
+      "}\n"
+      "\n"
+      "/**\n"
+      " * Packs a message using the given type URL prefix. The type URL will\n"
+      " * be constructed by concatenating the message type's full name to the\n"
+      " * prefix with an optional \"/\" separator if the prefix doesn't end\n"
+      " * with \"/\" already.\n"
+      " */\n"
+      "public static <T extends com.google.protobuf.Message> Any pack(\n"
+      "    T message, java.lang.String typeUrlPrefix) {\n"
+      "  return Any.newBuilder()\n"
+      "      .setTypeUrl(getTypeUrl(typeUrlPrefix,\n"
+      "                             message.getDescriptorForType()))\n"
+      "      .setValue(message.toByteString())\n"
+      "      .build();\n"
+      "}\n"
+      "\n"
+      "public <T extends com.google.protobuf.Message> boolean is(\n"
+      "    java.lang.Class<T> clazz) {\n"
+      "  T defaultInstance =\n"
+      "      com.google.protobuf.Internal.getDefaultInstance(clazz);\n"
+      "  return getTypeNameFromTypeUrl(getTypeUrl()).equals(\n"
+      "      defaultInstance.getDescriptorForType().getFullName());\n"
+      "}\n"
+      "\n"
+      "private volatile com.google.protobuf.Message cachedUnpackValue;\n"
+      "\n"
+      "@java.lang.SuppressWarnings(\"unchecked\")\n"
+      "public <T extends com.google.protobuf.Message> T unpack(\n"
+      "    java.lang.Class<T> clazz)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  boolean invalidClazz = false;\n"
+      "  if (cachedUnpackValue != null) {\n"
+      "    if (cachedUnpackValue.getClass() == clazz) {\n"
+      "      return (T) cachedUnpackValue;\n"
+      "    }\n"
+      "    invalidClazz = true;\n"
+      "  }\n"
+      "  if (invalidClazz || !is(clazz)) {\n"
+      "    throw new com.google.protobuf.InvalidProtocolBufferException(\n"
+      "        \"Type of the Any message does not match the given class.\");\n"
+      "  }\n"
+      "  T defaultInstance =\n"
+      "      com.google.protobuf.Internal.getDefaultInstance(clazz);\n"
+      "  T result = (T) defaultInstance.getParserForType()\n"
+      "      .parseFrom(getValue());\n"
+      "  cachedUnpackValue = result;\n"
+      "  return result;\n"
+      "}\n");
 }
 
 }  // namespace java
diff --git a/src/google/protobuf/compiler/java/java_message.h b/src/google/protobuf/compiler/java/java_message.h
index ac0c765..de2f359 100644
--- a/src/google/protobuf/compiler/java/java_message.h
+++ b/src/google/protobuf/compiler/java/java_message.h
@@ -35,8 +35,8 @@
 #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__
 #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__
 
-#include <string>
 #include <map>
+#include <string>
 #include <google/protobuf/compiler/java/java_field.h>
 
 namespace google {
@@ -101,14 +101,13 @@
   virtual void Generate(io::Printer* printer);
   virtual void GenerateInterface(io::Printer* printer);
   virtual void GenerateExtensionRegistrationCode(io::Printer* printer);
-  virtual void GenerateStaticVariables(
-      io::Printer* printer, int* bytecode_estimate);
+  virtual void GenerateStaticVariables(io::Printer* printer,
+                                       int* bytecode_estimate);
 
   // Returns an estimate of the number of bytes the printed code will compile to
   virtual int GenerateStaticVariableInitializers(io::Printer* printer);
 
  private:
-
   void GenerateFieldAccessorTable(io::Printer* printer, int* bytecode_estimate);
 
   // Returns an estimate of the number of bytes the printed code will compile to
diff --git a/src/google/protobuf/compiler/java/java_message_builder.cc b/src/google/protobuf/compiler/java/java_message_builder.cc
index 2ba77a2..aa00a66 100644
--- a/src/google/protobuf/compiler/java/java_message_builder.cc
+++ b/src/google/protobuf/compiler/java/java_message_builder.cc
@@ -69,11 +69,12 @@
 }
 }  // namespace
 
-MessageBuilderGenerator::MessageBuilderGenerator(
-    const Descriptor* descriptor, Context* context)
-  : descriptor_(descriptor), context_(context),
-    name_resolver_(context->GetNameResolver()),
-    field_generators_(descriptor, context_) {
+MessageBuilderGenerator::MessageBuilderGenerator(const Descriptor* descriptor,
+                                                 Context* context)
+    : descriptor_(descriptor),
+      context_(context),
+      name_resolver_(context->GetNameResolver()),
+      field_generators_(descriptor, context_) {
   GOOGLE_CHECK(HasDescriptorMethods(descriptor->file(), context->EnforceLite()))
       << "Generator factory error: A non-lite message generator is used to "
          "generate lite messages.";
@@ -81,28 +82,28 @@
 
 MessageBuilderGenerator::~MessageBuilderGenerator() {}
 
-void MessageBuilderGenerator::
-Generate(io::Printer* printer) {
+void MessageBuilderGenerator::Generate(io::Printer* printer) {
   WriteMessageDocComment(printer, descriptor_);
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "public static final class Builder extends\n"
-      "    com.google.protobuf.GeneratedMessage$ver$.ExtendableBuilder<\n"
-      "      $classname$, Builder> implements\n"
-      "    $extra_interfaces$\n"
-      "    $classname$OrBuilder {\n",
-      "classname", name_resolver_->GetImmutableClassName(descriptor_),
-      "extra_interfaces", ExtraBuilderInterfaces(descriptor_),
-      "ver", GeneratedCodeVersionSuffix());
+        "public static final class Builder extends\n"
+        "    com.google.protobuf.GeneratedMessage$ver$.ExtendableBuilder<\n"
+        "      $classname$, Builder> implements\n"
+        "    $extra_interfaces$\n"
+        "    $classname$OrBuilder {\n",
+        "classname", name_resolver_->GetImmutableClassName(descriptor_),
+        "extra_interfaces", ExtraBuilderInterfaces(descriptor_), "ver",
+        GeneratedCodeVersionSuffix());
   } else {
     printer->Print(
-      "public static final class Builder extends\n"
-      "    com.google.protobuf.GeneratedMessage$ver$.Builder<Builder> implements\n"
-      "    $extra_interfaces$\n"
-      "    $classname$OrBuilder {\n",
-      "classname", name_resolver_->GetImmutableClassName(descriptor_),
-      "extra_interfaces", ExtraBuilderInterfaces(descriptor_),
-      "ver", GeneratedCodeVersionSuffix());
+        "public static final class Builder extends\n"
+        "    com.google.protobuf.GeneratedMessage$ver$.Builder<Builder> "
+        "implements\n"
+        "    $extra_interfaces$\n"
+        "    $classname$OrBuilder {\n",
+        "classname", name_resolver_->GetImmutableClassName(descriptor_),
+        "extra_interfaces", ExtraBuilderInterfaces(descriptor_), "ver",
+        GeneratedCodeVersionSuffix());
   }
   printer->Indent();
 
@@ -117,31 +118,32 @@
   // oneof
   std::map<std::string, std::string> vars;
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-    vars["oneof_name"] = context_->GetOneofGeneratorInfo(
-        descriptor_->oneof_decl(i))->name;
-    vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo(
-        descriptor_->oneof_decl(i))->capitalized_name;
+    vars["oneof_name"] =
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))->name;
+    vars["oneof_capitalized_name"] =
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))
+            ->capitalized_name;
     vars["oneof_index"] = StrCat(descriptor_->oneof_decl(i)->index());
     // oneofCase_ and oneof_
     printer->Print(vars,
-      "private int $oneof_name$Case_ = 0;\n"
-      "private java.lang.Object $oneof_name$_;\n");
+                   "private int $oneof_name$Case_ = 0;\n"
+                   "private java.lang.Object $oneof_name$_;\n");
     // oneofCase() and clearOneof()
     printer->Print(vars,
-      "public $oneof_capitalized_name$Case\n"
-      "    get$oneof_capitalized_name$Case() {\n"
-      "  return $oneof_capitalized_name$Case.forNumber(\n"
-      "      $oneof_name$Case_);\n"
-      "}\n"
-      "\n"
-      "public Builder clear$oneof_capitalized_name$() {\n"
-      "  $oneof_name$Case_ = 0;\n"
-      "  $oneof_name$_ = null;\n");
+                   "public $oneof_capitalized_name$Case\n"
+                   "    get$oneof_capitalized_name$Case() {\n"
+                   "  return $oneof_capitalized_name$Case.forNumber(\n"
+                   "      $oneof_name$Case_);\n"
+                   "}\n"
+                   "\n"
+                   "public Builder clear$oneof_capitalized_name$() {\n"
+                   "  $oneof_name$Case_ = 0;\n"
+                   "  $oneof_name$_ = null;\n");
     printer->Print("  onChanged();\n");
     printer->Print(
-      "  return this;\n"
-      "}\n"
-      "\n");
+        "  return this;\n"
+        "}\n"
+        "\n");
   }
 
   // Integers for bit fields.
@@ -159,32 +161,32 @@
   for (int i = 0; i < descriptor_->field_count(); i++) {
     printer->Print("\n");
     field_generators_.get(descriptor_->field(i))
-                     .GenerateBuilderMembers(printer);
+        .GenerateBuilderMembers(printer);
   }
 
-    // Override methods declared in GeneratedMessage to return the concrete
-    // generated type so callsites won't depend on GeneratedMessage. This
-    // is needed to keep binary compatibility when we change generated code
-    // to subclass a different GeneratedMessage class (e.g., in v3.0.0 release
-    // we changed all generated code to subclass GeneratedMessageV3).
+  // Override methods declared in GeneratedMessage to return the concrete
+  // generated type so callsites won't depend on GeneratedMessage. This
+  // is needed to keep binary compatibility when we change generated code
+  // to subclass a different GeneratedMessage class (e.g., in v3.0.0 release
+  // we changed all generated code to subclass GeneratedMessageV3).
   printer->Print(
-    "@java.lang.Override\n"
-    "public final Builder setUnknownFields(\n"
-    "    final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
-    "  return super.setUnknownFields(unknownFields);\n"
-    "}\n"
-    "\n"
-    "@java.lang.Override\n"
-    "public final Builder mergeUnknownFields(\n"
-    "    final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
-    "  return super.mergeUnknownFields(unknownFields);\n"
-    "}\n"
-    "\n");
+      "@java.lang.Override\n"
+      "public final Builder setUnknownFields(\n"
+      "    final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
+      "  return super.setUnknownFields(unknownFields);\n"
+      "}\n"
+      "\n"
+      "@java.lang.Override\n"
+      "public final Builder mergeUnknownFields(\n"
+      "    final com.google.protobuf.UnknownFieldSet unknownFields) {\n"
+      "  return super.mergeUnknownFields(unknownFields);\n"
+      "}\n"
+      "\n");
 
   printer->Print(
-    "\n"
-    "// @@protoc_insertion_point(builder_scope:$full_name$)\n",
-    "full_name", descriptor_->full_name());
+      "\n"
+      "// @@protoc_insertion_point(builder_scope:$full_name$)\n",
+      "full_name", descriptor_->full_name());
 
   printer->Outdent();
   printer->Print("}\n");
@@ -192,17 +194,16 @@
 
 // ===================================================================
 
-void MessageBuilderGenerator::
-GenerateDescriptorMethods(io::Printer* printer) {
+void MessageBuilderGenerator::GenerateDescriptorMethods(io::Printer* printer) {
   if (!descriptor_->options().no_standard_descriptor_accessor()) {
     printer->Print(
-      "public static final com.google.protobuf.Descriptors.Descriptor\n"
-      "    getDescriptor() {\n"
-      "  return $fileclass$.internal_$identifier$_descriptor;\n"
-      "}\n"
-      "\n",
-      "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
-      "identifier", UniqueFileScopeIdentifier(descriptor_));
+        "public static final com.google.protobuf.Descriptors.Descriptor\n"
+        "    getDescriptor() {\n"
+        "  return $fileclass$.internal_$identifier$_descriptor;\n"
+        "}\n"
+        "\n",
+        "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
+        "identifier", UniqueFileScopeIdentifier(descriptor_));
   }
   std::vector<const FieldDescriptor*> map_fields;
   for (int i = 0; i < descriptor_->field_count(); i++) {
@@ -214,10 +215,10 @@
   }
   if (!map_fields.empty()) {
     printer->Print(
-      "@SuppressWarnings({\"rawtypes\"})\n"
-      "protected com.google.protobuf.MapField internalGetMapField(\n"
-      "    int number) {\n"
-      "  switch (number) {\n");
+        "@SuppressWarnings({\"rawtypes\"})\n"
+        "protected com.google.protobuf.MapField internalGetMapField(\n"
+        "    int number) {\n"
+        "  switch (number) {\n");
     printer->Indent();
     printer->Indent();
     for (int i = 0; i < map_fields.size(); ++i) {
@@ -239,16 +240,15 @@
         "  }\n"
         "}\n");
     printer->Print(
-      "@SuppressWarnings({\"rawtypes\"})\n"
-      "protected com.google.protobuf.MapField internalGetMutableMapField(\n"
-      "    int number) {\n"
-      "  switch (number) {\n");
+        "@SuppressWarnings({\"rawtypes\"})\n"
+        "protected com.google.protobuf.MapField internalGetMutableMapField(\n"
+        "    int number) {\n"
+        "  switch (number) {\n");
     printer->Indent();
     printer->Indent();
     for (int i = 0; i < map_fields.size(); ++i) {
       const FieldDescriptor* field = map_fields[i];
-      const FieldGeneratorInfo* info =
-          context_->GetFieldGeneratorInfo(field);
+      const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field);
       printer->Print(
           "case $number$:\n"
           "  return internalGetMutable$capitalized_name$();\n",
@@ -266,24 +266,24 @@
         "}\n");
   }
   printer->Print(
-    "@java.lang.Override\n"
-    "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n"
-    "    internalGetFieldAccessorTable() {\n"
-    "  return $fileclass$.internal_$identifier$_fieldAccessorTable\n"
-    "      .ensureFieldAccessorsInitialized(\n"
-    "          $classname$.class, $classname$.Builder.class);\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_),
-    "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
-    "identifier", UniqueFileScopeIdentifier(descriptor_),
-    "ver", GeneratedCodeVersionSuffix());
+      "@java.lang.Override\n"
+      "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n"
+      "    internalGetFieldAccessorTable() {\n"
+      "  return $fileclass$.internal_$identifier$_fieldAccessorTable\n"
+      "      .ensureFieldAccessorsInitialized(\n"
+      "          $classname$.class, $classname$.Builder.class);\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_),
+      "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
+      "identifier", UniqueFileScopeIdentifier(descriptor_), "ver",
+      GeneratedCodeVersionSuffix());
 }
 
 // ===================================================================
 
-void MessageBuilderGenerator::
-GenerateCommonBuilderMethods(io::Printer* printer) {
+void MessageBuilderGenerator::GenerateCommonBuilderMethods(
+    io::Printer* printer) {
   printer->Print(
       "// Construct using $classname$.newBuilder()\n"
       "private Builder() {\n"
@@ -293,19 +293,19 @@
       "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Print(
-    "private Builder(\n"
-    "    com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n"
-    "  super(parent);\n"
-    "  maybeForceBuilderInitialization();\n"
-    "}\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_),
-    "ver", GeneratedCodeVersionSuffix());
+      "private Builder(\n"
+      "    com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n"
+      "  super(parent);\n"
+      "  maybeForceBuilderInitialization();\n"
+      "}\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_), "ver",
+      GeneratedCodeVersionSuffix());
 
   printer->Print(
-    "private void maybeForceBuilderInitialization() {\n"
-    "  if (com.google.protobuf.GeneratedMessage$ver$\n"
-    "          .alwaysUseFieldBuilders) {\n",
-    "ver", GeneratedCodeVersionSuffix());
+      "private void maybeForceBuilderInitialization() {\n"
+      "  if (com.google.protobuf.GeneratedMessage$ver$\n"
+      "          .alwaysUseFieldBuilders) {\n",
+      "ver", GeneratedCodeVersionSuffix());
 
   printer->Indent();
   printer->Indent();
@@ -319,13 +319,13 @@
   printer->Outdent();
 
   printer->Print(
-    "  }\n"
-    "}\n");
+      "  }\n"
+      "}\n");
 
   printer->Print(
-    "@java.lang.Override\n"
-    "public Builder clear() {\n"
-    "  super.clear();\n");
+      "@java.lang.Override\n"
+      "public Builder clear() {\n"
+      "  super.clear();\n");
 
   printer->Indent();
 
@@ -338,55 +338,55 @@
 
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     printer->Print(
-      "$oneof_name$Case_ = 0;\n"
-      "$oneof_name$_ = null;\n",
-      "oneof_name", context_->GetOneofGeneratorInfo(
-          descriptor_->oneof_decl(i))->name);
+        "$oneof_name$Case_ = 0;\n"
+        "$oneof_name$_ = null;\n",
+        "oneof_name",
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))->name);
   }
 
   printer->Outdent();
 
   printer->Print(
-    "  return this;\n"
-    "}\n"
-    "\n");
+      "  return this;\n"
+      "}\n"
+      "\n");
 
   printer->Print(
-    "@java.lang.Override\n"
-    "public com.google.protobuf.Descriptors.Descriptor\n"
-    "    getDescriptorForType() {\n"
-    "  return $fileclass$.internal_$identifier$_descriptor;\n"
-    "}\n"
-    "\n",
-    "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
-    "identifier", UniqueFileScopeIdentifier(descriptor_));
+      "@java.lang.Override\n"
+      "public com.google.protobuf.Descriptors.Descriptor\n"
+      "    getDescriptorForType() {\n"
+      "  return $fileclass$.internal_$identifier$_descriptor;\n"
+      "}\n"
+      "\n",
+      "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()),
+      "identifier", UniqueFileScopeIdentifier(descriptor_));
 
   // LITE runtime implements this in GeneratedMessageLite.
   printer->Print(
-    "@java.lang.Override\n"
-    "public $classname$ getDefaultInstanceForType() {\n"
-    "  return $classname$.getDefaultInstance();\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "@java.lang.Override\n"
+      "public $classname$ getDefaultInstanceForType() {\n"
+      "  return $classname$.getDefaultInstance();\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Print(
-    "@java.lang.Override\n"
-    "public $classname$ build() {\n"
-    "  $classname$ result = buildPartial();\n"
-    "  if (!result.isInitialized()) {\n"
-    "    throw newUninitializedMessageException(result);\n"
-    "  }\n"
-    "  return result;\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "@java.lang.Override\n"
+      "public $classname$ build() {\n"
+      "  $classname$ result = buildPartial();\n"
+      "  if (!result.isInitialized()) {\n"
+      "    throw newUninitializedMessageException(result);\n"
+      "  }\n"
+      "  return result;\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Print(
-    "@java.lang.Override\n"
-    "public $classname$ buildPartial() {\n"
-    "  $classname$ result = new $classname$(this);\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "@java.lang.Override\n"
+      "public $classname$ buildPartial() {\n"
+      "  $classname$ result = new $classname$(this);\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Indent();
 
@@ -426,21 +426,20 @@
   }
 
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-    printer->Print("result.$oneof_name$Case_ = $oneof_name$Case_;\n",
-                   "oneof_name", context_->GetOneofGeneratorInfo(
-                       descriptor_->oneof_decl(i))->name);
+    printer->Print(
+        "result.$oneof_name$Case_ = $oneof_name$Case_;\n", "oneof_name",
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))->name);
   }
 
   printer->Outdent();
 
-  printer->Print(
-    "  onBuilt();\n");
+  printer->Print("  onBuilt();\n");
 
   printer->Print(
-    "  return result;\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "  return result;\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   // Override methods declared in GeneratedMessage to return the concrete
   // generated type so callsites won't depend on GeneratedMessage. This
@@ -448,190 +447,181 @@
   // to subclass a different GeneratedMessage class (e.g., in v3.0.0 release
   // we changed all generated code to subclass GeneratedMessageV3).
   printer->Print(
-    "@java.lang.Override\n"
-    "public Builder clone() {\n"
-    "  return super.clone();\n"
-    "}\n"
-    "@java.lang.Override\n"
-    "public Builder setField(\n"
-    "    com.google.protobuf.Descriptors.FieldDescriptor field,\n"
-    "    java.lang.Object value) {\n"
-    "  return super.setField(field, value);\n"
-    "}\n"
-    "@java.lang.Override\n"
-    "public Builder clearField(\n"
-    "    com.google.protobuf.Descriptors.FieldDescriptor field) {\n"
-    "  return super.clearField(field);\n"
-    "}\n"
-    "@java.lang.Override\n"
-    "public Builder clearOneof(\n"
-    "    com.google.protobuf.Descriptors.OneofDescriptor oneof) {\n"
-    "  return super.clearOneof(oneof);\n"
-    "}\n"
-    "@java.lang.Override\n"
-    "public Builder setRepeatedField(\n"
-    "    com.google.protobuf.Descriptors.FieldDescriptor field,\n"
-    "    int index, java.lang.Object value) {\n"
-    "  return super.setRepeatedField(field, index, value);\n"
-    "}\n"
-    "@java.lang.Override\n"
-    "public Builder addRepeatedField(\n"
-    "    com.google.protobuf.Descriptors.FieldDescriptor field,\n"
-    "    java.lang.Object value) {\n"
-    "  return super.addRepeatedField(field, value);\n"
-    "}\n");
+      "@java.lang.Override\n"
+      "public Builder clone() {\n"
+      "  return super.clone();\n"
+      "}\n"
+      "@java.lang.Override\n"
+      "public Builder setField(\n"
+      "    com.google.protobuf.Descriptors.FieldDescriptor field,\n"
+      "    java.lang.Object value) {\n"
+      "  return super.setField(field, value);\n"
+      "}\n"
+      "@java.lang.Override\n"
+      "public Builder clearField(\n"
+      "    com.google.protobuf.Descriptors.FieldDescriptor field) {\n"
+      "  return super.clearField(field);\n"
+      "}\n"
+      "@java.lang.Override\n"
+      "public Builder clearOneof(\n"
+      "    com.google.protobuf.Descriptors.OneofDescriptor oneof) {\n"
+      "  return super.clearOneof(oneof);\n"
+      "}\n"
+      "@java.lang.Override\n"
+      "public Builder setRepeatedField(\n"
+      "    com.google.protobuf.Descriptors.FieldDescriptor field,\n"
+      "    int index, java.lang.Object value) {\n"
+      "  return super.setRepeatedField(field, index, value);\n"
+      "}\n"
+      "@java.lang.Override\n"
+      "public Builder addRepeatedField(\n"
+      "    com.google.protobuf.Descriptors.FieldDescriptor field,\n"
+      "    java.lang.Object value) {\n"
+      "  return super.addRepeatedField(field, value);\n"
+      "}\n");
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "@java.lang.Override\n"
-      "public <Type> Builder setExtension(\n"
-      "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
-      "        $classname$, Type> extension,\n"
-      "    Type value) {\n"
-      "  return super.setExtension(extension, value);\n"
-      "}\n"
-      "@java.lang.Override\n"
-      "public <Type> Builder setExtension(\n"
-      "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
-      "        $classname$, java.util.List<Type>> extension,\n"
-      "    int index, Type value) {\n"
-      "  return super.setExtension(extension, index, value);\n"
-      "}\n"
-      "@java.lang.Override\n"
-      "public <Type> Builder addExtension(\n"
-      "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
-      "        $classname$, java.util.List<Type>> extension,\n"
-      "    Type value) {\n"
-      "  return super.addExtension(extension, value);\n"
-      "}\n"
-      "@java.lang.Override\n"
-      "public <Type> Builder clearExtension(\n"
-      "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
-      "        $classname$, ?> extension) {\n"
-      "  return super.clearExtension(extension);\n"
-      "}\n",
-      "classname", name_resolver_->GetImmutableClassName(descriptor_));
+        "@java.lang.Override\n"
+        "public <Type> Builder setExtension(\n"
+        "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
+        "        $classname$, Type> extension,\n"
+        "    Type value) {\n"
+        "  return super.setExtension(extension, value);\n"
+        "}\n"
+        "@java.lang.Override\n"
+        "public <Type> Builder setExtension(\n"
+        "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
+        "        $classname$, java.util.List<Type>> extension,\n"
+        "    int index, Type value) {\n"
+        "  return super.setExtension(extension, index, value);\n"
+        "}\n"
+        "@java.lang.Override\n"
+        "public <Type> Builder addExtension(\n"
+        "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
+        "        $classname$, java.util.List<Type>> extension,\n"
+        "    Type value) {\n"
+        "  return super.addExtension(extension, value);\n"
+        "}\n"
+        "@java.lang.Override\n"
+        "public <Type> Builder clearExtension(\n"
+        "    com.google.protobuf.GeneratedMessage.GeneratedExtension<\n"
+        "        $classname$, ?> extension) {\n"
+        "  return super.clearExtension(extension);\n"
+        "}\n",
+        "classname", name_resolver_->GetImmutableClassName(descriptor_));
   }
 
   // -----------------------------------------------------------------
 
   if (context_->HasGeneratedMethods(descriptor_)) {
     printer->Print(
-      "@java.lang.Override\n"
-      "public Builder mergeFrom(com.google.protobuf.Message other) {\n"
-      "  if (other instanceof $classname$) {\n"
-      "    return mergeFrom(($classname$)other);\n"
-      "  } else {\n"
-      "    super.mergeFrom(other);\n"
-      "    return this;\n"
-      "  }\n"
-      "}\n"
-      "\n",
-      "classname", name_resolver_->GetImmutableClassName(descriptor_));
+        "@java.lang.Override\n"
+        "public Builder mergeFrom(com.google.protobuf.Message other) {\n"
+        "  if (other instanceof $classname$) {\n"
+        "    return mergeFrom(($classname$)other);\n"
+        "  } else {\n"
+        "    super.mergeFrom(other);\n"
+        "    return this;\n"
+        "  }\n"
+        "}\n"
+        "\n",
+        "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
     printer->Print(
-      "public Builder mergeFrom($classname$ other) {\n"
-      // Optimization:  If other is the default instance, we know none of its
-      //   fields are set so we can skip the merge.
-      "  if (other == $classname$.getDefaultInstance()) return this;\n",
-      "classname", name_resolver_->GetImmutableClassName(descriptor_));
+        "public Builder mergeFrom($classname$ other) {\n"
+        // Optimization:  If other is the default instance, we know none of its
+        //   fields are set so we can skip the merge.
+        "  if (other == $classname$.getDefaultInstance()) return this;\n",
+        "classname", name_resolver_->GetImmutableClassName(descriptor_));
     printer->Indent();
 
     for (int i = 0; i < descriptor_->field_count(); i++) {
       if (!descriptor_->field(i)->containing_oneof()) {
-        field_generators_.get(
-            descriptor_->field(i)).GenerateMergingCode(printer);
+        field_generators_.get(descriptor_->field(i))
+            .GenerateMergingCode(printer);
       }
     }
 
     // Merge oneof fields.
     for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) {
-      printer->Print(
-        "switch (other.get$oneof_capitalized_name$Case()) {\n",
-        "oneof_capitalized_name",
-        context_->GetOneofGeneratorInfo(
-            descriptor_->oneof_decl(i))->capitalized_name);
+      printer->Print("switch (other.get$oneof_capitalized_name$Case()) {\n",
+                     "oneof_capitalized_name",
+                     context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))
+                         ->capitalized_name);
       printer->Indent();
       for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
         const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
-        printer->Print(
-          "case $field_name$: {\n",
-          "field_name",
-          ToUpper(field->name()));
+        printer->Print("case $field_name$: {\n", "field_name",
+                       ToUpper(field->name()));
         printer->Indent();
         field_generators_.get(field).GenerateMergingCode(printer);
-        printer->Print(
-            "break;\n");
+        printer->Print("break;\n");
         printer->Outdent();
-        printer->Print(
-            "}\n");
+        printer->Print("}\n");
       }
       printer->Print(
-        "case $cap_oneof_name$_NOT_SET: {\n"
-        "  break;\n"
-        "}\n",
-        "cap_oneof_name",
-        ToUpper(context_->GetOneofGeneratorInfo(
-            descriptor_->oneof_decl(i))->name));
+          "case $cap_oneof_name$_NOT_SET: {\n"
+          "  break;\n"
+          "}\n",
+          "cap_oneof_name",
+          ToUpper(
+              context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))
+                  ->name));
       printer->Outdent();
-      printer->Print(
-          "}\n");
+      printer->Print("}\n");
     }
 
     printer->Outdent();
 
     // if message type has extensions
     if (descriptor_->extension_range_count() > 0) {
-      printer->Print(
-        "  this.mergeExtensionFields(other);\n");
+      printer->Print("  this.mergeExtensionFields(other);\n");
     }
 
-    printer->Print(
-      "  this.mergeUnknownFields(other.unknownFields);\n");
+    printer->Print("  this.mergeUnknownFields(other.unknownFields);\n");
+
+    printer->Print("  onChanged();\n");
 
     printer->Print(
-      "  onChanged();\n");
-
-    printer->Print(
-      "  return this;\n"
-      "}\n"
-      "\n");
+        "  return this;\n"
+        "}\n"
+        "\n");
   }
 }
 
 // ===================================================================
 
-void MessageBuilderGenerator::
-GenerateBuilderParsingMethods(io::Printer* printer) {
+void MessageBuilderGenerator::GenerateBuilderParsingMethods(
+    io::Printer* printer) {
   printer->Print(
-    "@java.lang.Override\n"
-    "public Builder mergeFrom(\n"
-    "    com.google.protobuf.CodedInputStream input,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws java.io.IOException {\n"
-    "  $classname$ parsedMessage = null;\n"
-    "  try {\n"
-    "    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);\n"
-    "  } catch (com.google.protobuf.InvalidProtocolBufferException e) {\n"
-    "    parsedMessage = ($classname$) e.getUnfinishedMessage();\n"
-    "    throw e.unwrapIOException();\n"
-    "  } finally {\n"
-    "    if (parsedMessage != null) {\n"
-    "      mergeFrom(parsedMessage);\n"
-    "    }\n"
-    "  }\n"
-    "  return this;\n"
-    "}\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "@java.lang.Override\n"
+      "public Builder mergeFrom(\n"
+      "    com.google.protobuf.CodedInputStream input,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws java.io.IOException {\n"
+      "  $classname$ parsedMessage = null;\n"
+      "  try {\n"
+      "    parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);\n"
+      "  } catch (com.google.protobuf.InvalidProtocolBufferException e) {\n"
+      "    parsedMessage = ($classname$) e.getUnfinishedMessage();\n"
+      "    throw e.unwrapIOException();\n"
+      "  } finally {\n"
+      "    if (parsedMessage != null) {\n"
+      "      mergeFrom(parsedMessage);\n"
+      "    }\n"
+      "  }\n"
+      "  return this;\n"
+      "}\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 }
 
 // ===================================================================
 
-void MessageBuilderGenerator::GenerateIsInitialized(
-    io::Printer* printer) {
+void MessageBuilderGenerator::GenerateIsInitialized(io::Printer* printer) {
   printer->Print(
-    "@java.lang.Override\n"
-    "public final boolean isInitialized() {\n");
+      "@java.lang.Override\n"
+      "public final boolean isInitialized() {\n");
   printer->Indent();
 
   // Check that all required fields in this message are set.
@@ -643,10 +633,10 @@
 
     if (field->is_required()) {
       printer->Print(
-        "if (!has$name$()) {\n"
-        "  return false;\n"
-        "}\n",
-        "name", info->capitalized_name);
+          "if (!has$name$()) {\n"
+          "  return false;\n"
+          "}\n",
+          "name", info->capitalized_name);
     }
   }
 
@@ -659,12 +649,12 @@
       switch (field->label()) {
         case FieldDescriptor::LABEL_REQUIRED:
           printer->Print(
-            "if (!get$name$().isInitialized()) {\n"
-             "  return false;\n"
-             "}\n",
-            "type", name_resolver_->GetImmutableClassName(
-                field->message_type()),
-            "name", info->capitalized_name);
+              "if (!get$name$().isInitialized()) {\n"
+              "  return false;\n"
+              "}\n",
+              "type",
+              name_resolver_->GetImmutableClassName(field->message_type()),
+              "name", info->capitalized_name);
           break;
         case FieldDescriptor::LABEL_OPTIONAL:
           if (!SupportFieldPresence(descriptor_->file()) &&
@@ -676,38 +666,38 @@
                            "oneof_name", oneof_info->name, "field_number",
                            StrCat(field->number()));
           } else {
-            printer->Print(
-              "if (has$name$()) {\n",
-              "name", info->capitalized_name);
+            printer->Print("if (has$name$()) {\n", "name",
+                           info->capitalized_name);
           }
           printer->Print(
-            "  if (!get$name$().isInitialized()) {\n"
-            "    return false;\n"
-            "  }\n"
-            "}\n",
-            "name", info->capitalized_name);
+              "  if (!get$name$().isInitialized()) {\n"
+              "    return false;\n"
+              "  }\n"
+              "}\n",
+              "name", info->capitalized_name);
           break;
         case FieldDescriptor::LABEL_REPEATED:
           if (IsMapEntry(field->message_type())) {
             printer->Print(
-              "for ($type$ item : get$name$Map().values()) {\n"
-              "  if (!item.isInitialized()) {\n"
-              "    return false;\n"
-              "  }\n"
-              "}\n",
-              "type", MapValueImmutableClassdName(field->message_type(),
-                                                  name_resolver_),
-              "name", info->capitalized_name);
+                "for ($type$ item : get$name$Map().values()) {\n"
+                "  if (!item.isInitialized()) {\n"
+                "    return false;\n"
+                "  }\n"
+                "}\n",
+                "type",
+                MapValueImmutableClassdName(field->message_type(),
+                                            name_resolver_),
+                "name", info->capitalized_name);
           } else {
             printer->Print(
-              "for (int i = 0; i < get$name$Count(); i++) {\n"
-              "  if (!get$name$(i).isInitialized()) {\n"
-              "    return false;\n"
-              "  }\n"
-              "}\n",
-              "type", name_resolver_->GetImmutableClassName(
-                  field->message_type()),
-              "name", info->capitalized_name);
+                "for (int i = 0; i < get$name$Count(); i++) {\n"
+                "  if (!get$name$(i).isInitialized()) {\n"
+                "    return false;\n"
+                "  }\n"
+                "}\n",
+                "type",
+                name_resolver_->GetImmutableClassName(field->message_type()),
+                "name", info->capitalized_name);
           }
           break;
       }
@@ -716,17 +706,17 @@
 
   if (descriptor_->extension_range_count() > 0) {
     printer->Print(
-      "if (!extensionsAreInitialized()) {\n"
-      "  return false;\n"
-      "}\n");
+        "if (!extensionsAreInitialized()) {\n"
+        "  return false;\n"
+        "}\n");
   }
 
   printer->Outdent();
 
   printer->Print(
-    "  return true;\n"
-    "}\n"
-    "\n");
+      "  return true;\n"
+      "}\n"
+      "\n");
 }
 
 // ===================================================================
diff --git a/src/google/protobuf/compiler/java/java_message_builder.h b/src/google/protobuf/compiler/java/java_message_builder.h
index d67a9c9..a31d0ba 100644
--- a/src/google/protobuf/compiler/java/java_message_builder.h
+++ b/src/google/protobuf/compiler/java/java_message_builder.h
@@ -35,8 +35,8 @@
 #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_BUILDER_H__
 #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_BUILDER_H__
 
-#include <string>
 #include <map>
+#include <string>
 #include <google/protobuf/compiler/java/java_field.h>
 
 namespace google {
diff --git a/src/google/protobuf/compiler/java/java_message_builder_lite.cc b/src/google/protobuf/compiler/java/java_message_builder_lite.cc
index 0e2de15..ae34499 100644
--- a/src/google/protobuf/compiler/java/java_message_builder_lite.cc
+++ b/src/google/protobuf/compiler/java/java_message_builder_lite.cc
@@ -61,9 +61,10 @@
 
 MessageBuilderLiteGenerator::MessageBuilderLiteGenerator(
     const Descriptor* descriptor, Context* context)
-  : descriptor_(descriptor), context_(context),
-    name_resolver_(context->GetNameResolver()),
-    field_generators_(descriptor, context_) {
+    : descriptor_(descriptor),
+      context_(context),
+      name_resolver_(context->GetNameResolver()),
+      field_generators_(descriptor, context_) {
   GOOGLE_CHECK(!HasDescriptorMethods(descriptor->file(), context->EnforceLite()))
       << "Generator factory error: A lite message generator is used to "
          "generate non-lite messages.";
@@ -71,19 +72,17 @@
 
 MessageBuilderLiteGenerator::~MessageBuilderLiteGenerator() {}
 
-void MessageBuilderLiteGenerator::
-Generate(io::Printer* printer) {
+void MessageBuilderLiteGenerator::Generate(io::Printer* printer) {
   WriteMessageDocComment(printer, descriptor_);
   printer->Print(
-    "public static final class Builder extends\n"
-    "    com.google.protobuf.GeneratedMessageLite.$extendible$Builder<\n"
-    "      $classname$, Builder> implements\n"
-    "    $extra_interfaces$\n"
-    "    $classname$OrBuilder {\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_),
-    "extra_interfaces", ExtraBuilderInterfaces(descriptor_),
-    "extendible",
-    descriptor_->extension_range_count() > 0 ? "Extendable" : "");
+      "public static final class Builder extends\n"
+      "    com.google.protobuf.GeneratedMessageLite.$extendible$Builder<\n"
+      "      $classname$, Builder> implements\n"
+      "    $extra_interfaces$\n"
+      "    $classname$OrBuilder {\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_),
+      "extra_interfaces", ExtraBuilderInterfaces(descriptor_), "extendible",
+      descriptor_->extension_range_count() > 0 ? "Extendable" : "");
   printer->Indent();
 
   GenerateCommonBuilderMethods(printer);
@@ -91,38 +90,39 @@
   // oneof
   std::map<std::string, std::string> vars;
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-    vars["oneof_name"] = context_->GetOneofGeneratorInfo(
-        descriptor_->oneof_decl(i))->name;
-    vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo(
-        descriptor_->oneof_decl(i))->capitalized_name;
+    vars["oneof_name"] =
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))->name;
+    vars["oneof_capitalized_name"] =
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))
+            ->capitalized_name;
     vars["oneof_index"] = StrCat(descriptor_->oneof_decl(i)->index());
 
     // oneofCase() and clearOneof()
     printer->Print(vars,
-      "@java.lang.Override\n"
-      "public $oneof_capitalized_name$Case\n"
-      "    get$oneof_capitalized_name$Case() {\n"
-      "  return instance.get$oneof_capitalized_name$Case();\n"
-      "}\n"
-      "\n"
-      "public Builder clear$oneof_capitalized_name$() {\n"
-      "  copyOnWrite();\n"
-      "  instance.clear$oneof_capitalized_name$();\n"
-      "  return this;\n"
-      "}\n"
-      "\n");
+                   "@java.lang.Override\n"
+                   "public $oneof_capitalized_name$Case\n"
+                   "    get$oneof_capitalized_name$Case() {\n"
+                   "  return instance.get$oneof_capitalized_name$Case();\n"
+                   "}\n"
+                   "\n"
+                   "public Builder clear$oneof_capitalized_name$() {\n"
+                   "  copyOnWrite();\n"
+                   "  instance.clear$oneof_capitalized_name$();\n"
+                   "  return this;\n"
+                   "}\n"
+                   "\n");
   }
 
   for (int i = 0; i < descriptor_->field_count(); i++) {
     printer->Print("\n");
     field_generators_.get(descriptor_->field(i))
-                     .GenerateBuilderMembers(printer);
+        .GenerateBuilderMembers(printer);
   }
 
   printer->Print(
-    "\n"
-    "// @@protoc_insertion_point(builder_scope:$full_name$)\n",
-    "full_name", descriptor_->full_name());
+      "\n"
+      "// @@protoc_insertion_point(builder_scope:$full_name$)\n",
+      "full_name", descriptor_->full_name());
 
   printer->Outdent();
   printer->Print("}\n");
@@ -130,15 +130,15 @@
 
 // ===================================================================
 
-void MessageBuilderLiteGenerator::
-GenerateCommonBuilderMethods(io::Printer* printer) {
+void MessageBuilderLiteGenerator::GenerateCommonBuilderMethods(
+    io::Printer* printer) {
   printer->Print(
-    "// Construct using $classname$.newBuilder()\n"
-    "private Builder() {\n"
-    "  super(DEFAULT_INSTANCE);\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "// Construct using $classname$.newBuilder()\n"
+      "private Builder() {\n"
+      "  super(DEFAULT_INSTANCE);\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 }
 
 // ===================================================================
diff --git a/src/google/protobuf/compiler/java/java_message_builder_lite.h b/src/google/protobuf/compiler/java/java_message_builder_lite.h
index 079d86a..e0a48dc 100644
--- a/src/google/protobuf/compiler/java/java_message_builder_lite.h
+++ b/src/google/protobuf/compiler/java/java_message_builder_lite.h
@@ -35,8 +35,8 @@
 #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_BUILDER_LITE_H__
 #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_BUILDER_LITE_H__
 
-#include <string>
 #include <map>
+#include <string>
 #include <google/protobuf/compiler/java/java_field.h>
 
 namespace google {
diff --git a/src/google/protobuf/compiler/java/java_message_field.cc b/src/google/protobuf/compiler/java/java_message_field.cc
index 011cc56..8c57675 100644
--- a/src/google/protobuf/compiler/java/java_message_field.cc
+++ b/src/google/protobuf/compiler/java/java_message_field.cc
@@ -36,9 +36,9 @@
 #include <string>
 
 #include <google/protobuf/compiler/java/java_context.h>
-#include <google/protobuf/compiler/java/java_message_field.h>
 #include <google/protobuf/compiler/java/java_doc_comment.h>
 #include <google/protobuf/compiler/java/java_helpers.h>
+#include <google/protobuf/compiler/java/java_message_field.h>
 #include <google/protobuf/compiler/java/java_name_resolver.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/wire_format.h>
@@ -62,17 +62,17 @@
   (*variables)["mutable_type"] =
       name_resolver->GetMutableClassName(descriptor->message_type());
   (*variables)["group_or_message"] =
-    (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ?
-    "Group" : "Message";
+      (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ? "Group"
+                                                           : "Message";
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
-  (*variables)["deprecation"] = descriptor->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  (*variables)["deprecation"] =
+      descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
   (*variables)["on_changed"] = "onChanged();";
   (*variables)["ver"] = GeneratedCodeVersionSuffix();
   (*variables)["get_parser"] =
-      ExposePublicParser(descriptor->message_type()->file())
-          ? "PARSER" : "parser()";
+      ExposePublicParser(descriptor->message_type()->file()) ? "PARSER"
+                                                             : "parser()";
 
   if (SupportFieldPresence(descriptor->file())) {
     // For singular messages and builders, one bit is used for the hasField bit.
@@ -119,17 +119,17 @@
 
 // ===================================================================
 
-ImmutableMessageFieldGenerator::
-ImmutableMessageFieldGenerator(const FieldDescriptor* descriptor,
-                      int messageBitIndex,
-                      int builderBitIndex,
-                      Context* context)
-  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
-    builderBitIndex_(builderBitIndex), context_(context),
-    name_resolver_(context->GetNameResolver()) {
-    SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
-                        context->GetFieldGeneratorInfo(descriptor),
-                        name_resolver_, &variables_);
+ImmutableMessageFieldGenerator::ImmutableMessageFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : descriptor_(descriptor),
+      messageBitIndex_(messageBitIndex),
+      builderBitIndex_(builderBitIndex),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
+  SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
+                      context->GetFieldGeneratorInfo(descriptor),
+                      name_resolver_, &variables_);
 }
 
 ImmutableMessageFieldGenerator::~ImmutableMessageFieldGenerator() {}
@@ -142,78 +142,80 @@
   return GetNumBitsForMessage();
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void ImmutableMessageFieldGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   // TODO(jonp): In the future, consider having a method specific to the
   // interface so that builders can choose dynamically to either return a
   // message or a nested builder, so that asking for the interface doesn't
   // cause a message to ever be built.
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$boolean has$capitalized_name$();\n");
+  printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n");
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$();\n");
+  printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n");
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder();\n");
+  printer->Print(
+      variables_,
+      "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder();\n");
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private $type$ $name$_;\n");
+void ImmutableMessageFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_, "private $type$ $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
 
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-      "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+        "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
 
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public $type$OrBuilder "
-      "${$get$capitalized_name$OrBuilder$}$() {\n"
-      "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public $type$OrBuilder "
+        "${$get$capitalized_name$OrBuilder$}$() {\n"
+        "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   } else {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $name$_ != null;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $name$_ != null;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-      "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+        "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
 
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$public $type$OrBuilder "
-      "${$get$capitalized_name$OrBuilder$}$() {\n"
-      "  return get$capitalized_name$();\n"
-      "}\n");
+                   "$deprecation$public $type$OrBuilder "
+                   "${$get$capitalized_name$OrBuilder$}$() {\n"
+                   "  return get$capitalized_name$();\n"
+                   "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 }
 
 void ImmutableMessageFieldGenerator::PrintNestedBuilderCondition(
-    io::Printer* printer,
-    const char* regular_case,
+    io::Printer* printer, const char* regular_case,
     const char* nested_builder_case) const {
   printer->Print(variables_, "if ($name$Builder_ == null) {\n");
   printer->Indent();
@@ -227,10 +229,8 @@
 }
 
 void ImmutableMessageFieldGenerator::PrintNestedBuilderFunction(
-    io::Printer* printer,
-    const char* method_prototype,
-    const char* regular_case,
-    const char* nested_builder_case,
+    io::Printer* printer, const char* method_prototype,
+    const char* regular_case, const char* nested_builder_case,
     const char* trailing_code) const {
   printer->Print(variables_, method_prototype);
   printer->Annotate("{", "}", descriptor_);
@@ -244,8 +244,8 @@
   printer->Print("}\n");
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutableMessageFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   // When using nested-builders, the code initially works just like the
   // non-nested builder case. It only creates a nested builder lazily on
   // demand and then forever delegates to it after creation.
@@ -255,11 +255,11 @@
   printer->Print(variables_, "private $type$ $name$_;\n");
 
   printer->Print(variables_,
-      // If this builder is non-null, it is used and the other fields are
-      // ignored.
-      "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
-      "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
-      "\n");
+                 // If this builder is non-null, it is used and the other fields
+                 // are ignored.
+                 "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
+                 "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
+                 "\n");
 
   // The comments above the methods below are based on a hypothetical
   // field of type "Field" called "Field".
@@ -267,178 +267,178 @@
   // boolean hasField()
   WriteFieldDocComment(printer, descriptor_);
   if (support_field_presence) {
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_builder$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_builder$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   } else {
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $name$Builder_ != null || $name$_ != null;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $name$Builder_ != null || $name$_ != null;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   // Field getField()
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$()",
-    "return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n",
-    "return $name$Builder_.getMessage();\n",
-    NULL);
+  PrintNestedBuilderFunction(
+      printer, "$deprecation$public $type$ ${$get$capitalized_name$$}$()",
+      "return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n",
+      "return $name$Builder_.getMessage();\n", NULL);
 
   // Field.Builder setField(Field value)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value)",
 
-    "if (value == null) {\n"
-    "  throw new NullPointerException();\n"
-    "}\n"
-    "$name$_ = value;\n"
-    "$on_changed$\n",
+      "if (value == null) {\n"
+      "  throw new NullPointerException();\n"
+      "}\n"
+      "$name$_ = value;\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.setMessage(value);\n",
+      "$name$Builder_.setMessage(value);\n",
 
-    "$set_has_field_bit_builder$\n"
-    "return this;\n");
+      "$set_has_field_bit_builder$\n"
+      "return this;\n");
 
   // Field.Builder setField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    $type$.Builder builderForValue)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+      "    $type$.Builder builderForValue)",
 
-    "$name$_ = builderForValue.build();\n"
-    "$on_changed$\n",
+      "$name$_ = builderForValue.build();\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.setMessage(builderForValue.build());\n",
+      "$name$Builder_.setMessage(builderForValue.build());\n",
 
-    "$set_has_field_bit_builder$\n"
-    "return this;\n");
+      "$set_has_field_bit_builder$\n"
+      "return this;\n");
 
   // Field.Builder mergeField(Field value)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)",
 
-    support_field_presence
-        ? "if ($get_has_field_bit_builder$ &&\n"
-          "    $name$_ != null &&\n"
-          "    $name$_ != $type$.getDefaultInstance()) {\n"
-          "  $name$_ =\n"
-          "    $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
-          "} else {\n"
-          "  $name$_ = value;\n"
-          "}\n"
-          "$on_changed$\n"
-        : "if ($name$_ != null) {\n"
-          "  $name$_ =\n"
-          "    $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
-          "} else {\n"
-          "  $name$_ = value;\n"
-          "}\n"
-          "$on_changed$\n",
+      support_field_presence
+          ? "if ($get_has_field_bit_builder$ &&\n"
+            "    $name$_ != null &&\n"
+            "    $name$_ != $type$.getDefaultInstance()) {\n"
+            "  $name$_ =\n"
+            "    $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
+            "} else {\n"
+            "  $name$_ = value;\n"
+            "}\n"
+            "$on_changed$\n"
+          : "if ($name$_ != null) {\n"
+            "  $name$_ =\n"
+            "    $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
+            "} else {\n"
+            "  $name$_ = value;\n"
+            "}\n"
+            "$on_changed$\n",
 
-    "$name$Builder_.mergeFrom(value);\n",
+      "$name$Builder_.mergeFrom(value);\n",
 
-    "$set_has_field_bit_builder$\n"
-    "return this;\n");
+      "$set_has_field_bit_builder$\n"
+      "return this;\n");
 
   // Field.Builder clearField()
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
-
-    "$name$_ = null;\n"
-    "$on_changed$\n",
-
-    support_field_presence
-        ? "$name$Builder_.clear();\n"
-        : "$name$_ = null;\n"
-          "$name$Builder_ = null;\n",
-
-    "$clear_has_field_bit_builder$\n"
-    "return this;\n");
-
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public $type$.Builder "
-    "${$get$capitalized_name$Builder$}$() {\n"
-    "  $set_has_field_bit_builder$\n"
-    "  $on_changed$\n"
-    "  return get$capitalized_name$FieldBuilder().getBuilder();\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public $type$OrBuilder "
-    "${$get$capitalized_name$OrBuilder$}$() {\n"
-    "  if ($name$Builder_ != null) {\n"
-    "    return $name$Builder_.getMessageOrBuilder();\n"
-    "  } else {\n"
-    "    return $name$_ == null ?\n"
-    "        $type$.getDefaultInstance() : $name$_;\n"
-    "  }\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
-    "    $type$, $type$.Builder, $type$OrBuilder> \n"
-    "    get$capitalized_name$FieldBuilder() {\n"
-    "  if ($name$Builder_ == null) {\n"
-    "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder$ver$<\n"
-    "        $type$, $type$.Builder, $type$OrBuilder>(\n"
-    "            get$capitalized_name$(),\n"
-    "            getParentForChildren(),\n"
-    "            isClean());\n"
-    "    $name$_ = null;\n"
-    "  }\n"
-    "  return $name$Builder_;\n"
-    "}\n");
-}
-
-void ImmutableMessageFieldGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
-  if (SupportFieldPresence(descriptor_->file())) {
-    printer->Print(variables_,
-      "get$capitalized_name$FieldBuilder();\n");
-  }
-}
-
-
-void ImmutableMessageFieldGenerator::
-GenerateInitializationCode(io::Printer* printer) const {}
-
-void ImmutableMessageFieldGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
-  if (SupportFieldPresence(descriptor_->file())) {
-    PrintNestedBuilderCondition(printer,
-      "$name$_ = null;\n",
-
-      "$name$Builder_.clear();\n");
-    printer->Print(variables_, "$clear_has_field_bit_builder$\n");
-  } else {
-    PrintNestedBuilderCondition(printer,
-      "$name$_ = null;\n",
+  PrintNestedBuilderFunction(
+      printer, "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
 
       "$name$_ = null;\n"
-      "$name$Builder_ = null;\n");
+      "$on_changed$\n",
+
+      support_field_presence ? "$name$Builder_.clear();\n"
+                             : "$name$_ = null;\n"
+                               "$name$Builder_ = null;\n",
+
+      "$clear_has_field_bit_builder$\n"
+      "return this;\n");
+
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public $type$.Builder "
+                 "${$get$capitalized_name$Builder$}$() {\n"
+                 "  $set_has_field_bit_builder$\n"
+                 "  $on_changed$\n"
+                 "  return get$capitalized_name$FieldBuilder().getBuilder();\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public $type$OrBuilder "
+                 "${$get$capitalized_name$OrBuilder$}$() {\n"
+                 "  if ($name$Builder_ != null) {\n"
+                 "    return $name$Builder_.getMessageOrBuilder();\n"
+                 "  } else {\n"
+                 "    return $name$_ == null ?\n"
+                 "        $type$.getDefaultInstance() : $name$_;\n"
+                 "  }\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
+      "    $type$, $type$.Builder, $type$OrBuilder> \n"
+      "    get$capitalized_name$FieldBuilder() {\n"
+      "  if ($name$Builder_ == null) {\n"
+      "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder$ver$<\n"
+      "        $type$, $type$.Builder, $type$OrBuilder>(\n"
+      "            get$capitalized_name$(),\n"
+      "            getParentForChildren(),\n"
+      "            isClean());\n"
+      "    $name$_ = null;\n"
+      "  }\n"
+      "  return $name$Builder_;\n"
+      "}\n");
+}
+
+void ImmutableMessageFieldGenerator::GenerateFieldBuilderInitializationCode(
+    io::Printer* printer) const {
+  if (SupportFieldPresence(descriptor_->file())) {
+    printer->Print(variables_, "get$capitalized_name$FieldBuilder();\n");
   }
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (other.has$capitalized_name$()) {\n"
-    "  merge$capitalized_name$(other.get$capitalized_name$());\n"
-    "}\n");
+void ImmutableMessageFieldGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {}
+
+void ImmutableMessageFieldGenerator::GenerateBuilderClearCode(
+    io::Printer* printer) const {
+  if (SupportFieldPresence(descriptor_->file())) {
+    PrintNestedBuilderCondition(printer, "$name$_ = null;\n",
+
+                                "$name$Builder_.clear();\n");
+    printer->Print(variables_, "$clear_has_field_bit_builder$\n");
+  } else {
+    PrintNestedBuilderCondition(printer, "$name$_ = null;\n",
+
+                                "$name$_ = null;\n"
+                                "$name$Builder_ = null;\n");
+  }
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void ImmutableMessageFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
+  printer->Print(variables_,
+                 "if (other.has$capitalized_name$()) {\n"
+                 "  merge$capitalized_name$(other.get$capitalized_name$());\n"
+                 "}\n");
+}
+
+void ImmutableMessageFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     printer->Print(variables_, "if ($get_has_field_bit_from_local$) {\n");
     printer->Indent();
@@ -454,65 +454,68 @@
   }
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void ImmutableMessageFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$type$.Builder subBuilder = null;\n"
-    "if ($is_field_present_message$) {\n"
-    "  subBuilder = $name$_.toBuilder();\n"
-    "}\n");
+                 "$type$.Builder subBuilder = null;\n"
+                 "if ($is_field_present_message$) {\n"
+                 "  subBuilder = $name$_.toBuilder();\n"
+                 "}\n");
 
   if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
     printer->Print(variables_,
-      "$name$_ = input.readGroup($number$, $type$.$get_parser$,\n"
-      "    extensionRegistry);\n");
+                   "$name$_ = input.readGroup($number$, $type$.$get_parser$,\n"
+                   "    extensionRegistry);\n");
   } else {
     printer->Print(variables_,
-      "$name$_ = input.readMessage($type$.$get_parser$, extensionRegistry);\n");
+                   "$name$_ = input.readMessage($type$.$get_parser$, "
+                   "extensionRegistry);\n");
   }
 
   printer->Print(variables_,
-    "if (subBuilder != null) {\n"
-    "  subBuilder.mergeFrom($name$_);\n"
-    "  $name$_ = subBuilder.buildPartial();\n"
-    "}\n"
-    "$set_has_field_bit_message$\n");
+                 "if (subBuilder != null) {\n"
+                 "  subBuilder.mergeFrom($name$_);\n"
+                 "  $name$_ = subBuilder.buildPartial();\n"
+                 "}\n"
+                 "$set_has_field_bit_message$\n");
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
+void ImmutableMessageFieldGenerator::GenerateParsingDoneCode(
+    io::Printer* printer) const {
   // noop for messages.
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  output.write$group_or_message$($number$, get$capitalized_name$());\n"
-    "}\n");
+void ImmutableMessageFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if ($is_field_present_message$) {\n"
+      "  output.write$group_or_message$($number$, get$capitalized_name$());\n"
+      "}\n");
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .compute$group_or_message$Size($number$, get$capitalized_name$());\n"
-    "}\n");
+void ImmutableMessageFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if ($is_field_present_message$) {\n"
+      "  size += com.google.protobuf.CodedOutputStream\n"
+      "    .compute$group_or_message$Size($number$, get$capitalized_name$());\n"
+      "}\n");
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
+void ImmutableMessageFieldGenerator::GenerateEqualsCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if (!get$capitalized_name$()\n"
-    "    .equals(other.get$capitalized_name$())) return false;\n");
+                 "if (!get$capitalized_name$()\n"
+                 "    .equals(other.get$capitalized_name$())) return false;\n");
 }
 
-void ImmutableMessageFieldGenerator::
-GenerateHashCode(io::Printer* printer) const {
+void ImmutableMessageFieldGenerator::GenerateHashCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "hash = (37 * hash) + $constant_name$;\n"
-    "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
+                 "hash = (37 * hash) + $constant_name$;\n"
+                 "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
 }
 
 std::string ImmutableMessageFieldGenerator::GetBoxedType() const {
@@ -521,63 +524,60 @@
 
 // ===================================================================
 
-ImmutableMessageOneofFieldGenerator::
-ImmutableMessageOneofFieldGenerator(const FieldDescriptor* descriptor,
-                                 int messageBitIndex,
-                                 int builderBitIndex,
-                                 Context* context)
-    : ImmutableMessageFieldGenerator(
-          descriptor, messageBitIndex, builderBitIndex, context) {
+ImmutableMessageOneofFieldGenerator::ImmutableMessageOneofFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : ImmutableMessageFieldGenerator(descriptor, messageBitIndex,
+                                     builderBitIndex, context) {
   const OneofGeneratorInfo* info =
       context->GetOneofGeneratorInfo(descriptor->containing_oneof());
   SetCommonOneofVariables(descriptor, info, &variables_);
 }
 
-ImmutableMessageOneofFieldGenerator::
-~ImmutableMessageOneofFieldGenerator() {}
+ImmutableMessageOneofFieldGenerator::~ImmutableMessageOneofFieldGenerator() {}
 
-void ImmutableMessageOneofFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutableMessageOneofFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-    "  return $has_oneof_case_message$;\n"
-    "}\n");
+                 "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+                 "  return $has_oneof_case_message$;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "     return ($type$) $oneof_name$_;\n"
-    "  }\n"
-    "  return $type$.getDefaultInstance();\n"
-    "}\n");
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "     return ($type$) $oneof_name$_;\n"
+                 "  }\n"
+                 "  return $type$.getDefaultInstance();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$OrBuilder "
-    "${$get$capitalized_name$OrBuilder$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "     return ($type$) $oneof_name$_;\n"
-    "  }\n"
-    "  return $type$.getDefaultInstance();\n"
-    "}\n");
+                 "$deprecation$public $type$OrBuilder "
+                 "${$get$capitalized_name$OrBuilder$}$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "     return ($type$) $oneof_name$_;\n"
+                 "  }\n"
+                 "  return $type$.getDefaultInstance();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableMessageOneofFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutableMessageOneofFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   // When using nested-builders, the code initially works just like the
   // non-nested builder case. It only creates a nested builder lazily on
   // demand and then forever delegates to it after creation.
   printer->Print(variables_,
-    // If this builder is non-null, it is used and the other fields are
-    // ignored.
-    "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
-    "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
-    "\n");
+                 // If this builder is non-null, it is used and the other fields
+                 // are ignored.
+                 "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
+                 "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
+                 "\n");
 
   // The comments above the methods below are based on a hypothetical
   // field of type "Field" called "Field".
@@ -585,226 +585,232 @@
   // boolean hasField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-    "  return $has_oneof_case_message$;\n"
-    "}\n");
+                 "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+                 "  return $has_oneof_case_message$;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field getField()
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$()",
+  PrintNestedBuilderFunction(
+      printer, "$deprecation$public $type$ ${$get$capitalized_name$$}$()",
 
-    "if ($has_oneof_case_message$) {\n"
-    "  return ($type$) $oneof_name$_;\n"
-    "}\n"
-    "return $type$.getDefaultInstance();\n",
+      "if ($has_oneof_case_message$) {\n"
+      "  return ($type$) $oneof_name$_;\n"
+      "}\n"
+      "return $type$.getDefaultInstance();\n",
 
-    "if ($has_oneof_case_message$) {\n"
-    "  return $name$Builder_.getMessage();\n"
-    "}\n"
-    "return $type$.getDefaultInstance();\n",
+      "if ($has_oneof_case_message$) {\n"
+      "  return $name$Builder_.getMessage();\n"
+      "}\n"
+      "return $type$.getDefaultInstance();\n",
 
-    NULL);
+      NULL);
 
   // Field.Builder setField(Field value)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value)",
 
-    "if (value == null) {\n"
-    "  throw new NullPointerException();\n"
-    "}\n"
-    "$oneof_name$_ = value;\n"
-    "$on_changed$\n",
+      "if (value == null) {\n"
+      "  throw new NullPointerException();\n"
+      "}\n"
+      "$oneof_name$_ = value;\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.setMessage(value);\n",
+      "$name$Builder_.setMessage(value);\n",
 
-    "$set_oneof_case_message$;\n"
-    "return this;\n");
+      "$set_oneof_case_message$;\n"
+      "return this;\n");
 
   // Field.Builder setField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    $type$.Builder builderForValue)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+      "    $type$.Builder builderForValue)",
 
-    "$oneof_name$_ = builderForValue.build();\n"
-    "$on_changed$\n",
+      "$oneof_name$_ = builderForValue.build();\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.setMessage(builderForValue.build());\n",
+      "$name$Builder_.setMessage(builderForValue.build());\n",
 
-    "$set_oneof_case_message$;\n"
-    "return this;\n");
+      "$set_oneof_case_message$;\n"
+      "return this;\n");
 
   // Field.Builder mergeField(Field value)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$merge$capitalized_name$$}$($type$ value)",
 
-    "if ($has_oneof_case_message$ &&\n"
-    "    $oneof_name$_ != $type$.getDefaultInstance()) {\n"
-    "  $oneof_name$_ = $type$.newBuilder(($type$) $oneof_name$_)\n"
-    "      .mergeFrom(value).buildPartial();\n"
-    "} else {\n"
-    "  $oneof_name$_ = value;\n"
-    "}\n"
-    "$on_changed$\n",
+      "if ($has_oneof_case_message$ &&\n"
+      "    $oneof_name$_ != $type$.getDefaultInstance()) {\n"
+      "  $oneof_name$_ = $type$.newBuilder(($type$) $oneof_name$_)\n"
+      "      .mergeFrom(value).buildPartial();\n"
+      "} else {\n"
+      "  $oneof_name$_ = value;\n"
+      "}\n"
+      "$on_changed$\n",
 
-    "if ($has_oneof_case_message$) {\n"
-    "  $name$Builder_.mergeFrom(value);\n"
-    "}\n"
-    "$name$Builder_.setMessage(value);\n",
+      "if ($has_oneof_case_message$) {\n"
+      "  $name$Builder_.mergeFrom(value);\n"
+      "}\n"
+      "$name$Builder_.setMessage(value);\n",
 
-    "$set_oneof_case_message$;\n"
-    "return this;\n");
+      "$set_oneof_case_message$;\n"
+      "return this;\n");
 
   // Field.Builder clearField()
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
+  PrintNestedBuilderFunction(
+      printer, "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
 
-    "if ($has_oneof_case_message$) {\n"
-    "  $clear_oneof_case_message$;\n"
-    "  $oneof_name$_ = null;\n"
-    "  $on_changed$\n"
-    "}\n",
+      "if ($has_oneof_case_message$) {\n"
+      "  $clear_oneof_case_message$;\n"
+      "  $oneof_name$_ = null;\n"
+      "  $on_changed$\n"
+      "}\n",
 
-    "if ($has_oneof_case_message$) {\n"
-    "  $clear_oneof_case_message$;\n"
-    "  $oneof_name$_ = null;\n"
-    "}\n"
-    "$name$Builder_.clear();\n",
+      "if ($has_oneof_case_message$) {\n"
+      "  $clear_oneof_case_message$;\n"
+      "  $oneof_name$_ = null;\n"
+      "}\n"
+      "$name$Builder_.clear();\n",
 
-    "return this;\n");
+      "return this;\n");
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$.Builder "
-    "${$get$capitalized_name$Builder$}$() {\n"
-    "  return get$capitalized_name$FieldBuilder().getBuilder();\n"
-    "}\n");
+                 "$deprecation$public $type$.Builder "
+                 "${$get$capitalized_name$Builder$}$() {\n"
+                 "  return get$capitalized_name$FieldBuilder().getBuilder();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public $type$OrBuilder "
-    "${$get$capitalized_name$OrBuilder$}$() {\n"
-    "  if (($has_oneof_case_message$) && ($name$Builder_ != null)) {\n"
-    "    return $name$Builder_.getMessageOrBuilder();\n"
-    "  } else {\n"
-    "    if ($has_oneof_case_message$) {\n"
-    "      return ($type$) $oneof_name$_;\n"
-    "    }\n"
-    "    return $type$.getDefaultInstance();\n"
-    "  }\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public $type$OrBuilder "
+      "${$get$capitalized_name$OrBuilder$}$() {\n"
+      "  if (($has_oneof_case_message$) && ($name$Builder_ != null)) {\n"
+      "    return $name$Builder_.getMessageOrBuilder();\n"
+      "  } else {\n"
+      "    if ($has_oneof_case_message$) {\n"
+      "      return ($type$) $oneof_name$_;\n"
+      "    }\n"
+      "    return $type$.getDefaultInstance();\n"
+      "  }\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
-    "    $type$, $type$.Builder, $type$OrBuilder> \n"
-    "    ${$get$capitalized_name$FieldBuilder$}$() {\n"
-    "  if ($name$Builder_ == null) {\n"
-    "    if (!($has_oneof_case_message$)) {\n"
-    "      $oneof_name$_ = $type$.getDefaultInstance();\n"
-    "    }\n"
-    "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder$ver$<\n"
-    "        $type$, $type$.Builder, $type$OrBuilder>(\n"
-    "            ($type$) $oneof_name$_,\n"
-    "            getParentForChildren(),\n"
-    "            isClean());\n"
-    "    $oneof_name$_ = null;\n"
-    "  }\n"
-    "  $set_oneof_case_message$;\n"
-    "  $on_changed$;\n"
-    "  return $name$Builder_;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "private com.google.protobuf.SingleFieldBuilder$ver$<\n"
+      "    $type$, $type$.Builder, $type$OrBuilder> \n"
+      "    ${$get$capitalized_name$FieldBuilder$}$() {\n"
+      "  if ($name$Builder_ == null) {\n"
+      "    if (!($has_oneof_case_message$)) {\n"
+      "      $oneof_name$_ = $type$.getDefaultInstance();\n"
+      "    }\n"
+      "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder$ver$<\n"
+      "        $type$, $type$.Builder, $type$OrBuilder>(\n"
+      "            ($type$) $oneof_name$_,\n"
+      "            getParentForChildren(),\n"
+      "            isClean());\n"
+      "    $oneof_name$_ = null;\n"
+      "  }\n"
+      "  $set_oneof_case_message$;\n"
+      "  $on_changed$;\n"
+      "  return $name$Builder_;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableMessageOneofFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
-
-  printer->Print(variables_,
-                 "if ($has_oneof_case_message$) {\n");
+void ImmutableMessageOneofFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
+  printer->Print(variables_, "if ($has_oneof_case_message$) {\n");
   printer->Indent();
 
-  PrintNestedBuilderCondition(printer,
-    "result.$oneof_name$_ = $oneof_name$_;\n",
+  PrintNestedBuilderCondition(
+      printer, "result.$oneof_name$_ = $oneof_name$_;\n",
 
-    "result.$oneof_name$_ = $name$Builder_.build();\n");
+      "result.$oneof_name$_ = $name$Builder_.build();\n");
 
   printer->Outdent();
   printer->Print("}\n");
 }
 
-void ImmutableMessageOneofFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void ImmutableMessageOneofFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "merge$capitalized_name$(other.get$capitalized_name$());\n");
+                 "merge$capitalized_name$(other.get$capitalized_name$());\n");
 }
 
-void ImmutableMessageOneofFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void ImmutableMessageOneofFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$type$.Builder subBuilder = null;\n"
-    "if ($has_oneof_case_message$) {\n"
-    "  subBuilder = (($type$) $oneof_name$_).toBuilder();\n"
-    "}\n");
+                 "$type$.Builder subBuilder = null;\n"
+                 "if ($has_oneof_case_message$) {\n"
+                 "  subBuilder = (($type$) $oneof_name$_).toBuilder();\n"
+                 "}\n");
 
   if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
-    printer->Print(variables_,
-      "$oneof_name$_ = input.readGroup($number$, $type$.$get_parser$,\n"
-      "    extensionRegistry);\n");
+    printer->Print(
+        variables_,
+        "$oneof_name$_ = input.readGroup($number$, $type$.$get_parser$,\n"
+        "    extensionRegistry);\n");
   } else {
-    printer->Print(variables_,
-      "$oneof_name$_ =\n"
-      "    input.readMessage($type$.$get_parser$, extensionRegistry);\n");
+    printer->Print(
+        variables_,
+        "$oneof_name$_ =\n"
+        "    input.readMessage($type$.$get_parser$, extensionRegistry);\n");
   }
 
   printer->Print(variables_,
-    "if (subBuilder != null) {\n"
-    "  subBuilder.mergeFrom(($type$) $oneof_name$_);\n"
-    "  $oneof_name$_ = subBuilder.buildPartial();\n"
-    "}\n");
-  printer->Print(variables_,
-    "$set_oneof_case_message$;\n");
+                 "if (subBuilder != null) {\n"
+                 "  subBuilder.mergeFrom(($type$) $oneof_name$_);\n"
+                 "  $oneof_name$_ = subBuilder.buildPartial();\n"
+                 "}\n");
+  printer->Print(variables_, "$set_oneof_case_message$;\n");
 }
 
-void ImmutableMessageOneofFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  output.write$group_or_message$($number$, ($type$) $oneof_name$_);\n"
-    "}\n");
+void ImmutableMessageOneofFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if ($has_oneof_case_message$) {\n"
+      "  output.write$group_or_message$($number$, ($type$) $oneof_name$_);\n"
+      "}\n");
 }
 
-void ImmutableMessageOneofFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .compute$group_or_message$Size($number$, ($type$) $oneof_name$_);\n"
-    "}\n");
+void ImmutableMessageOneofFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if ($has_oneof_case_message$) {\n"
+      "  size += com.google.protobuf.CodedOutputStream\n"
+      "    .compute$group_or_message$Size($number$, ($type$) $oneof_name$_);\n"
+      "}\n");
 }
 
 // ===================================================================
 
-RepeatedImmutableMessageFieldGenerator::
-RepeatedImmutableMessageFieldGenerator(const FieldDescriptor* descriptor,
-                                       int messageBitIndex,
-                                       int builderBitIndex,
-                                       Context* context)
-  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
-    builderBitIndex_(builderBitIndex), context_(context),
-    name_resolver_(context->GetNameResolver())  {
+RepeatedImmutableMessageFieldGenerator::RepeatedImmutableMessageFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : descriptor_(descriptor),
+      messageBitIndex_(messageBitIndex),
+      builderBitIndex_(builderBitIndex),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
                       context->GetFieldGeneratorInfo(descriptor),
                       name_resolver_, &variables_);
 }
 
 RepeatedImmutableMessageFieldGenerator::
-~RepeatedImmutableMessageFieldGenerator() {}
+    ~RepeatedImmutableMessageFieldGenerator() {}
 
 int RepeatedImmutableMessageFieldGenerator::GetNumBitsForMessage() const {
   return 0;
@@ -814,78 +820,79 @@
   return 1;
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   // TODO(jonp): In the future, consider having methods specific to the
   // interface so that builders can choose dynamically to either return a
   // message or a nested builder, so that asking for the interface doesn't
   // cause a message to ever be built.
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.util.List<$type$> \n"
-    "    get$capitalized_name$List();\n");
+                 "$deprecation$java.util.List<$type$> \n"
+                 "    get$capitalized_name$List();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$(int index);\n");
+                 "$deprecation$$type$ get$capitalized_name$(int index);\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$int get$capitalized_name$Count();\n");
+                 "$deprecation$int get$capitalized_name$Count();\n");
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.util.List<? extends $type$OrBuilder> \n"
-    "    get$capitalized_name$OrBuilderList();\n");
+                 "$deprecation$java.util.List<? extends $type$OrBuilder> \n"
+                 "    get$capitalized_name$OrBuilderList();\n");
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder(\n"
-    "    int index);\n");
+  printer->Print(
+      variables_,
+      "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder(\n"
+      "    int index);\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private java.util.List<$type$> $name$_;\n");
+void RepeatedImmutableMessageFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_, "private java.util.List<$type$> $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\n"
-    "  return $name$_;\n"   // note:  unmodifiable list
-    "}\n");
+                 "$deprecation$public java.util.List<$type$> "
+                 "${$get$capitalized_name$List$}$() {\n"
+                 "  return $name$_;\n"  // note:  unmodifiable list
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
+      "    ${$get$capitalized_name$OrBuilderList$}$() {\n"
+      "  return $name$_;\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return $name$_.get(index);\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
-    "    ${$get$capitalized_name$OrBuilderList$}$() {\n"
-    "  return $name$_;\n"
-    "}\n");
+                 "$deprecation$public $type$OrBuilder "
+                 "${$get$capitalized_name$OrBuilder$}$(\n"
+                 "    int index) {\n"
+                 "  return $name$_.get(index);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return $name$_.get(index);\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public $type$OrBuilder "
-    "${$get$capitalized_name$OrBuilder$}$(\n"
-    "    int index) {\n"
-    "  return $name$_.get(index);\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-
 }
 
 void RepeatedImmutableMessageFieldGenerator::PrintNestedBuilderCondition(
-    io::Printer* printer,
-    const char* regular_case,
+    io::Printer* printer, const char* regular_case,
     const char* nested_builder_case) const {
   printer->Print(variables_, "if ($name$Builder_ == null) {\n");
   printer->Indent();
@@ -899,10 +906,8 @@
 }
 
 void RepeatedImmutableMessageFieldGenerator::PrintNestedBuilderFunction(
-    io::Printer* printer,
-    const char* method_prototype,
-    const char* regular_case,
-    const char* nested_builder_case,
+    io::Printer* printer, const char* method_prototype,
+    const char* regular_case, const char* nested_builder_case,
     const char* trailing_code) const {
   printer->Print(variables_, method_prototype);
   printer->Annotate("{", "}", descriptor_);
@@ -916,406 +921,429 @@
   printer->Print("}\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   // When using nested-builders, the code initially works just like the
   // non-nested builder case. It only creates a nested builder lazily on
   // demand and then forever delegates to it after creation.
 
-  printer->Print(variables_,
-    // Used when the builder is null.
-    // One field is the list and the other field keeps track of whether the
-    // list is immutable. If it's immutable, the invariant is that it must
-    // either an instance of Collections.emptyList() or it's an ArrayList
-    // wrapped in a Collections.unmodifiableList() wrapper and nobody else has
-    // a refererence to the underlying ArrayList. This invariant allows us to
-    // share instances of lists between protocol buffers avoiding expensive
-    // memory allocations. Note, immutable is a strong guarantee here -- not
-    // just that the list cannot be modified via the reference but that the
-    // list can never be modified.
-    "private java.util.List<$type$> $name$_ =\n"
-    "  java.util.Collections.emptyList();\n"
+  printer->Print(
+      variables_,
+      // Used when the builder is null.
+      // One field is the list and the other field keeps track of whether the
+      // list is immutable. If it's immutable, the invariant is that it must
+      // either an instance of Collections.emptyList() or it's an ArrayList
+      // wrapped in a Collections.unmodifiableList() wrapper and nobody else has
+      // a refererence to the underlying ArrayList. This invariant allows us to
+      // share instances of lists between protocol buffers avoiding expensive
+      // memory allocations. Note, immutable is a strong guarantee here -- not
+      // just that the list cannot be modified via the reference but that the
+      // list can never be modified.
+      "private java.util.List<$type$> $name$_ =\n"
+      "  java.util.Collections.emptyList();\n"
 
-    "private void ensure$capitalized_name$IsMutable() {\n"
-    "  if (!$get_mutable_bit_builder$) {\n"
-    "    $name$_ = new java.util.ArrayList<$type$>($name$_);\n"
-    "    $set_mutable_bit_builder$;\n"
-    "   }\n"
-    "}\n"
-    "\n");
+      "private void ensure$capitalized_name$IsMutable() {\n"
+      "  if (!$get_mutable_bit_builder$) {\n"
+      "    $name$_ = new java.util.ArrayList<$type$>($name$_);\n"
+      "    $set_mutable_bit_builder$;\n"
+      "   }\n"
+      "}\n"
+      "\n");
 
-  printer->Print(variables_,
-    // If this builder is non-null, it is used and the other fields are
-    // ignored.
-    "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
-    "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n"
-    "\n");
+  printer->Print(
+      variables_,
+      // If this builder is non-null, it is used and the other fields are
+      // ignored.
+      "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
+      "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n"
+      "\n");
 
   // The comments above the methods below are based on a hypothetical
   // repeated field of type "Field" called "RepeatedField".
 
   // List<Field> getRepeatedFieldList()
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$()",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public java.util.List<$type$> "
+      "${$get$capitalized_name$List$}$()",
 
-    "return java.util.Collections.unmodifiableList($name$_);\n",
-    "return $name$Builder_.getMessageList();\n",
+      "return java.util.Collections.unmodifiableList($name$_);\n",
+      "return $name$Builder_.getMessageList();\n",
 
-    NULL);
+      NULL);
 
   // int getRepeatedFieldCount()
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$()",
+  PrintNestedBuilderFunction(
+      printer, "$deprecation$public int ${$get$capitalized_name$Count$}$()",
 
-    "return $name$_.size();\n",
-    "return $name$Builder_.getCount();\n",
+      "return $name$_.size();\n", "return $name$Builder_.getCount();\n",
 
-    NULL);
+      NULL);
 
   // Field getRepeatedField(int index)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index)",
 
-    "return $name$_.get(index);\n",
+      "return $name$_.get(index);\n",
 
-    "return $name$Builder_.getMessage(index);\n",
+      "return $name$Builder_.getMessage(index);\n",
 
-    NULL);
+      NULL);
 
   // Builder setRepeatedField(int index, Field value)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    int index, $type$ value)",
-    "if (value == null) {\n"
-    "  throw new NullPointerException();\n"
-    "}\n"
-    "ensure$capitalized_name$IsMutable();\n"
-    "$name$_.set(index, value);\n"
-    "$on_changed$\n",
-    "$name$Builder_.setMessage(index, value);\n",
-    "return this;\n");
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+      "    int index, $type$ value)",
+      "if (value == null) {\n"
+      "  throw new NullPointerException();\n"
+      "}\n"
+      "ensure$capitalized_name$IsMutable();\n"
+      "$name$_.set(index, value);\n"
+      "$on_changed$\n",
+      "$name$Builder_.setMessage(index, value);\n", "return this;\n");
 
   // Builder setRepeatedField(int index, Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    int index, $type$.Builder builderForValue)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+      "    int index, $type$.Builder builderForValue)",
 
-    "ensure$capitalized_name$IsMutable();\n"
-    "$name$_.set(index, builderForValue.build());\n"
-    "$on_changed$\n",
+      "ensure$capitalized_name$IsMutable();\n"
+      "$name$_.set(index, builderForValue.build());\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.setMessage(index, builderForValue.build());\n",
+      "$name$Builder_.setMessage(index, builderForValue.build());\n",
 
-    "return this;\n");
+      "return this;\n");
 
   // Builder addRepeatedField(Field value)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value)",
 
-    "if (value == null) {\n"
-    "  throw new NullPointerException();\n"
-    "}\n"
-    "ensure$capitalized_name$IsMutable();\n"
-    "$name$_.add(value);\n"
+      "if (value == null) {\n"
+      "  throw new NullPointerException();\n"
+      "}\n"
+      "ensure$capitalized_name$IsMutable();\n"
+      "$name$_.add(value);\n"
 
-    "$on_changed$\n",
+      "$on_changed$\n",
 
-    "$name$Builder_.addMessage(value);\n",
+      "$name$Builder_.addMessage(value);\n",
 
-    "return this;\n");
+      "return this;\n");
 
   // Builder addRepeatedField(int index, Field value)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
-    "    int index, $type$ value)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+      "    int index, $type$ value)",
 
-    "if (value == null) {\n"
-    "  throw new NullPointerException();\n"
-    "}\n"
-    "ensure$capitalized_name$IsMutable();\n"
-    "$name$_.add(index, value);\n"
-    "$on_changed$\n",
+      "if (value == null) {\n"
+      "  throw new NullPointerException();\n"
+      "}\n"
+      "ensure$capitalized_name$IsMutable();\n"
+      "$name$_.add(index, value);\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.addMessage(index, value);\n",
+      "$name$Builder_.addMessage(index, value);\n",
 
-    "return this;\n");
+      "return this;\n");
 
   // Builder addRepeatedField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
-    "    $type$.Builder builderForValue)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+      "    $type$.Builder builderForValue)",
 
-    "ensure$capitalized_name$IsMutable();\n"
-    "$name$_.add(builderForValue.build());\n"
-    "$on_changed$\n",
+      "ensure$capitalized_name$IsMutable();\n"
+      "$name$_.add(builderForValue.build());\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.addMessage(builderForValue.build());\n",
+      "$name$Builder_.addMessage(builderForValue.build());\n",
 
-    "return this;\n");
+      "return this;\n");
 
   // Builder addRepeatedField(int index, Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
-    "    int index, $type$.Builder builderForValue)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+      "    int index, $type$.Builder builderForValue)",
 
-    "ensure$capitalized_name$IsMutable();\n"
-    "$name$_.add(index, builderForValue.build());\n"
-    "$on_changed$\n",
+      "ensure$capitalized_name$IsMutable();\n"
+      "$name$_.add(index, builderForValue.build());\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.addMessage(index, builderForValue.build());\n",
+      "$name$Builder_.addMessage(index, builderForValue.build());\n",
 
-    "return this;\n");
+      "return this;\n");
 
   // Builder addAllRepeatedField(Iterable<Field> values)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
-    "    java.lang.Iterable<? extends $type$> values)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
+      "    java.lang.Iterable<? extends $type$> values)",
 
-    "ensure$capitalized_name$IsMutable();\n"
-    "com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
-    "    values, $name$_);\n"
-    "$on_changed$\n",
+      "ensure$capitalized_name$IsMutable();\n"
+      "com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
+      "    values, $name$_);\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.addAllMessages(values);\n",
+      "$name$Builder_.addAllMessages(values);\n",
 
-    "return this;\n");
+      "return this;\n");
 
   // Builder clearAllRepeatedField()
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
+  PrintNestedBuilderFunction(
+      printer, "$deprecation$public Builder ${$clear$capitalized_name$$}$()",
 
-    "$name$_ = java.util.Collections.emptyList();\n"
-    "$clear_mutable_bit_builder$;\n"
-    "$on_changed$\n",
+      "$name$_ = java.util.Collections.emptyList();\n"
+      "$clear_mutable_bit_builder$;\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.clear();\n",
+      "$name$Builder_.clear();\n",
 
-    "return this;\n");
+      "return this;\n");
 
   // Builder removeRepeatedField(int index)
   WriteFieldDocComment(printer, descriptor_);
-  PrintNestedBuilderFunction(printer,
-    "$deprecation$public Builder ${$remove$capitalized_name$$}$(int index)",
+  PrintNestedBuilderFunction(
+      printer,
+      "$deprecation$public Builder ${$remove$capitalized_name$$}$(int index)",
 
-    "ensure$capitalized_name$IsMutable();\n"
-    "$name$_.remove(index);\n"
-    "$on_changed$\n",
+      "ensure$capitalized_name$IsMutable();\n"
+      "$name$_.remove(index);\n"
+      "$on_changed$\n",
 
-    "$name$Builder_.remove(index);\n",
+      "$name$Builder_.remove(index);\n",
 
-    "return this;\n");
+      "return this;\n");
+
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public $type$.Builder ${$get$capitalized_name$Builder$}$(\n"
+      "    int index) {\n"
+      "  return get$capitalized_name$FieldBuilder().getBuilder(index);\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$.Builder ${$get$capitalized_name$Builder$}$(\n"
-    "    int index) {\n"
-    "  return get$capitalized_name$FieldBuilder().getBuilder(index);\n"
-    "}\n");
+                 "$deprecation$public $type$OrBuilder "
+                 "${$get$capitalized_name$OrBuilder$}$(\n"
+                 "    int index) {\n"
+                 "  if ($name$Builder_ == null) {\n"
+                 "    return $name$_.get(index);"
+                 "  } else {\n"
+                 "    return $name$Builder_.getMessageOrBuilder(index);\n"
+                 "  }\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
-      printer->Print(variables_,
-    "$deprecation$public $type$OrBuilder "
-    "${$get$capitalized_name$OrBuilder$}$(\n"
-    "    int index) {\n"
-    "  if ($name$Builder_ == null) {\n"
-    "    return $name$_.get(index);"
-    "  } else {\n"
-    "    return $name$Builder_.getMessageOrBuilder(index);\n"
-    "  }\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
+      "     ${$get$capitalized_name$OrBuilderList$}$() {\n"
+      "  if ($name$Builder_ != null) {\n"
+      "    return $name$Builder_.getMessageOrBuilderList();\n"
+      "  } else {\n"
+      "    return java.util.Collections.unmodifiableList($name$_);\n"
+      "  }\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
-      printer->Print(variables_,
-    "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
-    "     ${$get$capitalized_name$OrBuilderList$}$() {\n"
-    "  if ($name$Builder_ != null) {\n"
-    "    return $name$Builder_.getMessageOrBuilderList();\n"
-    "  } else {\n"
-    "    return java.util.Collections.unmodifiableList($name$_);\n"
-    "  }\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-
-  WriteFieldDocComment(printer, descriptor_);
-      printer->Print(variables_,
-    "$deprecation$public $type$.Builder "
-    "${$add$capitalized_name$Builder$}$() {\n"
-    "  return get$capitalized_name$FieldBuilder().addBuilder(\n"
-    "      $type$.getDefaultInstance());\n"
-    "}\n");
+  printer->Print(variables_,
+                 "$deprecation$public $type$.Builder "
+                 "${$add$capitalized_name$Builder$}$() {\n"
+                 "  return get$capitalized_name$FieldBuilder().addBuilder(\n"
+                 "      $type$.getDefaultInstance());\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-      printer->Print(variables_,
-    "$deprecation$public $type$.Builder ${$add$capitalized_name$Builder$}$(\n"
-    "    int index) {\n"
-    "  return get$capitalized_name$FieldBuilder().addBuilder(\n"
-    "      index, $type$.getDefaultInstance());\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public $type$.Builder ${$add$capitalized_name$Builder$}$(\n"
+      "    int index) {\n"
+      "  return get$capitalized_name$FieldBuilder().addBuilder(\n"
+      "      index, $type$.getDefaultInstance());\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-      printer->Print(variables_,
-    "$deprecation$public java.util.List<$type$.Builder> \n"
-    "     ${$get$capitalized_name$BuilderList$}$() {\n"
-    "  return get$capitalized_name$FieldBuilder().getBuilderList();\n"
-    "}\n"
-    "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
-    "    $type$, $type$.Builder, $type$OrBuilder> \n"
-    "    get$capitalized_name$FieldBuilder() {\n"
-    "  if ($name$Builder_ == null) {\n"
-    "    $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
-    "        $type$, $type$.Builder, $type$OrBuilder>(\n"
-    "            $name$_,\n"
-    "            $get_mutable_bit_builder$,\n"
-    "            getParentForChildren(),\n"
-    "            isClean());\n"
-    "    $name$_ = null;\n"
-    "  }\n"
-    "  return $name$Builder_;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public java.util.List<$type$.Builder> \n"
+      "     ${$get$capitalized_name$BuilderList$}$() {\n"
+      "  return get$capitalized_name$FieldBuilder().getBuilderList();\n"
+      "}\n"
+      "private com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
+      "    $type$, $type$.Builder, $type$OrBuilder> \n"
+      "    get$capitalized_name$FieldBuilder() {\n"
+      "  if ($name$Builder_ == null) {\n"
+      "    $name$Builder_ = new "
+      "com.google.protobuf.RepeatedFieldBuilder$ver$<\n"
+      "        $type$, $type$.Builder, $type$OrBuilder>(\n"
+      "            $name$_,\n"
+      "            $get_mutable_bit_builder$,\n"
+      "            getParentForChildren(),\n"
+      "            isClean());\n"
+      "    $name$_ = null;\n"
+      "  }\n"
+      "  return $name$Builder_;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
 void RepeatedImmutableMessageFieldGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
-  printer->Print(variables_,
-    "get$capitalized_name$FieldBuilder();\n");
+    GenerateFieldBuilderInitializationCode(io::Printer* printer) const {
+  printer->Print(variables_, "get$capitalized_name$FieldBuilder();\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldGenerator::GenerateBuilderClearCode(
+    io::Printer* printer) const {
   PrintNestedBuilderCondition(printer,
-    "$name$_ = java.util.Collections.emptyList();\n"
-    "$clear_mutable_bit_builder$;\n",
+                              "$name$_ = java.util.Collections.emptyList();\n"
+                              "$clear_mutable_bit_builder$;\n",
 
-    "$name$Builder_.clear();\n");
+                              "$name$Builder_.clear();\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   // The code below does two optimizations (non-nested builder case):
   //   1. If the other list is empty, there's nothing to do. This ensures we
   //      don't allocate a new array if we already have an immutable one.
   //   2. If the other list is non-empty and our current list is empty, we can
   //      reuse the other list which is guaranteed to be immutable.
-  PrintNestedBuilderCondition(printer,
-    "if (!other.$name$_.isEmpty()) {\n"
-    "  if ($name$_.isEmpty()) {\n"
-    "    $name$_ = other.$name$_;\n"
-    "    $clear_mutable_bit_builder$;\n"
-    "  } else {\n"
-    "    ensure$capitalized_name$IsMutable();\n"
-    "    $name$_.addAll(other.$name$_);\n"
-    "  }\n"
-    "  $on_changed$\n"
-    "}\n",
+  PrintNestedBuilderCondition(
+      printer,
+      "if (!other.$name$_.isEmpty()) {\n"
+      "  if ($name$_.isEmpty()) {\n"
+      "    $name$_ = other.$name$_;\n"
+      "    $clear_mutable_bit_builder$;\n"
+      "  } else {\n"
+      "    ensure$capitalized_name$IsMutable();\n"
+      "    $name$_.addAll(other.$name$_);\n"
+      "  }\n"
+      "  $on_changed$\n"
+      "}\n",
 
-    "if (!other.$name$_.isEmpty()) {\n"
-    "  if ($name$Builder_.isEmpty()) {\n"
-    "    $name$Builder_.dispose();\n"
-    "    $name$Builder_ = null;\n"
-    "    $name$_ = other.$name$_;\n"
-    "    $clear_mutable_bit_builder$;\n"
-    "    $name$Builder_ = \n"
-    "      com.google.protobuf.GeneratedMessage$ver$.alwaysUseFieldBuilders ?\n"
-    "         get$capitalized_name$FieldBuilder() : null;\n"
-    "  } else {\n"
-    "    $name$Builder_.addAllMessages(other.$name$_);\n"
-    "  }\n"
-    "}\n");
+      "if (!other.$name$_.isEmpty()) {\n"
+      "  if ($name$Builder_.isEmpty()) {\n"
+      "    $name$Builder_.dispose();\n"
+      "    $name$Builder_ = null;\n"
+      "    $name$_ = other.$name$_;\n"
+      "    $clear_mutable_bit_builder$;\n"
+      "    $name$Builder_ = \n"
+      "      com.google.protobuf.GeneratedMessage$ver$.alwaysUseFieldBuilders "
+      "?\n"
+      "         get$capitalized_name$FieldBuilder() : null;\n"
+      "  } else {\n"
+      "    $name$Builder_.addAllMessages(other.$name$_);\n"
+      "  }\n"
+      "}\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   // The code below (non-nested builder case) ensures that the result has an
   // immutable list. If our list is immutable, we can just reuse it. If not,
   // we make it immutable.
-  PrintNestedBuilderCondition(printer,
-    "if ($get_mutable_bit_builder$) {\n"
-    "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
-    "  $clear_mutable_bit_builder$;\n"
-    "}\n"
-    "result.$name$_ = $name$_;\n",
+  PrintNestedBuilderCondition(
+      printer,
+      "if ($get_mutable_bit_builder$) {\n"
+      "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
+      "  $clear_mutable_bit_builder$;\n"
+      "}\n"
+      "result.$name$_ = $name$_;\n",
 
-    "result.$name$_ = $name$Builder_.build();\n");
+      "result.$name$_ = $name$Builder_.build();\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if (!$get_mutable_bit_parser$) {\n"
-    "  $name$_ = new java.util.ArrayList<$type$>();\n"
-    "  $set_mutable_bit_parser$;\n"
-    "}\n");
+                 "if (!$get_mutable_bit_parser$) {\n"
+                 "  $name$_ = new java.util.ArrayList<$type$>();\n"
+                 "  $set_mutable_bit_parser$;\n"
+                 "}\n");
 
   if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
-    printer->Print(variables_,
-      "$name$_.add(input.readGroup($number$, $type$.$get_parser$,\n"
-      "    extensionRegistry));\n");
+    printer->Print(
+        variables_,
+        "$name$_.add(input.readGroup($number$, $type$.$get_parser$,\n"
+        "    extensionRegistry));\n");
   } else {
-    printer->Print(variables_,
-      "$name$_.add(\n"
-      "    input.readMessage($type$.$get_parser$, extensionRegistry));\n");
+    printer->Print(
+        variables_,
+        "$name$_.add(\n"
+        "    input.readMessage($type$.$get_parser$, extensionRegistry));\n");
   }
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($get_mutable_bit_parser$) {\n"
-    "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
-    "}\n");
+void RepeatedImmutableMessageFieldGenerator::GenerateParsingDoneCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if ($get_mutable_bit_parser$) {\n"
+      "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
+      "}\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "for (int i = 0; i < $name$_.size(); i++) {\n"
-    "  output.write$group_or_message$($number$, $name$_.get(i));\n"
-    "}\n");
+                 "for (int i = 0; i < $name$_.size(); i++) {\n"
+                 "  output.write$group_or_message$($number$, $name$_.get(i));\n"
+                 "}\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "for (int i = 0; i < $name$_.size(); i++) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .compute$group_or_message$Size($number$, $name$_.get(i));\n"
-    "}\n");
+void RepeatedImmutableMessageFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "for (int i = 0; i < $name$_.size(); i++) {\n"
+      "  size += com.google.protobuf.CodedOutputStream\n"
+      "    .compute$group_or_message$Size($number$, $name$_.get(i));\n"
+      "}\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (!get$capitalized_name$List()\n"
-    "    .equals(other.get$capitalized_name$List())) return false;\n");
+void RepeatedImmutableMessageFieldGenerator::GenerateEqualsCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if (!get$capitalized_name$List()\n"
+      "    .equals(other.get$capitalized_name$List())) return false;\n");
 }
 
-void RepeatedImmutableMessageFieldGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (get$capitalized_name$Count() > 0) {\n"
-    "  hash = (37 * hash) + $constant_name$;\n"
-    "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
-    "}\n");
+void RepeatedImmutableMessageFieldGenerator::GenerateHashCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if (get$capitalized_name$Count() > 0) {\n"
+      "  hash = (37 * hash) + $constant_name$;\n"
+      "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
+      "}\n");
 }
 
 std::string RepeatedImmutableMessageFieldGenerator::GetBoxedType() const {
diff --git a/src/google/protobuf/compiler/java/java_message_field_lite.cc b/src/google/protobuf/compiler/java/java_message_field_lite.cc
index c992ed3..c405981 100644
--- a/src/google/protobuf/compiler/java/java_message_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_message_field_lite.cc
@@ -63,12 +63,12 @@
   (*variables)["mutable_type"] =
       name_resolver->GetMutableClassName(descriptor->message_type());
   (*variables)["group_or_message"] =
-    (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ?
-    "Group" : "Message";
+      (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ? "Group"
+                                                           : "Message";
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
-  (*variables)["deprecation"] = descriptor->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  (*variables)["deprecation"] =
+      descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
   (*variables)["required"] = descriptor->is_required() ? "true" : "false";
 
   if (SupportFieldPresence(descriptor->file())) {
@@ -120,258 +120,185 @@
   return SupportFieldPresence(descriptor_->file()) ? 1 : 0;
 }
 
-void ImmutableMessageFieldLiteGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void ImmutableMessageFieldLiteGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$boolean has$capitalized_name$();\n");
+  printer->Print(variables_, "$deprecation$boolean has$capitalized_name$();\n");
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$();\n");
+  printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n");
 }
 
-void ImmutableMessageFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutableMessageFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
 
-  printer->Print(variables_,
-    "private $type$ $name$_;\n");
+  printer->Print(variables_, "private $type$ $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
 
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-      "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+        "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   } else {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $name$_ != null;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $name$_ != null;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-      "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+        "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   // Field.Builder setField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  $name$_ = value;\n"
-    "  $set_has_field_bit_message$\n"
-    "  }\n");
+                 "private void set$capitalized_name$($type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  $name$_ = value;\n"
+                 "  $set_has_field_bit_message$\n"
+                 "  }\n");
 
   // Field.Builder setField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$(\n"
-    "    $type$.Builder builderForValue) {\n"
-    "  $name$_ = builderForValue.build();\n"
-    "  $set_has_field_bit_message$\n"
-    "}\n");
+                 "private void set$capitalized_name$(\n"
+                 "    $type$.Builder builderForValue) {\n"
+                 "  $name$_ = builderForValue.build();\n"
+                 "  $set_has_field_bit_message$\n"
+                 "}\n");
 
   // Field.Builder mergeField(Field value)
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.SuppressWarnings({\"ReferenceEquality\"})\n"
-    "private void merge$capitalized_name$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  if ($name$_ != null &&\n"
-    "      $name$_ != $type$.getDefaultInstance()) {\n"
-    "    $name$_ =\n"
-    "      $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
-    "  } else {\n"
-    "    $name$_ = value;\n"
-    "  }\n"
-    "  $set_has_field_bit_message$\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "@java.lang.SuppressWarnings({\"ReferenceEquality\"})\n"
+      "private void merge$capitalized_name$($type$ value) {\n"
+      "  if (value == null) {\n"
+      "    throw new NullPointerException();\n"
+      "  }\n"
+      "  if ($name$_ != null &&\n"
+      "      $name$_ != $type$.getDefaultInstance()) {\n"
+      "    $name$_ =\n"
+      "      $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
+      "  } else {\n"
+      "    $name$_ = value;\n"
+      "  }\n"
+      "  $set_has_field_bit_message$\n"
+      "}\n");
 
   // Field.Builder clearField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void clear$capitalized_name$() {"
-    "  $name$_ = null;\n"
-    "  $clear_has_field_bit_message$\n"
-    "}\n");
+                 "private void clear$capitalized_name$() {"
+                 "  $name$_ = null;\n"
+                 "  $clear_has_field_bit_message$\n"
+                 "}\n");
 }
 
-void ImmutableMessageFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutableMessageFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   // The comments above the methods below are based on a hypothetical
   // field of type "Field" called "Field".
 
   // boolean hasField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-    "  return instance.has$capitalized_name$();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+                 "  return instance.has$capitalized_name$();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field getField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  return instance.get$capitalized_name$();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  return instance.get$capitalized_name$();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field.Builder setField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(value);\n"
-    "  return this;\n"
-    "  }\n");
+                 "$deprecation$public Builder "
+                 "${$set$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "  }\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field.Builder setField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    $type$.Builder builderForValue) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(builderForValue);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    $type$.Builder builderForValue) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(builderForValue);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field.Builder mergeField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder "
-    "${$merge$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.merge$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$merge$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.merge$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field.Builder clearField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$clear$capitalized_name$$}$() {"
+                 "  copyOnWrite();\n"
+                 "  instance.clear$capitalized_name$();\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableMessageFieldLiteGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+
+void ImmutableMessageFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
   if (SupportFieldPresence(descriptor_->file())) {
-    printer->Print(variables_,
-      "get$capitalized_name$FieldBuilder();\n");
+    WriteIntToUtf16CharSequence(messageBitIndex_, output);
   }
+  printer->Print(variables_, "\"$name$_\",\n");
 }
 
-
-void ImmutableMessageFieldLiteGenerator::
-GenerateInitializationCode(io::Printer* printer) const {}
-
-void ImmutableMessageFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$name$_ = visitor.visitMessage($name$_, other.$name$_);\n");
-}
-
-void ImmutableMessageFieldLiteGenerator::
-GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const {
-  // noop for scalars
-}
-
-void ImmutableMessageFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  // TODO(dweis): Update this code to avoid the builder allocation and instead
-  // only allocate a submessage that isn't made immutable. Rely on the top
-  // message calling makeImmutable once done to actually traverse the tree and
-  // finalize state. This will avoid:
-  // - transitive builder allocations
-  // - the extra transitive iteration for streamed fields
-  // - reallocations for copying repeated fields
-  printer->Print(variables_,
-      "$type$.Builder subBuilder = null;\n"
-      "if ($is_field_present_message$) {\n"
-      "  subBuilder = $name$_.toBuilder();\n"
-      "}\n");
-
-    if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
-      printer->Print(variables_,
-        "$name$_ = input.readGroup($number$, $type$.parser(),\n"
-        "    extensionRegistry);\n");
-    } else {
-      printer->Print(variables_,
-        "$name$_ = input.readMessage($type$.parser(), extensionRegistry);\n");
-    }
-
-  printer->Print(variables_,
-    "if (subBuilder != null) {\n"
-    "  subBuilder.mergeFrom($name$_);\n"
-    "  $name$_ = subBuilder.buildPartial();\n"
-    "}\n"
-    "$set_has_field_bit_message$\n");
-}
-
-void ImmutableMessageFieldLiteGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  // noop for messages.
-}
-
-void ImmutableMessageFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  output.write$group_or_message$($number$, get$capitalized_name$());\n"
-    "}\n");
-}
-
-void ImmutableMessageFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .compute$group_or_message$Size($number$, get$capitalized_name$());\n"
-    "}\n");
-}
-
-void ImmutableMessageFieldLiteGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "result = result && get$capitalized_name$()\n"
-    "    .equals(other.get$capitalized_name$());\n");
-}
-
-void ImmutableMessageFieldLiteGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "hash = (37 * hash) + $constant_name$;\n"
-    "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
-}
+void ImmutableMessageFieldLiteGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {}
 
 std::string ImmutableMessageFieldLiteGenerator::GetBoxedType() const {
   return name_resolver_->GetImmutableClassName(descriptor_->message_type());
@@ -390,197 +317,155 @@
 }
 
 ImmutableMessageOneofFieldLiteGenerator::
-~ImmutableMessageOneofFieldLiteGenerator() {}
+    ~ImmutableMessageOneofFieldLiteGenerator() {}
 
-void ImmutableMessageOneofFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutableMessageOneofFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-    "  return $has_oneof_case_message$;\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+                 "  return $has_oneof_case_message$;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "     return ($type$) $oneof_name$_;\n"
-    "  }\n"
-    "  return $type$.getDefaultInstance();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "     return ($type$) $oneof_name$_;\n"
+                 "  }\n"
+                 "  return $type$.getDefaultInstance();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field.Builder setField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  $oneof_name$_ = value;\n"
-    "  $set_oneof_case_message$;\n"
-    "}\n");
+                 "private void set$capitalized_name$($type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  $oneof_name$_ = value;\n"
+                 "  $set_oneof_case_message$;\n"
+                 "}\n");
 
   // Field.Builder setField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$(\n"
-    "    $type$.Builder builderForValue) {\n"
-    "  $oneof_name$_ = builderForValue.build();\n"
-    "  $set_oneof_case_message$;\n"
-    "}\n");
+                 "private void set$capitalized_name$(\n"
+                 "    $type$.Builder builderForValue) {\n"
+                 "  $oneof_name$_ = builderForValue.build();\n"
+                 "  $set_oneof_case_message$;\n"
+                 "}\n");
 
   // Field.Builder mergeField(Field value)
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void merge$capitalized_name$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  if ($has_oneof_case_message$ &&\n"
-    "      $oneof_name$_ != $type$.getDefaultInstance()) {\n"
-    "    $oneof_name$_ = $type$.newBuilder(($type$) $oneof_name$_)\n"
-    "        .mergeFrom(value).buildPartial();\n"
-    "  } else {\n"
-    "    $oneof_name$_ = value;\n"
-    "  }\n"
-    "  $set_oneof_case_message$;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "private void merge$capitalized_name$($type$ value) {\n"
+      "  if (value == null) {\n"
+      "    throw new NullPointerException();\n"
+      "  }\n"
+      "  if ($has_oneof_case_message$ &&\n"
+      "      $oneof_name$_ != $type$.getDefaultInstance()) {\n"
+      "    $oneof_name$_ = $type$.newBuilder(($type$) $oneof_name$_)\n"
+      "        .mergeFrom(value).buildPartial();\n"
+      "  } else {\n"
+      "    $oneof_name$_ = value;\n"
+      "  }\n"
+      "  $set_oneof_case_message$;\n"
+      "}\n");
 
   // Field.Builder clearField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void clear$capitalized_name$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    $clear_oneof_case_message$;\n"
-    "    $oneof_name$_ = null;\n"
-    "  }\n"
-    "}\n");
+                 "private void clear$capitalized_name$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    $clear_oneof_case_message$;\n"
+                 "    $oneof_name$_ = null;\n"
+                 "  }\n"
+                 "}\n");
 }
 
+void ImmutableMessageOneofFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
+  WriteIntToUtf16CharSequence(descriptor_->containing_oneof()->index(), output);
+  printer->Print(variables_, "$oneof_stored_type$.class,\n");
+}
 
-void ImmutableMessageOneofFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutableMessageOneofFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   // The comments above the methods below are based on a hypothetical
   // field of type "Field" called "Field".
 
   // boolean hasField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-    "  return instance.has$capitalized_name$();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+                 "  return instance.has$capitalized_name$();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field getField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  return instance.get$capitalized_name$();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  return instance.get$capitalized_name$();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field.Builder setField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$set$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field.Builder setField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    $type$.Builder builderForValue) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(builderForValue);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    $type$.Builder builderForValue) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(builderForValue);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field.Builder mergeField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder "
-    "${$merge$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.merge$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$merge$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.merge$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Field.Builder clearField()
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  copyOnWrite();\n"
+      "  instance.clear$capitalized_name$();\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableMessageOneofFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$oneof_name$_ = visitor.visitOneofMessage(\n"
-    "    $has_oneof_case_message$,\n"
-    "    $oneof_name$_,\n"
-    "    other.$oneof_name$_);\n");
-}
-
-void ImmutableMessageOneofFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$type$.Builder subBuilder = null;\n"
-    "if ($has_oneof_case_message$) {\n"
-    "  subBuilder = (($type$) $oneof_name$_).toBuilder();\n"
-    "}\n");
-
-    if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
-      printer->Print(variables_,
-        "$oneof_name$_ = input.readGroup($number$, $type$.parser(),\n"
-        "    extensionRegistry);\n");
-    } else {
-      printer->Print(variables_,
-        "$oneof_name$_ =\n"
-        "     input.readMessage($type$.parser(), extensionRegistry);\n");
-    }
-
-  printer->Print(variables_,
-    "if (subBuilder != null) {\n"
-    "  subBuilder.mergeFrom(($type$) $oneof_name$_);\n"
-    "  $oneof_name$_ = subBuilder.buildPartial();\n"
-    "}\n");
-  printer->Print(variables_,
-    "$set_oneof_case_message$;\n");
-}
-
-void ImmutableMessageOneofFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  output.write$group_or_message$($number$, ($type$) $oneof_name$_);\n"
-    "}\n");
-}
-
-void ImmutableMessageOneofFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .compute$group_or_message$Size($number$, ($type$) $oneof_name$_);\n"
-    "}\n");
-}
-
 // ===================================================================
 
 RepeatedImmutableMessageFieldLiteGenerator::
@@ -597,383 +482,325 @@
 }
 
 RepeatedImmutableMessageFieldLiteGenerator::
-~RepeatedImmutableMessageFieldLiteGenerator() {}
+    ~RepeatedImmutableMessageFieldLiteGenerator() {}
 
 int RepeatedImmutableMessageFieldLiteGenerator::GetNumBitsForMessage() const {
   return 0;
 }
 
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldLiteGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   // TODO(jonp): In the future, consider having methods specific to the
   // interface so that builders can choose dynamically to either return a
   // message or a nested builder, so that asking for the interface doesn't
   // cause a message to ever be built.
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.util.List<$type$> \n"
-    "    get$capitalized_name$List();\n");
+                 "$deprecation$java.util.List<$type$> \n"
+                 "    get$capitalized_name$List();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$(int index);\n");
+                 "$deprecation$$type$ get$capitalized_name$(int index);\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$int get$capitalized_name$Count();\n");
+                 "$deprecation$int get$capitalized_name$Count();\n");
 }
 
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private com.google.protobuf.Internal.ProtobufList<$type$> $name$_;\n");
+void RepeatedImmutableMessageFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "private com.google.protobuf.Internal.ProtobufList<$type$> $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\n"
-    "  return $name$_;\n"   // note:  unmodifiable list
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public java.util.List<$type$> "
+                 "${$get$capitalized_name$List$}$() {\n"
+                 "  return $name$_;\n"  // note:  unmodifiable list
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
+      "    ${$get$capitalized_name$OrBuilderList$}$() {\n"
+      "  return $name$_;\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return $name$_.get(index);\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
-    "    ${$get$capitalized_name$OrBuilderList$}$() {\n"
-    "  return $name$_;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return $name$_.get(index);\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public $type$OrBuilder "
-    "${$get$capitalized_name$OrBuilder$}$(\n"
-    "    int index) {\n"
-    "  return $name$_.get(index);\n"
-    "}\n");
+                 "$deprecation$public $type$OrBuilder "
+                 "${$get$capitalized_name$OrBuilder$}$(\n"
+                 "    int index) {\n"
+                 "  return $name$_.get(index);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
-  printer->Print(variables_,
-    "private void ensure$capitalized_name$IsMutable() {\n"
-    "  if (!$is_mutable$) {\n"
-    "    $name$_ =\n"
-    "        com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
-    "   }\n"
-    "}\n"
-    "\n");
+  printer->Print(
+      variables_,
+      "private void ensure$capitalized_name$IsMutable() {\n"
+      "  if (!$is_mutable$) {\n"
+      "    $name$_ =\n"
+      "        com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
+      "   }\n"
+      "}\n"
+      "\n");
 
   // Builder setRepeatedField(int index, Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$(\n"
-    "    int index, $type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.set(index, value);\n"
-    "}\n");
+                 "private void set$capitalized_name$(\n"
+                 "    int index, $type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.set(index, value);\n"
+                 "}\n");
 
   // Builder setRepeatedField(int index, Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$(\n"
-    "    int index, $type$.Builder builderForValue) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.set(index, builderForValue.build());\n"
-    "}\n");
+                 "private void set$capitalized_name$(\n"
+                 "    int index, $type$.Builder builderForValue) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.set(index, builderForValue.build());\n"
+                 "}\n");
 
   // Builder addRepeatedField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void add$capitalized_name$($type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.add(value);\n"
-    "}\n");
+                 "private void add$capitalized_name$($type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.add(value);\n"
+                 "}\n");
 
   // Builder addRepeatedField(int index, Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void add$capitalized_name$(\n"
-    "    int index, $type$ value) {\n"
-    "  if (value == null) {\n"
-    "    throw new NullPointerException();\n"
-    "  }\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.add(index, value);\n"
-    "}\n");
+                 "private void add$capitalized_name$(\n"
+                 "    int index, $type$ value) {\n"
+                 "  if (value == null) {\n"
+                 "    throw new NullPointerException();\n"
+                 "  }\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.add(index, value);\n"
+                 "}\n");
   // Builder addRepeatedField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void add$capitalized_name$(\n"
-    "    $type$.Builder builderForValue) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.add(builderForValue.build());\n"
-    "}\n");
+                 "private void add$capitalized_name$(\n"
+                 "    $type$.Builder builderForValue) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.add(builderForValue.build());\n"
+                 "}\n");
 
   // Builder addRepeatedField(int index, Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void add$capitalized_name$(\n"
-    "    int index, $type$.Builder builderForValue) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.add(index, builderForValue.build());\n"
-    "}\n");
+                 "private void add$capitalized_name$(\n"
+                 "    int index, $type$.Builder builderForValue) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.add(index, builderForValue.build());\n"
+                 "}\n");
 
   // Builder addAllRepeatedField(Iterable<Field> values)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void addAll$capitalized_name$(\n"
-    "    java.lang.Iterable<? extends $type$> values) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  com.google.protobuf.AbstractMessageLite.addAll(\n"
-    "      values, $name$_);\n"
-    "}\n");
+                 "private void addAll$capitalized_name$(\n"
+                 "    java.lang.Iterable<? extends $type$> values) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  com.google.protobuf.AbstractMessageLite.addAll(\n"
+                 "      values, $name$_);\n"
+                 "}\n");
 
   // Builder clearAllRepeatedField()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void clear$capitalized_name$() {\n"
-    "  $name$_ = emptyProtobufList();\n"
-    "}\n");
+                 "private void clear$capitalized_name$() {\n"
+                 "  $name$_ = emptyProtobufList();\n"
+                 "}\n");
 
   // Builder removeRepeatedField(int index)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void remove$capitalized_name$(int index) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.remove(index);\n"
-    "}\n");
+                 "private void remove$capitalized_name$(int index) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.remove(index);\n"
+                 "}\n");
 }
 
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   // The comments above the methods below are based on a hypothetical
   // repeated field of type "Field" called "RepeatedField".
 
   // List<Field> getRepeatedFieldList()
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.util.List<$type$> "
-    "${$get$capitalized_name$List$}$() {\n"
-    "  return java.util.Collections.unmodifiableList(\n"
-    "      instance.get$capitalized_name$List());\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public java.util.List<$type$> "
+                 "${$get$capitalized_name$List$}$() {\n"
+                 "  return java.util.Collections.unmodifiableList(\n"
+                 "      instance.get$capitalized_name$List());\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // int getRepeatedFieldCount()
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return instance.get$capitalized_name$Count();\n"
-    "}");
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return instance.get$capitalized_name$Count();\n"
+      "}");
   printer->Annotate("{", "}", descriptor_);
 
   // Field getRepeatedField(int index)
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return instance.get$capitalized_name$(index);\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return instance.get$capitalized_name$(index);\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Builder setRepeatedField(int index, Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    int index, $type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(index, value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    int index, $type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(index, value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Builder setRepeatedField(int index, Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    int index, $type$.Builder builderForValue) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(index, builderForValue);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    int index, $type$.Builder builderForValue) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(index, builderForValue);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Builder addRepeatedField(Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.add$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$add$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.add$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Builder addRepeatedField(int index, Field value)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
-    "    int index, $type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.add$capitalized_name$(index, value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+                 "    int index, $type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.add$capitalized_name$(index, value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   // Builder addRepeatedField(Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
-    "    $type$.Builder builderForValue) {\n"
-    "  copyOnWrite();\n"
-    "  instance.add$capitalized_name$(builderForValue);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+                 "    $type$.Builder builderForValue) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.add$capitalized_name$(builderForValue);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Builder addRepeatedField(int index, Field.Builder builderForValue)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
-    "    int index, $type$.Builder builderForValue) {\n"
-    "  copyOnWrite();\n"
-    "  instance.add$capitalized_name$(index, builderForValue);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+                 "    int index, $type$.Builder builderForValue) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.add$capitalized_name$(index, builderForValue);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Builder addAllRepeatedField(Iterable<Field> values)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
-    "    java.lang.Iterable<? extends $type$> values) {\n"
-    "  copyOnWrite();\n"
-    "  instance.addAll$capitalized_name$(values);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
+                 "    java.lang.Iterable<? extends $type$> values) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.addAll$capitalized_name$(values);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Builder clearAllRepeatedField()
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  copyOnWrite();\n"
+      "  instance.clear$capitalized_name$();\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   // Builder removeRepeatedField(int index)
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$remove$capitalized_name$$}$(int index) {\n"
-    "  copyOnWrite();\n"
-    "  instance.remove$capitalized_name$(index);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$remove$capitalized_name$$}$(int index) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.remove$capitalized_name$(index);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+
+void RepeatedImmutableMessageFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
   printer->Print(variables_,
-    "get$capitalized_name$FieldBuilder();\n");
+                 "\"$name$_\",\n"
+                 "$type$.class,\n");
 }
 
-
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void RepeatedImmutableMessageFieldLiteGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = emptyProtobufList();\n");
 }
 
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
-  printer->Print(variables_,
-      "$name$_= visitor.visitList($name$_, other.$name$_);\n");
-}
-
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$name$_.makeImmutable();\n");
-}
-
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (!$is_mutable$) {\n"
-    "  $name$_ =\n"
-    "      com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
-    "}\n");
-
-    if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
-      printer->Print(variables_,
-        "$name$_.add(input.readGroup($number$, $type$.parser(),\n"
-        "    extensionRegistry));\n");
-    } else {
-      printer->Print(variables_,
-        "$name$_.add(\n"
-        "    input.readMessage($type$.parser(), extensionRegistry));\n");
-    }
-}
-
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_mutable$) {\n"
-    "  $name$_.makeImmutable();\n"
-    "}\n");
-}
-
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "for (int i = 0; i < $name$_.size(); i++) {\n"
-    "  output.write$group_or_message$($number$, $name$_.get(i));\n"
-    "}\n");
-}
-
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "for (int i = 0; i < $name$_.size(); i++) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .compute$group_or_message$Size($number$, $name$_.get(i));\n"
-    "}\n");
-}
-
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "result = result && get$capitalized_name$List()\n"
-    "    .equals(other.get$capitalized_name$List());\n");
-}
-
-void RepeatedImmutableMessageFieldLiteGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (get$capitalized_name$Count() > 0) {\n"
-    "  hash = (37 * hash) + $constant_name$;\n"
-    "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
-    "}\n");
-}
-
 std::string RepeatedImmutableMessageFieldLiteGenerator::GetBoxedType() const {
   return name_resolver_->GetImmutableClassName(descriptor_->message_type());
 }
diff --git a/src/google/protobuf/compiler/java/java_message_field_lite.h b/src/google/protobuf/compiler/java/java_message_field_lite.h
index 7e78ca4..c409728 100644
--- a/src/google/protobuf/compiler/java/java_message_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_message_field_lite.h
@@ -69,15 +69,8 @@
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
   void GenerateInitializationCode(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateParsingDoneCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;
-  void GenerateEqualsCode(io::Printer* printer) const;
-  void GenerateHashCode(io::Printer* printer) const;
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
   std::string GetBoxedType() const;
 
@@ -102,11 +95,8 @@
 
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableMessageOneofFieldLiteGenerator);
@@ -125,16 +115,8 @@
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
   void GenerateInitializationCode(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateParsingDoneCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;
-  void GenerateEqualsCode(io::Printer* printer) const;
-  void GenerateHashCode(io::Printer* printer) const;
-
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
   std::string GetBoxedType() const;
 
diff --git a/src/google/protobuf/compiler/java/java_message_lite.cc b/src/google/protobuf/compiler/java/java_message_lite.cc
index c6d3991..c798feb 100644
--- a/src/google/protobuf/compiler/java/java_message_lite.cc
+++ b/src/google/protobuf/compiler/java/java_message_lite.cc
@@ -66,14 +66,6 @@
 using internal::WireFormatLite;
 
 namespace {
-bool EnableExperimentalRuntimeForLite() {
-#ifdef PROTOBUF_EXPERIMENT
-  return PROTOBUF_EXPERIMENT;
-#else   // PROTOBUF_EXPERIMENT
-  return false;
-#endif  // !PROTOBUF_EXPERIMENT
-}
-
 std::string MapValueImmutableClassdName(const Descriptor* descriptor,
                                         ClassNameResolver* name_resolver) {
   const FieldDescriptor* value_field = descriptor->FindFieldByName("value");
@@ -85,9 +77,10 @@
 // ===================================================================
 ImmutableMessageLiteGenerator::ImmutableMessageLiteGenerator(
     const Descriptor* descriptor, Context* context)
-  : MessageGenerator(descriptor), context_(context),
-    name_resolver_(context->GetNameResolver()),
-    field_generators_(descriptor, context_) {
+    : MessageGenerator(descriptor),
+      context_(context),
+      name_resolver_(context->GetNameResolver()),
+      field_generators_(descriptor, context_) {
   GOOGLE_CHECK(!HasDescriptorMethods(descriptor->file(), context->EnforceLite()))
       << "Generator factory error: A lite message generator is used to "
          "generate non-lite messages.";
@@ -130,41 +123,39 @@
         "     com.google.protobuf.GeneratedMessageLite.\n"
         "          ExtendableMessageOrBuilder<\n"
         "              $classname$, $classname$.Builder> {\n",
-        "deprecation", descriptor_->options().deprecated() ?
-            "@java.lang.Deprecated " : "",
+        "deprecation",
+        descriptor_->options().deprecated() ? "@java.lang.Deprecated " : "",
         "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
-        "classname", descriptor_->name(),
-        "{", "", "}", "");
+        "classname", descriptor_->name(), "{", "", "}", "");
   } else {
     printer->Print(
         "$deprecation$public interface ${$$classname$OrBuilder$}$ extends\n"
         "    $extra_interfaces$\n"
         "    com.google.protobuf.MessageLiteOrBuilder {\n",
-        "deprecation", descriptor_->options().deprecated() ?
-            "@java.lang.Deprecated " : "",
+        "deprecation",
+        descriptor_->options().deprecated() ? "@java.lang.Deprecated " : "",
         "extra_interfaces", ExtraMessageOrBuilderInterfaces(descriptor_),
-        "classname", descriptor_->name(),
-        "{", "", "}", "");
+        "classname", descriptor_->name(), "{", "", "}", "");
   }
   printer->Annotate("{", "}", descriptor_);
 
   printer->Indent();
-    for (int i = 0; i < descriptor_->field_count(); i++) {
-      printer->Print("\n");
-      field_generators_.get(descriptor_->field(i))
-                       .GenerateInterfaceMembers(printer);
-    }
-    for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
-      printer->Print(
-          "\n"
-          "public $classname$.$oneof_capitalized_name$Case "
-          "get$oneof_capitalized_name$Case();\n",
-          "oneof_capitalized_name",
-          context_->GetOneofGeneratorInfo(
-              descriptor_->oneof_decl(i))->capitalized_name,
-          "classname",
-          context_->GetNameResolver()->GetImmutableClassName(descriptor_));
-    }
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    printer->Print("\n");
+    field_generators_.get(descriptor_->field(i))
+        .GenerateInterfaceMembers(printer);
+  }
+  for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
+    printer->Print(
+        "\n"
+        "public $classname$.$oneof_capitalized_name$Case "
+        "get$oneof_capitalized_name$Case();\n",
+        "oneof_capitalized_name",
+        context_->GetOneofGeneratorInfo(descriptor_->oneof_decl(i))
+            ->capitalized_name,
+        "classname",
+        context_->GetNameResolver()->GetImmutableClassName(descriptor_));
+  }
   printer->Outdent();
 
   printer->Print("}\n");
@@ -179,8 +170,8 @@
   variables["static"] = is_own_file ? " " : " static ";
   variables["classname"] = descriptor_->name();
   variables["extra_interfaces"] = ExtraMessageInterfaces(descriptor_);
-  variables["deprecation"] = descriptor_->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  variables["deprecation"] =
+      descriptor_->options().deprecated() ? "@java.lang.Deprecated " : "";
 
   WriteMessageDocComment(printer, descriptor_);
   MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
@@ -190,17 +181,19 @@
   // The builder_type stores the super type name of the nested Builder class.
   std::string builder_type;
   if (descriptor_->extension_range_count() > 0) {
-    printer->Print(variables,
-      "$deprecation$public $static$final class $classname$ extends\n"
-      "    com.google.protobuf.GeneratedMessageLite.ExtendableMessage<\n"
-      "      $classname$, $classname$.Builder> implements\n"
-      "    $extra_interfaces$\n"
-      "    $classname$OrBuilder {\n");
+    printer->Print(
+        variables,
+        "$deprecation$public $static$final class $classname$ extends\n"
+        "    com.google.protobuf.GeneratedMessageLite.ExtendableMessage<\n"
+        "      $classname$, $classname$.Builder> implements\n"
+        "    $extra_interfaces$\n"
+        "    $classname$OrBuilder {\n");
     builder_type = strings::Substitute(
         "com.google.protobuf.GeneratedMessageLite.ExtendableBuilder<$0, ?>",
         name_resolver_->GetImmutableClassName(descriptor_));
   } else {
-    printer->Print(variables,
+    printer->Print(
+        variables,
         "$deprecation$public $static$final class $classname$ extends\n"
         "    com.google.protobuf.GeneratedMessageLite<\n"
         "        $classname$, $classname$.Builder> implements\n"
@@ -222,8 +215,8 @@
   for (int i = 0; i < descriptor_->nested_type_count(); i++) {
     // Don't generate Java classes for map entry messages.
     if (IsMapEntry(descriptor_->nested_type(i))) continue;
-    ImmutableMessageLiteGenerator messageGenerator(
-        descriptor_->nested_type(i), context_);
+    ImmutableMessageLiteGenerator messageGenerator(descriptor_->nested_type(i),
+                                                   context_);
     messageGenerator.GenerateInterface(printer);
     messageGenerator.Generate(printer);
   }
@@ -245,17 +238,17 @@
   for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
     const OneofDescriptor* oneof = descriptor_->oneof_decl(i);
     vars["oneof_name"] = context_->GetOneofGeneratorInfo(oneof)->name;
-    vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo(
-        oneof)->capitalized_name;
+    vars["oneof_capitalized_name"] =
+        context_->GetOneofGeneratorInfo(oneof)->capitalized_name;
     vars["oneof_index"] = StrCat(oneof->index());
     // oneofCase_ and oneof_
     printer->Print(vars,
-      "private int $oneof_name$Case_ = 0;\n"
-      "private java.lang.Object $oneof_name$_;\n");
+                   "private int $oneof_name$Case_ = 0;\n"
+                   "private java.lang.Object $oneof_name$_;\n");
     // OneofCase enum
     printer->Print(vars,
-      "public enum $oneof_capitalized_name$Case\n"
-      "    implements com.google.protobuf.Internal.EnumLite {\n");
+                   "public enum $oneof_capitalized_name$Case\n"
+                   "    implements com.google.protobuf.Internal.EnumLite {\n");
     printer->Indent();
     for (int j = 0; j < oneof->field_count(); j++) {
       const FieldDescriptor* field = oneof->field(j);
@@ -263,26 +256,25 @@
                      ToUpper(field->name()), "field_number",
                      StrCat(field->number()));
     }
+    printer->Print("$cap_oneof_name$_NOT_SET(0);\n", "cap_oneof_name",
+                   ToUpper(vars["oneof_name"]));
+    printer->Print(vars,
+                   "private final int value;\n"
+                   "private $oneof_capitalized_name$Case(int value) {\n"
+                   "  this.value = value;\n"
+                   "}\n");
     printer->Print(
-      "$cap_oneof_name$_NOT_SET(0);\n",
-      "cap_oneof_name",
-      ToUpper(vars["oneof_name"]));
-    printer->Print(vars,
-      "private final int value;\n"
-      "private $oneof_capitalized_name$Case(int value) {\n"
-      "  this.value = value;\n"
-      "}\n");
-    printer->Print(vars,
-      "/**\n"
-      " * @deprecated Use {@link #forNumber(int)} instead.\n"
-      " */\n"
-      "@java.lang.Deprecated\n"
-      "public static $oneof_capitalized_name$Case valueOf(int value) {\n"
-      "  return forNumber(value);\n"
-      "}\n"
-      "\n"
-      "public static $oneof_capitalized_name$Case forNumber(int value) {\n"
-      "  switch (value) {\n");
+        vars,
+        "/**\n"
+        " * @deprecated Use {@link #forNumber(int)} instead.\n"
+        " */\n"
+        "@java.lang.Deprecated\n"
+        "public static $oneof_capitalized_name$Case valueOf(int value) {\n"
+        "  return forNumber(value);\n"
+        "}\n"
+        "\n"
+        "public static $oneof_capitalized_name$Case forNumber(int value) {\n"
+        "  switch (value) {\n");
     for (int j = 0; j < oneof->field_count(); j++) {
       const FieldDescriptor* field = oneof->field(j);
       printer->Print("    case $field_number$: return $field_name$;\n",
@@ -290,31 +282,31 @@
                      "field_name", ToUpper(field->name()));
     }
     printer->Print(
-      "    case 0: return $cap_oneof_name$_NOT_SET;\n"
-      "    default: return null;\n"
-      "  }\n"
-      "}\n"
-      "@java.lang.Override\n"
-      "public int getNumber() {\n"
-      "  return this.value;\n"
-      "}\n",
-      "cap_oneof_name", ToUpper(vars["oneof_name"]));
+        "    case 0: return $cap_oneof_name$_NOT_SET;\n"
+        "    default: return null;\n"
+        "  }\n"
+        "}\n"
+        "@java.lang.Override\n"
+        "public int getNumber() {\n"
+        "  return this.value;\n"
+        "}\n",
+        "cap_oneof_name", ToUpper(vars["oneof_name"]));
     printer->Outdent();
     printer->Print("};\n\n");
     // oneofCase()
     printer->Print(vars,
-      "@java.lang.Override\n"
-      "public $oneof_capitalized_name$Case\n"
-      "get$oneof_capitalized_name$Case() {\n"
-      "  return $oneof_capitalized_name$Case.forNumber(\n"
-      "      $oneof_name$Case_);\n"
-      "}\n"
-      "\n"
-      "private void clear$oneof_capitalized_name$() {\n"
-      "  $oneof_name$Case_ = 0;\n"
-      "  $oneof_name$_ = null;\n"
-      "}\n"
-      "\n");
+                   "@java.lang.Override\n"
+                   "public $oneof_capitalized_name$Case\n"
+                   "get$oneof_capitalized_name$Case() {\n"
+                   "  return $oneof_capitalized_name$Case.forNumber(\n"
+                   "      $oneof_name$Case_);\n"
+                   "}\n"
+                   "\n"
+                   "private void clear$oneof_capitalized_name$() {\n"
+                   "  $oneof_name$Case_ = 0;\n"
+                   "  $oneof_name$_ = null;\n"
+                   "}\n"
+                   "\n");
   }
 
   // Fields
@@ -326,7 +318,6 @@
     printer->Print("\n");
   }
 
-  GenerateMessageSerializationMethods(printer);
   GenerateParseFromMethods(printer);
   GenerateBuilder(printer);
 
@@ -334,8 +325,7 @@
     // Memoizes whether the protocol buffer is fully initialized (has all
     // required fields). 0 means false, 1 means true, and all other values
     // mean not yet computed.
-    printer->Print(
-      "private byte memoizedIsInitialized = 2;\n");
+    printer->Print("private byte memoizedIsInitialized = 2;\n");
   }
 
   printer->Print(
@@ -353,74 +343,46 @@
   printer->Indent();
   printer->Indent();
 
-  printer->Print(
-    "case NEW_BUILDER: {\n");
+  printer->Print("case NEW_BUILDER: {\n");
 
   printer->Indent();
   GenerateDynamicMethodNewBuilder(printer);
   printer->Outdent();
 
-  if (!EnableExperimentalRuntimeForLite()) {
-    printer->Print(
+  printer->Print(
       "}\n"
-      "case IS_INITIALIZED: {\n");
-    printer->Indent();
-    GenerateDynamicMethodIsInitialized(printer);
-    printer->Outdent();
+      "case BUILD_MESSAGE_INFO: {\n");
 
-    printer->Print("}\n");
-
-    printer->Print(
-      "case MAKE_IMMUTABLE: {\n");
-
-    printer->Indent();
-    GenerateDynamicMethodMakeImmutable(printer);
-    printer->Outdent();
-
-    printer->Print(
-        "}\n"
-        "case VISIT: {\n");
-
-    printer->Indent();
-    GenerateDynamicMethodVisit(printer);
-    printer->Outdent();
-
-    printer->Print(
-        "}\n"
-        "case MERGE_FROM_STREAM: {\n");
-
-    printer->Indent();
-    GenerateDynamicMethodMergeFromStream(printer);
-    printer->Outdent();
-  }
-
+  printer->Indent();
+  GenerateDynamicMethodNewBuildMessageInfo(printer);
+  printer->Outdent();
 
   printer->Print(
-    "}\n"
-    "// fall through\n"
-    "case GET_DEFAULT_INSTANCE: {\n"
-    "  return DEFAULT_INSTANCE;\n"
-    "}\n"
-    "case GET_PARSER: {\n"
-    // Generally one would use the lazy initialization holder pattern for
-    // manipulating static fields but that has exceptional cost on Android as
-    // it will generate an extra class for every message. Instead, use the
-    // double-check locking pattern which works just as well.
-    //
-    // The "parser" temporary mirrors the "PARSER" field to eliminate a read
-    // at the final return statement.
-    "  com.google.protobuf.Parser<$classname$> parser = PARSER;\n"
-    "  if (parser == null) {\n"
-    "    synchronized ($classname$.class) {\n"
-    "      parser = PARSER;\n"
-    "      if (parser == null) {\n"
-    "        parser = new DefaultInstanceBasedParser(DEFAULT_INSTANCE);\n"
-    "        PARSER = parser;\n"
-    "      }\n"
-    "    }\n"
-    "  }\n"
-    "  return parser;\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "}\n"
+      "// fall through\n"
+      "case GET_DEFAULT_INSTANCE: {\n"
+      "  return DEFAULT_INSTANCE;\n"
+      "}\n"
+      "case GET_PARSER: {\n"
+      // Generally one would use the lazy initialization holder pattern for
+      // manipulating static fields but that has exceptional cost on Android as
+      // it will generate an extra class for every message. Instead, use the
+      // double-check locking pattern which works just as well.
+      //
+      // The "parser" temporary mirrors the "PARSER" field to eliminate a read
+      // at the final return statement.
+      "  com.google.protobuf.Parser<$classname$> parser = PARSER;\n"
+      "  if (parser == null) {\n"
+      "    synchronized ($classname$.class) {\n"
+      "      parser = PARSER;\n"
+      "      if (parser == null) {\n"
+      "        parser = new DefaultInstanceBasedParser(DEFAULT_INSTANCE);\n"
+      "        PARSER = parser;\n"
+      "      }\n"
+      "    }\n"
+      "  }\n"
+      "  return parser;\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Outdent();
 
@@ -447,43 +409,40 @@
 
   printer->Outdent();
   printer->Print(
-    "  }\n"
-    "  throw new UnsupportedOperationException();\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "  }\n"
+      "  throw new UnsupportedOperationException();\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Print(
-    "\n"
-    "// @@protoc_insertion_point(class_scope:$full_name$)\n",
-    "full_name", descriptor_->full_name());
-
+      "\n"
+      "// @@protoc_insertion_point(class_scope:$full_name$)\n",
+      "full_name", descriptor_->full_name());
 
   // Carefully initialize the default instance in such a way that it doesn't
   // conflict with other initialization.
-  printer->Print(
-    "private static final $classname$ DEFAULT_INSTANCE;\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+  printer->Print("private static final $classname$ DEFAULT_INSTANCE;\n",
+                 "classname",
+                 name_resolver_->GetImmutableClassName(descriptor_));
 
   printer->Print(
-    "static {\n"
-    "  // New instances are implicitly immutable so no need to make\n"
-    "  // immutable.\n"
-    "  DEFAULT_INSTANCE = new $classname$();\n"
-    "}\n"
-    "\n",
-    "classname", descriptor_->name());
-  if (EnableExperimentalRuntimeForLite()) {
-    // Register the default instance in a map. This map will be used by
-    // experimental runtime to lookup default instance given a class instance
-    // without using Java reflection.
-    printer->Print(
-        "static {\n"
-        "  com.google.protobuf.GeneratedMessageLite.registerDefaultInstance(\n"
-        "    $classname$.class, DEFAULT_INSTANCE);\n"
-        "}\n",
-        "classname", descriptor_->name());
-  }
+      "static {\n"
+      "  // New instances are implicitly immutable so no need to make\n"
+      "  // immutable.\n"
+      "  DEFAULT_INSTANCE = new $classname$();\n"
+      "}\n"
+      "\n",
+      "classname", descriptor_->name());
+  // Register the default instance in a map. This map will be used by
+  // experimental runtime to lookup default instance given a class instance
+  // without using Java reflection.
+  printer->Print(
+      "static {\n"
+      "  com.google.protobuf.GeneratedMessageLite.registerDefaultInstance(\n"
+      "    $classname$.class, DEFAULT_INSTANCE);\n"
+      "}\n",
+      "classname", descriptor_->name());
 
   printer->Print(
       "public static $classname$ getDefaultInstance() {\n"
@@ -513,216 +472,194 @@
         .Generate(printer);
   }
 
-
   printer->Outdent();
   printer->Print("}\n\n");
 }
 
+void ImmutableMessageLiteGenerator::GenerateDynamicMethodNewBuildMessageInfo(
+    io::Printer* printer) {
+  printer->Indent();
+
+  // Collect field info into a sequence of UTF-16 chars. It will be embedded
+  // as a Java string in the generated code.
+  std::vector<uint16> chars;
+
+  int flags = 0;
+  if (SupportFieldPresence(descriptor_->file())) {
+    flags |= 0x1;
+  }
+  if (descriptor_->options().message_set_wire_format()) {
+    flags |= 0x2;
+  }
+  WriteIntToUtf16CharSequence(flags, &chars);
+  WriteIntToUtf16CharSequence(descriptor_->field_count(), &chars);
+
+  if (descriptor_->field_count() == 0) {
+    printer->Print("java.lang.Object[] objects = null;");
+  } else {
+    // A single array of all fields (including oneof, oneofCase, hasBits).
+    printer->Print("java.lang.Object[] objects = new java.lang.Object[] {\n");
+    printer->Indent();
+
+    // Record the number of oneofs.
+    WriteIntToUtf16CharSequence(descriptor_->oneof_decl_count(), &chars);
+    for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
+      const OneofDescriptor* oneof = descriptor_->oneof_decl(i);
+      printer->Print(
+          "\"$oneof_name$_\",\n"
+          "\"$oneof_name$Case_\",\n",
+          "oneof_name", context_->GetOneofGeneratorInfo(oneof)->name);
+    }
+
+    // Integers for bit fields.
+    int total_bits = 0;
+    for (int i = 0; i < descriptor_->field_count(); i++) {
+      total_bits +=
+          field_generators_.get(descriptor_->field(i)).GetNumBitsForMessage();
+    }
+    int total_ints = (total_bits + 31) / 32;
+    for (int i = 0; i < total_ints; i++) {
+      printer->Print("\"$bit_field_name$\",\n", "bit_field_name",
+                     GetBitFieldName(i));
+    }
+    WriteIntToUtf16CharSequence(total_ints, &chars);
+
+    int map_count = 0;
+    int repeated_count = 0;
+    std::unique_ptr<const FieldDescriptor*[]> sorted_fields(
+        SortFieldsByNumber(descriptor_));
+    for (int i = 0; i < descriptor_->field_count(); i++) {
+      const FieldDescriptor* field = sorted_fields[i];
+      if (field->is_map()) {
+        map_count++;
+      } else if (field->is_repeated()) {
+        repeated_count++;
+      }
+    }
+
+    WriteIntToUtf16CharSequence(sorted_fields[0]->number(), &chars);
+    WriteIntToUtf16CharSequence(
+        sorted_fields[descriptor_->field_count() - 1]->number(), &chars);
+    WriteIntToUtf16CharSequence(descriptor_->field_count(), &chars);
+    WriteIntToUtf16CharSequence(map_count, &chars);
+    WriteIntToUtf16CharSequence(repeated_count, &chars);
+
+    std::vector<const FieldDescriptor*> fields_for_is_initialized_check;
+    for (int i = 0; i < descriptor_->field_count(); i++) {
+      if (descriptor_->field(i)->is_required() ||
+          (GetJavaType(descriptor_->field(i)) == JAVATYPE_MESSAGE &&
+           HasRequiredFields(descriptor_->field(i)->message_type()))) {
+        fields_for_is_initialized_check.push_back(descriptor_->field(i));
+      }
+    }
+    WriteIntToUtf16CharSequence(fields_for_is_initialized_check.size(), &chars);
+
+    for (int i = 0; i < descriptor_->field_count(); i++) {
+      const FieldDescriptor* field = sorted_fields[i];
+      field_generators_.get(field).GenerateFieldInfo(printer, &chars);
+    }
+    printer->Outdent();
+    printer->Print("};\n");
+  }
+
+  printer->Print("java.lang.String info =\n");
+  std::string line;
+  for (size_t i = 0; i < chars.size(); i++) {
+    uint16 code = chars[i];
+    EscapeUtf16ToString(code, &line);
+    if (line.size() >= 80) {
+      printer->Print("    \"$string$\" +\n", "string", line);
+      line.clear();
+    }
+  }
+  printer->Print("    \"$string$\";\n", "string", line);
+
+  printer->Print("return newMessageInfo(DEFAULT_INSTANCE, info, objects);\n");
+  printer->Outdent();
+}
 
 // ===================================================================
 
-void ImmutableMessageLiteGenerator::
-GenerateMessageSerializationMethods(io::Printer* printer) {
-  if (EnableExperimentalRuntimeForLite()) {
-    return;
-  }
-
-  std::unique_ptr<const FieldDescriptor * []> sorted_fields(
-      SortFieldsByNumber(descriptor_));
-
-  std::vector<const Descriptor::ExtensionRange*> sorted_extensions;
-  for (int i = 0; i < descriptor_->extension_range_count(); ++i) {
-    sorted_extensions.push_back(descriptor_->extension_range(i));
-  }
-  std::sort(sorted_extensions.begin(), sorted_extensions.end(),
-            ExtensionRangeOrdering());
-
+void ImmutableMessageLiteGenerator::GenerateParseFromMethods(
+    io::Printer* printer) {
   printer->Print(
-    "@java.lang.Override\n"
-    "public void writeTo(com.google.protobuf.CodedOutputStream output)\n"
-    "                    throws java.io.IOException {\n");
-  printer->Indent();
-  if (HasPackedFields(descriptor_)) {
-    // writeTo(CodedOutputStream output) might be invoked without
-    // getSerializedSize() ever being called, but we need the memoized
-    // sizes in case this message has packed fields. Rather than emit checks
-    // for each packed field, just call getSerializedSize() up front. In most
-    // cases, getSerializedSize() will have already been called anyway by one
-    // of the wrapper writeTo() methods, making this call cheap.
-    printer->Print("getSerializedSize();\n");
-  }
-
-  if (descriptor_->extension_range_count() > 0) {
-    if (descriptor_->options().message_set_wire_format()) {
-      printer->Print(
-          "com.google.protobuf.GeneratedMessageLite\n"
-          "  .ExtendableMessage<$classname$, $classname$.Builder>\n"
-          "    .ExtensionWriter extensionWriter =\n"
-          "      newMessageSetExtensionWriter();\n",
-          "classname", name_resolver_->GetImmutableClassName(descriptor_));
-    } else {
-      printer->Print(
-          "com.google.protobuf.GeneratedMessageLite\n"
-          "  .ExtendableMessage<$classname$, $classname$.Builder>\n"
-          "    .ExtensionWriter extensionWriter =\n"
-          "      newExtensionWriter();\n",
-          "classname", name_resolver_->GetImmutableClassName(descriptor_));
-    }
-  }
-
-  // Merge the fields and the extension ranges, both sorted by field number.
-  for (int i = 0, j = 0;
-       i < descriptor_->field_count() || j < sorted_extensions.size();) {
-    if (i == descriptor_->field_count()) {
-      GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);
-    } else if (j == sorted_extensions.size()) {
-      GenerateSerializeOneField(printer, sorted_fields[i++]);
-    } else if (sorted_fields[i]->number() < sorted_extensions[j]->start) {
-      GenerateSerializeOneField(printer, sorted_fields[i++]);
-    } else {
-      GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]);
-    }
-  }
-
-  if (descriptor_->options().message_set_wire_format()) {
-    printer->Print("unknownFields.writeAsMessageSetTo(output);\n");
-  } else {
-    printer->Print("unknownFields.writeTo(output);\n");
-  }
-
-  printer->Outdent();
-  printer->Print(
+      "public static $classname$ parseFrom(\n"
+      "    java.nio.ByteBuffer data)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
+      "      DEFAULT_INSTANCE, data);\n"
       "}\n"
-      "\n"
-      "@java.lang.Override\n"
-      "public int getSerializedSize() {\n"
-      "  int size = memoizedSerializedSize;\n"
-      "  if (size != -1) return size;\n"
-      "\n");
-  printer->Indent();
-  printer->Print(
-      "size = 0;\n");
-
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer);
-  }
-
-  if (descriptor_->extension_range_count() > 0) {
-    if (descriptor_->options().message_set_wire_format()) {
-      printer->Print("size += extensionsSerializedSizeAsMessageSet();\n");
-    } else {
-      printer->Print("size += extensionsSerializedSize();\n");
-    }
-  }
-
-  if (descriptor_->options().message_set_wire_format()) {
-    printer->Print("size += unknownFields.getSerializedSizeAsMessageSet();\n");
-  } else {
-    printer->Print("size += unknownFields.getSerializedSize();\n");
-  }
-
-  printer->Print(
-      "memoizedSerializedSize = size;\n"
-      "return size;\n");
-
-  printer->Outdent();
-  printer->Print(
-    "}\n"
-    "\n");
-}
-
-void ImmutableMessageLiteGenerator::
-GenerateParseFromMethods(io::Printer* printer) {
-  // Note:  These are separate from GenerateMessageSerializationMethods()
-  //   because they need to be generated even for messages that are optimized
-  //   for code size.
-  printer->Print(
-    "public static $classname$ parseFrom(\n"
-    "    java.nio.ByteBuffer data)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
-    "      DEFAULT_INSTANCE, data);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    java.nio.ByteBuffer data,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
-    "      DEFAULT_INSTANCE, data, extensionRegistry);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    com.google.protobuf.ByteString data)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
-    "      DEFAULT_INSTANCE, data);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    com.google.protobuf.ByteString data,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
-    "      DEFAULT_INSTANCE, data, extensionRegistry);\n"
-    "}\n"
-    "public static $classname$ parseFrom(byte[] data)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
-    "      DEFAULT_INSTANCE, data);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    byte[] data,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
-    "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
-    "      DEFAULT_INSTANCE, data, extensionRegistry);\n"
-    "}\n"
-    "public static $classname$ parseFrom(java.io.InputStream input)\n"
-    "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
-    "      DEFAULT_INSTANCE, input);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    java.io.InputStream input,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
-    "      DEFAULT_INSTANCE, input, extensionRegistry);\n"
-    "}\n"
-    "public static $classname$ parseDelimitedFrom(java.io.InputStream input)\n"
-    "    throws java.io.IOException {\n"
-    "  return parseDelimitedFrom(DEFAULT_INSTANCE, input);\n"
-    "}\n"
-    "public static $classname$ parseDelimitedFrom(\n"
-    "    java.io.InputStream input,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws java.io.IOException {\n"
-    "  return parseDelimitedFrom(DEFAULT_INSTANCE, input, extensionRegistry);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    com.google.protobuf.CodedInputStream input)\n"
-    "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
-    "      DEFAULT_INSTANCE, input);\n"
-    "}\n"
-    "public static $classname$ parseFrom(\n"
-    "    com.google.protobuf.CodedInputStream input,\n"
-    "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
-    "    throws java.io.IOException {\n"
-    "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
-    "      DEFAULT_INSTANCE, input, extensionRegistry);\n"
-    "}\n"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
-}
-
-void ImmutableMessageLiteGenerator::GenerateSerializeOneField(
-    io::Printer* printer, const FieldDescriptor* field) {
-  field_generators_.get(field).GenerateSerializationCode(printer);
-}
-
-void ImmutableMessageLiteGenerator::GenerateSerializeOneExtensionRange(
-    io::Printer* printer, const Descriptor::ExtensionRange* range) {
-  printer->Print("extensionWriter.writeUntil($end$, output);\n", "end",
-                 StrCat(range->end));
+      "public static $classname$ parseFrom(\n"
+      "    java.nio.ByteBuffer data,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
+      "      DEFAULT_INSTANCE, data, extensionRegistry);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    com.google.protobuf.ByteString data)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
+      "      DEFAULT_INSTANCE, data);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    com.google.protobuf.ByteString data,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
+      "      DEFAULT_INSTANCE, data, extensionRegistry);\n"
+      "}\n"
+      "public static $classname$ parseFrom(byte[] data)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
+      "      DEFAULT_INSTANCE, data);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    byte[] data,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws com.google.protobuf.InvalidProtocolBufferException {\n"
+      "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
+      "      DEFAULT_INSTANCE, data, extensionRegistry);\n"
+      "}\n"
+      "public static $classname$ parseFrom(java.io.InputStream input)\n"
+      "    throws java.io.IOException {\n"
+      "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
+      "      DEFAULT_INSTANCE, input);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    java.io.InputStream input,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws java.io.IOException {\n"
+      "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
+      "      DEFAULT_INSTANCE, input, extensionRegistry);\n"
+      "}\n"
+      "public static $classname$ parseDelimitedFrom(java.io.InputStream "
+      "input)\n"
+      "    throws java.io.IOException {\n"
+      "  return parseDelimitedFrom(DEFAULT_INSTANCE, input);\n"
+      "}\n"
+      "public static $classname$ parseDelimitedFrom(\n"
+      "    java.io.InputStream input,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws java.io.IOException {\n"
+      "  return parseDelimitedFrom(DEFAULT_INSTANCE, input, "
+      "extensionRegistry);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    com.google.protobuf.CodedInputStream input)\n"
+      "    throws java.io.IOException {\n"
+      "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
+      "      DEFAULT_INSTANCE, input);\n"
+      "}\n"
+      "public static $classname$ parseFrom(\n"
+      "    com.google.protobuf.CodedInputStream input,\n"
+      "    com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n"
+      "    throws java.io.IOException {\n"
+      "  return com.google.protobuf.GeneratedMessageLite.parseFrom(\n"
+      "      DEFAULT_INSTANCE, input, extensionRegistry);\n"
+      "}\n"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
 }
 
 // ===================================================================
@@ -744,383 +681,43 @@
 
 // ===================================================================
 
-void ImmutableMessageLiteGenerator::GenerateDynamicMethodIsInitialized(
-    io::Printer* printer) {
-  // Returns null for false, DEFAULT_INSTANCE for true.
-  if (!HasRequiredFields(descriptor_)) {
-    printer->Print("return DEFAULT_INSTANCE;\n");
-    return;
-  }
-
-  // TODO(xiaofeng): Remove this when b/64445758 is fixed. We don't need to
-  // check memoizedIsInitialized here because the caller does that already,
-  // but right now proguard proto shrinker asserts on the bytecode layout of
-  // this code so it can't be removed until proguard is updated.
-  printer->Print(
-    "byte isInitialized = memoizedIsInitialized;\n"
-    "if (isInitialized == 1) return DEFAULT_INSTANCE;\n"
-    "if (isInitialized == 0) return null;\n"
-    "\n"
-    "boolean shouldMemoize = ((Boolean) arg0).booleanValue();\n");
-
-  // Check that all required fields in this message are set.
-  // TODO(kenton):  We can optimize this when we switch to putting all the
-  //   "has" fields into a single bitfield.
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    const FieldDescriptor* field = descriptor_->field(i);
-    const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field);
-
-    if (field->is_required()) {
-      printer->Print(
-        "if (!has$name$()) {\n"
-        "  return null;\n"
-        "}\n",
-        "name", info->capitalized_name);
-    }
-  }
-
-  // Now check that all embedded messages are initialized.
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    const FieldDescriptor* field = descriptor_->field(i);
-    const FieldGeneratorInfo* info = context_->GetFieldGeneratorInfo(field);
-    if (GetJavaType(field) == JAVATYPE_MESSAGE &&
-        HasRequiredFields(field->message_type())) {
-      switch (field->label()) {
-        case FieldDescriptor::LABEL_REQUIRED:
-          printer->Print(
-            "if (!get$name$().isInitialized()) {\n"
-            "  return null;\n"
-            "}\n",
-            "type", name_resolver_->GetImmutableClassName(
-                field->message_type()),
-            "name", info->capitalized_name);
-          break;
-        case FieldDescriptor::LABEL_OPTIONAL:
-          if (!SupportFieldPresence(descriptor_->file()) &&
-              field->containing_oneof() != NULL) {
-            const OneofDescriptor* oneof = field->containing_oneof();
-            const OneofGeneratorInfo* oneof_info =
-                context_->GetOneofGeneratorInfo(oneof);
-            printer->Print("if ($oneof_name$Case_ == $field_number$) {\n",
-                           "oneof_name", oneof_info->name, "field_number",
-                           StrCat(field->number()));
-          } else {
-            printer->Print(
-              "if (has$name$()) {\n",
-              "name", info->capitalized_name);
-          }
-          printer->Print(
-            "  if (!get$name$().isInitialized()) {\n"
-            "    return null;\n"
-            "  }\n"
-            "}\n",
-            "name", info->capitalized_name);
-          break;
-        case FieldDescriptor::LABEL_REPEATED:
-          if (IsMapEntry(field->message_type())) {
-            printer->Print(
-              "for ($type$ item : get$name$Map().values()) {\n"
-              "  if (!item.isInitialized()) {\n"
-              "    return null;\n"
-              "  }\n"
-              "}\n",
-              "type", MapValueImmutableClassdName(field->message_type(),
-                                                  name_resolver_),
-              "name", info->capitalized_name);
-          } else {
-            printer->Print(
-              "for (int i = 0; i < get$name$Count(); i++) {\n"
-              "  if (!get$name$(i).isInitialized()) {\n"
-              "    return null;\n"
-              "  }\n"
-              "}\n",
-              "type", name_resolver_->GetImmutableClassName(
-                  field->message_type()),
-              "name", info->capitalized_name);
-          }
-          break;
-      }
-    }
-  }
-
-  if (descriptor_->extension_range_count() > 0) {
-    printer->Print(
-      "if (!extensionsAreInitialized()) {\n"
-      "  return null;\n"
-      "}\n");
-  }
-
-  printer->Print(
-    "return DEFAULT_INSTANCE;\n"
-    "\n");
-}
-
-// ===================================================================
-
-void ImmutableMessageLiteGenerator::GenerateDynamicMethodMakeImmutable(
-    io::Printer* printer) {
-
-  // Output generation code for each field.
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    field_generators_.get(descriptor_->field(i))
-        .GenerateDynamicMethodMakeImmutableCode(printer);
-  }
-
-  printer->Print(
-    "return null;\n");
-}
-
-// ===================================================================
-
 void ImmutableMessageLiteGenerator::GenerateDynamicMethodNewBuilder(
     io::Printer* printer) {
-  printer->Print(
-    "return new Builder();\n");
+  printer->Print("return new Builder();\n");
 }
 
 // ===================================================================
 
-void ImmutableMessageLiteGenerator::GenerateDynamicMethodVisit(
+void ImmutableMessageLiteGenerator::GenerateExtensionRegistrationCode(
     io::Printer* printer) {
-  printer->Print(
-    "Visitor visitor = (Visitor) arg0;\n"
-    "$classname$ other = ($classname$) arg1;\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
-
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    if (!descriptor_->field(i)->containing_oneof()) {
-      field_generators_.get(
-          descriptor_->field(i)).GenerateVisitCode(printer);
-    }
-  }
-
-  // Merge oneof fields.
-  for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) {
-    printer->Print(
-      "switch (other.get$oneof_capitalized_name$Case()) {\n",
-      "oneof_capitalized_name",
-      context_->GetOneofGeneratorInfo(
-          descriptor_->oneof_decl(i))->capitalized_name);
-    printer->Indent();
-    for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
-      const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
-      printer->Print(
-        "case $field_name$: {\n",
-        "field_name",
-        ToUpper(field->name()));
-      printer->Indent();
-      field_generators_.get(field).GenerateVisitCode(printer);
-      printer->Print(
-          "break;\n");
-      printer->Outdent();
-      printer->Print(
-          "}\n");
-    }
-    printer->Print(
-      "case $cap_oneof_name$_NOT_SET: {\n"
-      "  visitor.visitOneofNotSet($oneof_name$Case_ != 0);\n"
-      "  break;\n"
-      "}\n",
-      "cap_oneof_name",
-      ToUpper(context_->GetOneofGeneratorInfo(
-          descriptor_->oneof_decl(i))->name),
-      "oneof_name",
-      context_->GetOneofGeneratorInfo(
-          descriptor_->oneof_decl(i))->name);
-    printer->Outdent();
-    printer->Print(
-      "}\n");
-  }
-
-  printer->Print(
-    "if (visitor == com.google.protobuf.GeneratedMessageLite.MergeFromVisitor\n"
-    "    .INSTANCE) {\n");
-  printer->Indent();
-  for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) {
-    const OneofDescriptor* field = descriptor_->oneof_decl(i);
-    printer->Print(
-      "if (other.$oneof_name$Case_ != 0) {\n"
-      "  $oneof_name$Case_ = other.$oneof_name$Case_;\n"
-      "}\n",
-      "oneof_name", context_->GetOneofGeneratorInfo(field)->name);
-  }
-
-  // Integers for bit fields.
-  int totalBits = 0;
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    totalBits +=
-        field_generators_.get(descriptor_->field(i)).GetNumBitsForMessage();
-  }
-  int totalInts = (totalBits + 31) / 32;
-
-  for (int i = 0; i < totalInts; i++) {
-    printer->Print("$bit_field_name$ |= other.$bit_field_name$;\n",
-                   "bit_field_name", GetBitFieldName(i));
-  }
-  printer->Outdent();
-  printer->Print(
-    "}\n");
-
-
-  printer->Print(
-    "return this;\n");
-}
-
-// ===================================================================
-
-void ImmutableMessageLiteGenerator::GenerateDynamicMethodMergeFromStream(
-    io::Printer* printer) {
-  printer->Print(
-      "com.google.protobuf.CodedInputStream input =\n"
-      "    (com.google.protobuf.CodedInputStream) arg0;\n"
-      "com.google.protobuf.ExtensionRegistryLite extensionRegistry =\n"
-      "    (com.google.protobuf.ExtensionRegistryLite) arg1;\n"
-      "if (extensionRegistry == null) {\n"
-      "  throw new java.lang.NullPointerException();\n"
-      "}\n");
-  printer->Print(
-      "try {\n");
-  printer->Indent();
-  printer->Print(
-      "boolean done = false;\n"
-      "while (!done) {\n");
-  printer->Indent();
-
-  printer->Print(
-      "int tag = input.readTag();\n"
-      "switch (tag) {\n");
-  printer->Indent();
-
-  printer->Print(
-      "case 0:\n"  // zero signals EOF / limit reached
-      "  done = true;\n"
-      "  break;\n");
-
-  std::unique_ptr<const FieldDescriptor* []> sorted_fields(
-      SortFieldsByNumber(descriptor_));
-  for (int i = 0; i < descriptor_->field_count(); i++) {
-    const FieldDescriptor* field = sorted_fields[i];
-    uint32 tag = WireFormatLite::MakeTag(
-        field->number(), WireFormat::WireTypeForFieldType(field->type()));
-
-    printer->Print("case $tag$: {\n", "tag",
-                   StrCat(static_cast<int32>(tag)));
-    printer->Indent();
-
-    field_generators_.get(field).GenerateParsingCode(printer);
-
-    printer->Outdent();
-    printer->Print(
-      "  break;\n"
-      "}\n");
-
-    if (field->is_packable()) {
-      // To make packed = true wire compatible, we generate parsing code from
-      // a packed version of this field regardless of
-      // field->options().packed().
-      uint32 packed_tag = WireFormatLite::MakeTag(
-          field->number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED);
-      printer->Print("case $tag$: {\n", "tag",
-                     StrCat(static_cast<int32>(packed_tag)));
-      printer->Indent();
-
-      field_generators_.get(field).GenerateParsingCodeFromPacked(printer);
-
-      printer->Outdent();
-      printer->Print(
-          "  break;\n"
-          "}\n");
-    }
-  }
-
-  if (descriptor_->extension_range_count() > 0) {
-    if (descriptor_->options().message_set_wire_format()) {
-      printer->Print(
-          "default: {\n"
-          "  if (!parseUnknownFieldAsMessageSet(\n"
-          "      getDefaultInstanceForType(), input, extensionRegistry,\n"
-          "      tag)) {\n"
-          "    done = true;\n"  // it's an endgroup tag
-          "  }\n"
-          "  break;\n"
-          "}\n");
-    } else {
-      printer->Print(
-          "default: {\n"
-          "  if (!parseUnknownField(getDefaultInstanceForType(),\n"
-          "      input, extensionRegistry, tag)) {\n"
-          "    done = true;\n"  // it's an endgroup tag
-          "  }\n"
-          "  break;\n"
-          "}\n");
-    }
-  } else {
-    printer->Print(
-        "default: {\n"
-        "  if (!parseUnknownField(tag, input)) {\n"
-        "    done = true;\n"  // it's an endgroup tag
-        "  }\n"
-        "  break;\n"
-        "}\n");
-  }
-
-  printer->Outdent();
-  printer->Outdent();
-  printer->Print(
-      "  }\n"  // switch (tag)
-      "}\n");  // while (!done)
-
-  printer->Outdent();
-  printer->Print(
-      "} catch (com.google.protobuf.InvalidProtocolBufferException e) {\n"
-      "  throw new RuntimeException(e.setUnfinishedMessage(this));\n"
-      "} catch (java.io.IOException e) {\n"
-      "  throw new RuntimeException(\n"
-      "      new com.google.protobuf.InvalidProtocolBufferException(\n"
-      "          e.getMessage()).setUnfinishedMessage(this));\n"
-      "} finally {\n");
-  printer->Indent();
-
-  printer->Outdent();
-  printer->Print(
-      "}\n");     // finally
-}
-
-// ===================================================================
-
-void ImmutableMessageLiteGenerator::
-GenerateExtensionRegistrationCode(io::Printer* printer) {
   for (int i = 0; i < descriptor_->extension_count(); i++) {
     ImmutableExtensionLiteGenerator(descriptor_->extension(i), context_)
-      .GenerateRegistrationCode(printer);
+        .GenerateRegistrationCode(printer);
   }
 
   for (int i = 0; i < descriptor_->nested_type_count(); i++) {
     ImmutableMessageLiteGenerator(descriptor_->nested_type(i), context_)
-      .GenerateExtensionRegistrationCode(printer);
+        .GenerateExtensionRegistrationCode(printer);
   }
 }
 
 // ===================================================================
-void ImmutableMessageLiteGenerator::
-GenerateConstructor(io::Printer* printer) {
-  printer->Print(
-      "private $classname$() {\n",
-      "classname", descriptor_->name());
+void ImmutableMessageLiteGenerator::GenerateConstructor(io::Printer* printer) {
+  printer->Print("private $classname$() {\n", "classname", descriptor_->name());
   printer->Indent();
 
   // Initialize all fields to default.
   GenerateInitializers(printer);
 
   printer->Outdent();
-  printer->Print(
-      "}\n");
+  printer->Print("}\n");
 }
 
 // ===================================================================
 void ImmutableMessageLiteGenerator::GenerateParser(io::Printer* printer) {
   printer->Print(
-      "private static volatile com.google.protobuf.Parser<$classname$> PARSER;\n"
+      "private static volatile com.google.protobuf.Parser<$classname$> "
+      "PARSER;\n"
       "\n"
       "public static com.google.protobuf.Parser<$classname$> parser() {\n"
       "  return DEFAULT_INSTANCE.getParserForType();\n"
diff --git a/src/google/protobuf/compiler/java/java_message_lite.h b/src/google/protobuf/compiler/java/java_message_lite.h
index d38c54a..61e81df 100644
--- a/src/google/protobuf/compiler/java/java_message_lite.h
+++ b/src/google/protobuf/compiler/java/java_message_lite.h
@@ -35,8 +35,8 @@
 #ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_LITE_H__
 #define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_LITE_H__
 
-#include <string>
 #include <map>
+#include <string>
 #include <google/protobuf/compiler/java/java_field.h>
 #include <google/protobuf/compiler/java/java_message.h>
 
@@ -53,29 +53,20 @@
   virtual void Generate(io::Printer* printer);
   virtual void GenerateInterface(io::Printer* printer);
   virtual void GenerateExtensionRegistrationCode(io::Printer* printer);
-  virtual void GenerateStaticVariables(
-      io::Printer* printer, int* bytecode_estimate);
+  virtual void GenerateStaticVariables(io::Printer* printer,
+                                       int* bytecode_estimate);
   virtual int GenerateStaticVariableInitializers(io::Printer* printer);
 
  private:
-
-  void GenerateMessageSerializationMethods(io::Printer* printer);
   void GenerateParseFromMethods(io::Printer* printer);
-  void GenerateSerializeOneField(io::Printer* printer,
-                                 const FieldDescriptor* field);
-  void GenerateSerializeOneExtensionRange(
-      io::Printer* printer, const Descriptor::ExtensionRange* range);
 
   void GenerateBuilder(io::Printer* printer);
-  void GenerateDynamicMethodIsInitialized(io::Printer* printer);
-  void GenerateDynamicMethodMakeImmutable(io::Printer* printer);
-  void GenerateDynamicMethodVisit(io::Printer* printer);
-  void GenerateDynamicMethodMergeFromStream(io::Printer* printer);
   void GenerateDynamicMethodNewBuilder(io::Printer* printer);
   void GenerateInitializers(io::Printer* printer);
   void GenerateEqualsAndHashCode(io::Printer* printer);
   void GenerateParser(io::Printer* printer);
   void GenerateConstructor(io::Printer* printer);
+  void GenerateDynamicMethodNewBuildMessageInfo(io::Printer* printer);
 
   Context* context_;
   ClassNameResolver* name_resolver_;
diff --git a/src/google/protobuf/compiler/java/java_name_resolver.cc b/src/google/protobuf/compiler/java/java_name_resolver.cc
index f8e4b3a..d07c628 100644
--- a/src/google/protobuf/compiler/java/java_name_resolver.cc
+++ b/src/google/protobuf/compiler/java/java_name_resolver.cc
@@ -66,8 +66,7 @@
 // Get the name of a message's Java class without package name prefix.
 std::string ClassNameWithoutPackage(const Descriptor* descriptor,
                                     bool immutable) {
-  return StripPackageName(descriptor->full_name(),
-                          descriptor->file());
+  return StripPackageName(descriptor->full_name(), descriptor->file());
 }
 
 // Get the name of an enum's Java class without package name prefix.
@@ -78,8 +77,8 @@
   if (message_descriptor == NULL) {
     return descriptor->name();
   } else {
-    return ClassNameWithoutPackage(message_descriptor, immutable) +
-           "." + descriptor->name();
+    return ClassNameWithoutPackage(message_descriptor, immutable) + "." +
+           descriptor->name();
   }
 }
 
@@ -128,11 +127,9 @@
 
 }  // namespace
 
-ClassNameResolver::ClassNameResolver() {
-}
+ClassNameResolver::ClassNameResolver() {}
 
-ClassNameResolver::~ClassNameResolver() {
-}
+ClassNameResolver::~ClassNameResolver() {}
 
 std::string ClassNameResolver::GetFileDefaultImmutableClassName(
     const FileDescriptor* file) {
@@ -174,9 +171,9 @@
 
 // Check whether there is any type defined in the proto file that has
 // the given class name.
-bool ClassNameResolver::HasConflictingClassName(
-    const FileDescriptor* file, const std::string& classname,
-    NameEquality equality_mode) {
+bool ClassNameResolver::HasConflictingClassName(const FileDescriptor* file,
+                                                const std::string& classname,
+                                                NameEquality equality_mode) {
   for (int i = 0; i < file->enum_type_count(); i++) {
     if (CheckNameEquality(file->enum_type(i)->name(), classname) ==
         equality_mode) {
@@ -274,16 +271,14 @@
 
 std::string ClassNameResolver::GetJavaImmutableClassName(
     const Descriptor* descriptor) {
-  return GetJavaClassFullName(
-      ClassNameWithoutPackage(descriptor, true),
-      descriptor->file(), true);
+  return GetJavaClassFullName(ClassNameWithoutPackage(descriptor, true),
+                              descriptor->file(), true);
 }
 
 std::string ClassNameResolver::GetJavaImmutableClassName(
     const EnumDescriptor* descriptor) {
-  return GetJavaClassFullName(
-      ClassNameWithoutPackage(descriptor, true),
-      descriptor->file(), true);
+  return GetJavaClassFullName(ClassNameWithoutPackage(descriptor, true),
+                              descriptor->file(), true);
 }
 
 
diff --git a/src/google/protobuf/compiler/java/java_plugin_unittest.cc b/src/google/protobuf/compiler/java/java_plugin_unittest.cc
index b3e220f..744b2c8 100644
--- a/src/google/protobuf/compiler/java/java_plugin_unittest.cc
+++ b/src/google/protobuf/compiler/java/java_plugin_unittest.cc
@@ -38,8 +38,8 @@
 
 #include <google/protobuf/compiler/java/java_generator.h>
 #include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/io/printer.h>
+#include <google/protobuf/io/zero_copy_stream.h>
 
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/testing/file.h>
@@ -107,13 +107,8 @@
   std::string java_out = "--java_out=" + TestTempDir();
   std::string test_out = "--test_out=" + TestTempDir();
 
-  const char* argv[] = {
-    "protoc",
-    proto_path.c_str(),
-    java_out.c_str(),
-    test_out.c_str(),
-    "test.proto"
-  };
+  const char* argv[] = {"protoc", proto_path.c_str(), java_out.c_str(),
+                        test_out.c_str(), "test.proto"};
 
   EXPECT_EQ(0, cli.Run(5, argv));
 }
diff --git a/src/google/protobuf/compiler/java/java_primitive_field.cc b/src/google/protobuf/compiler/java/java_primitive_field.cc
index d26d43d..43c7f8f 100644
--- a/src/google/protobuf/compiler/java/java_primitive_field.cc
+++ b/src/google/protobuf/compiler/java/java_primitive_field.cc
@@ -69,10 +69,8 @@
   (*variables)["boxed_type"] = BoxedPrimitiveTypeName(javaType);
   (*variables)["field_type"] = (*variables)["type"];
 
-  if (javaType == JAVATYPE_BOOLEAN ||
-      javaType == JAVATYPE_DOUBLE ||
-      javaType == JAVATYPE_FLOAT ||
-      javaType == JAVATYPE_INT ||
+  if (javaType == JAVATYPE_BOOLEAN || javaType == JAVATYPE_DOUBLE ||
+      javaType == JAVATYPE_FLOAT || javaType == JAVATYPE_INT ||
       javaType == JAVATYPE_LONG) {
     std::string capitalized_type = UnderscoresToCamelCase(
         PrimitiveTypeName(javaType), /*cap_first_letter=*/true);
@@ -108,8 +106,10 @@
   }
 
   (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
-  (*variables)["default_init"] = IsDefaultValueJavaDefault(descriptor) ?
-      "" : ("= " + ImmutableDefaultValue(descriptor, name_resolver));
+  (*variables)["default_init"] =
+      IsDefaultValueJavaDefault(descriptor)
+          ? ""
+          : ("= " + ImmutableDefaultValue(descriptor, name_resolver));
   (*variables)["capitalized_type"] =
       GetCapitalizedType(descriptor, /* immutable = */ true);
   (*variables)["tag"] =
@@ -126,8 +126,8 @@
   }
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
-  (*variables)["deprecation"] = descriptor->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  (*variables)["deprecation"] =
+      descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
   int fixed_size = FixedSize(GetType(descriptor));
   if (fixed_size != -1) {
     (*variables)["fixed_size"] = StrCat(fixed_size);
@@ -184,14 +184,14 @@
 
 // ===================================================================
 
-ImmutablePrimitiveFieldGenerator::
-ImmutablePrimitiveFieldGenerator(const FieldDescriptor* descriptor,
-                                 int messageBitIndex,
-                                 int builderBitIndex,
-                                 Context* context)
-  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
-    builderBitIndex_(builderBitIndex), context_(context),
-    name_resolver_(context->GetNameResolver()) {
+ImmutablePrimitiveFieldGenerator::ImmutablePrimitiveFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : descriptor_(descriptor),
+      messageBitIndex_(messageBitIndex),
+      builderBitIndex_(builderBitIndex),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,
                         context->GetFieldGeneratorInfo(descriptor),
                         name_resolver_, &variables_);
@@ -207,129 +207,130 @@
   return GetNumBitsForMessage();
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void ImmutablePrimitiveFieldGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$boolean has$capitalized_name$();\n");
+                   "$deprecation$boolean has$capitalized_name$();\n");
   }
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$();\n");
+  printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n");
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private $field_type$ $name$_;\n");
+void ImmutablePrimitiveFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_, "private $field_type$ $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  return $name$_;\n"
-    "}\n");
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  return $name$_;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private $field_type$ $name$_ $default_init$;\n");
+void ImmutablePrimitiveFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_, "private $field_type$ $name$_ $default_init$;\n");
 
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_builder$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_builder$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  return $name$_;\n"
-    "}\n");
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  return $name$_;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
-    "$null_check$"
-    "  $set_has_field_bit_builder$\n"
-    "  $name$_ = value;\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$set$capitalized_name$$}$($type$ value) {\n"
+                 "$null_check$"
+                 "  $set_has_field_bit_builder$\n"
+                 "  $name$_ = value;\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  $clear_has_field_bit_builder$\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  $clear_has_field_bit_builder$\n");
   printer->Annotate("{", "}", descriptor_);
   JavaType type = GetJavaType(descriptor_);
   if (type == JAVATYPE_STRING || type == JAVATYPE_BYTES) {
     // The default value is not a simple literal so we want to avoid executing
     // it multiple times.  Instead, get the default out of the default instance.
-    printer->Print(variables_,
-      "  $name$_ = getDefaultInstance().get$capitalized_name$();\n");
+    printer->Print(
+        variables_,
+        "  $name$_ = getDefaultInstance().get$capitalized_name$();\n");
   } else {
-    printer->Print(variables_,
-      "  $name$_ = $default$;\n");
+    printer->Print(variables_, "  $name$_ = $default$;\n");
   }
   printer->Print(variables_,
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+void ImmutablePrimitiveFieldGenerator::GenerateFieldBuilderInitializationCode(
+    io::Printer* printer) const {
   // noop for primitives
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void ImmutablePrimitiveFieldGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   if (!IsDefaultValueJavaDefault(descriptor_)) {
     printer->Print(variables_, "$name$_ = $default$;\n");
   }
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
+void ImmutablePrimitiveFieldGenerator::GenerateBuilderClearCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$name$_ = $default$;\n"
-    "$clear_has_field_bit_builder$\n");
+                 "$name$_ = $default$;\n"
+                 "$clear_has_field_bit_builder$\n");
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void ImmutablePrimitiveFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     printer->Print(variables_,
-      "if (other.has$capitalized_name$()) {\n"
-      "  set$capitalized_name$(other.get$capitalized_name$());\n"
-      "}\n");
+                   "if (other.has$capitalized_name$()) {\n"
+                   "  set$capitalized_name$(other.get$capitalized_name$());\n"
+                   "}\n");
   } else {
     printer->Print(variables_,
-      "if (other.get$capitalized_name$() != $default$) {\n"
-      "  set$capitalized_name$(other.get$capitalized_name$());\n"
-      "}\n");
+                   "if (other.get$capitalized_name$() != $default$) {\n"
+                   "  set$capitalized_name$(other.get$capitalized_name$());\n"
+                   "}\n");
   }
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void ImmutablePrimitiveFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     if (IsDefaultValueJavaDefault(descriptor_)) {
       printer->Print(variables_,
@@ -349,65 +350,68 @@
   }
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void ImmutablePrimitiveFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$set_has_field_bit_message$\n"
-    "$name$_ = input.read$capitalized_type$();\n");
+                 "$set_has_field_bit_message$\n"
+                 "$name$_ = input.read$capitalized_type$();\n");
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
+void ImmutablePrimitiveFieldGenerator::GenerateParsingDoneCode(
+    io::Printer* printer) const {
   // noop for primitives.
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
+void ImmutablePrimitiveFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  output.write$capitalized_type$($number$, $name$_);\n"
-    "}\n");
+                 "if ($is_field_present_message$) {\n"
+                 "  output.write$capitalized_type$($number$, $name$_);\n"
+                 "}\n");
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
+void ImmutablePrimitiveFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .compute$capitalized_type$Size($number$, $name$_);\n"
-    "}\n");
+                 "if ($is_field_present_message$) {\n"
+                 "  size += com.google.protobuf.CodedOutputStream\n"
+                 "    .compute$capitalized_type$Size($number$, $name$_);\n"
+                 "}\n");
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
+void ImmutablePrimitiveFieldGenerator::GenerateEqualsCode(
+    io::Printer* printer) const {
   switch (GetJavaType(descriptor_)) {
     case JAVATYPE_INT:
     case JAVATYPE_LONG:
     case JAVATYPE_BOOLEAN:
       printer->Print(variables_,
-        "if (get$capitalized_name$()\n"
-        "    != other.get$capitalized_name$()) return false;\n");
+                     "if (get$capitalized_name$()\n"
+                     "    != other.get$capitalized_name$()) return false;\n");
       break;
 
     case JAVATYPE_FLOAT:
-      printer->Print(variables_,
-        "if (java.lang.Float.floatToIntBits(get$capitalized_name$())\n"
-        "    != java.lang.Float.floatToIntBits(\n"
-        "        other.get$capitalized_name$())) return false;\n");
+      printer->Print(
+          variables_,
+          "if (java.lang.Float.floatToIntBits(get$capitalized_name$())\n"
+          "    != java.lang.Float.floatToIntBits(\n"
+          "        other.get$capitalized_name$())) return false;\n");
       break;
 
     case JAVATYPE_DOUBLE:
-      printer->Print(variables_,
-        "if (java.lang.Double.doubleToLongBits(get$capitalized_name$())\n"
-        "    != java.lang.Double.doubleToLongBits(\n"
-        "        other.get$capitalized_name$())) return false;\n");
+      printer->Print(
+          variables_,
+          "if (java.lang.Double.doubleToLongBits(get$capitalized_name$())\n"
+          "    != java.lang.Double.doubleToLongBits(\n"
+          "        other.get$capitalized_name$())) return false;\n");
       break;
 
     case JAVATYPE_STRING:
     case JAVATYPE_BYTES:
-      printer->Print(variables_,
-        "if (!get$capitalized_name$()\n"
-        "    .equals(other.get$capitalized_name$())) return false;\n");
+      printer->Print(
+          variables_,
+          "if (!get$capitalized_name$()\n"
+          "    .equals(other.get$capitalized_name$())) return false;\n");
       break;
 
     case JAVATYPE_ENUM:
@@ -418,44 +422,47 @@
   }
 }
 
-void ImmutablePrimitiveFieldGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "hash = (37 * hash) + $constant_name$;\n");
+void ImmutablePrimitiveFieldGenerator::GenerateHashCode(
+    io::Printer* printer) const {
+  printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n");
   switch (GetJavaType(descriptor_)) {
     case JAVATYPE_INT:
       printer->Print(variables_,
-        "hash = (53 * hash) + get$capitalized_name$();\n");
+                     "hash = (53 * hash) + get$capitalized_name$();\n");
       break;
 
     case JAVATYPE_LONG:
-      printer->Print(variables_,
-        "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n"
-        "    get$capitalized_name$());\n");
+      printer->Print(
+          variables_,
+          "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n"
+          "    get$capitalized_name$());\n");
       break;
 
     case JAVATYPE_BOOLEAN:
-      printer->Print(variables_,
-        "hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(\n"
-        "    get$capitalized_name$());\n");
+      printer->Print(
+          variables_,
+          "hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(\n"
+          "    get$capitalized_name$());\n");
       break;
 
     case JAVATYPE_FLOAT:
       printer->Print(variables_,
-        "hash = (53 * hash) + java.lang.Float.floatToIntBits(\n"
-        "    get$capitalized_name$());\n");
+                     "hash = (53 * hash) + java.lang.Float.floatToIntBits(\n"
+                     "    get$capitalized_name$());\n");
       break;
 
     case JAVATYPE_DOUBLE:
-      printer->Print(variables_,
-        "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n"
-        "    java.lang.Double.doubleToLongBits(get$capitalized_name$()));\n");
+      printer->Print(
+          variables_,
+          "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n"
+          "    java.lang.Double.doubleToLongBits(get$capitalized_name$()));\n");
       break;
 
     case JAVATYPE_STRING:
     case JAVATYPE_BYTES:
-      printer->Print(variables_,
-        "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
+      printer->Print(
+          variables_,
+          "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
       break;
 
     case JAVATYPE_ENUM:
@@ -472,165 +479,166 @@
 
 // ===================================================================
 
-ImmutablePrimitiveOneofFieldGenerator::
-ImmutablePrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor,
-                                 int messageBitIndex,
-                                 int builderBitIndex,
-                                 Context* context)
-    : ImmutablePrimitiveFieldGenerator(
-          descriptor, messageBitIndex, builderBitIndex, context) {
+ImmutablePrimitiveOneofFieldGenerator::ImmutablePrimitiveOneofFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : ImmutablePrimitiveFieldGenerator(descriptor, messageBitIndex,
+                                       builderBitIndex, context) {
   const OneofGeneratorInfo* info =
       context->GetOneofGeneratorInfo(descriptor->containing_oneof());
   SetCommonOneofVariables(descriptor, info, &variables_);
 }
 
 ImmutablePrimitiveOneofFieldGenerator::
-~ImmutablePrimitiveOneofFieldGenerator() {}
+    ~ImmutablePrimitiveOneofFieldGenerator() {}
 
-void ImmutablePrimitiveOneofFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutablePrimitiveOneofFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
   PrintExtraFieldInfo(variables_, printer);
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $has_oneof_case_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $has_oneof_case_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    return ($boxed_type$) $oneof_name$_;\n"
-    "  }\n"
-    "  return $default$;\n"
-    "}\n");
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    return ($boxed_type$) $oneof_name$_;\n"
+                 "  }\n"
+                 "  return $default$;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-
-void ImmutablePrimitiveOneofFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutablePrimitiveOneofFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $has_oneof_case_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $has_oneof_case_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    return ($boxed_type$) $oneof_name$_;\n"
-    "  }\n"
-    "  return $default$;\n"
-    "}\n");
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    return ($boxed_type$) $oneof_name$_;\n"
+                 "  }\n"
+                 "  return $default$;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
-    "$null_check$"
-    "  $set_oneof_case_message$;\n"
-    "  $oneof_name$_ = value;\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$set$capitalized_name$$}$($type$ value) {\n"
+                 "$null_check$"
+                 "  $set_oneof_case_message$;\n"
+                 "  $oneof_name$_ = value;\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    $clear_oneof_case_message$;\n"
-    "    $oneof_name$_ = null;\n"
-    "    $on_changed$\n"
-    "  }\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  if ($has_oneof_case_message$) {\n"
+      "    $clear_oneof_case_message$;\n"
+      "    $oneof_name$_ = null;\n"
+      "    $on_changed$\n"
+      "  }\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutablePrimitiveOneofFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void ImmutablePrimitiveOneofFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  result.$oneof_name$_ = $oneof_name$_;\n"
-    "}\n");
+                 "if ($has_oneof_case_message$) {\n"
+                 "  result.$oneof_name$_ = $oneof_name$_;\n"
+                 "}\n");
 }
 
-void ImmutablePrimitiveOneofFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void ImmutablePrimitiveOneofFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "set$capitalized_name$(other.get$capitalized_name$());\n");
+                 "set$capitalized_name$(other.get$capitalized_name$());\n");
 }
 
-void ImmutablePrimitiveOneofFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void ImmutablePrimitiveOneofFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$set_oneof_case_message$;\n"
-    "$oneof_name$_ = input.read$capitalized_type$();\n");
+                 "$set_oneof_case_message$;\n"
+                 "$oneof_name$_ = input.read$capitalized_type$();\n");
 }
 
-void ImmutablePrimitiveOneofFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
+void ImmutablePrimitiveOneofFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  output.write$capitalized_type$(\n");
+                 "if ($has_oneof_case_message$) {\n"
+                 "  output.write$capitalized_type$(\n");
   // $type$ and $boxed_type$ is the same for bytes fields so we don't need to
   // do redundant casts.
   if (GetJavaType(descriptor_) == JAVATYPE_BYTES) {
-    printer->Print(variables_,
-      "      $number$, ($type$) $oneof_name$_);\n");
+    printer->Print(variables_, "      $number$, ($type$) $oneof_name$_);\n");
   } else {
-    printer->Print(variables_,
-      "      $number$, ($type$)(($boxed_type$) $oneof_name$_));\n");
+    printer->Print(
+        variables_,
+        "      $number$, ($type$)(($boxed_type$) $oneof_name$_));\n");
   }
-  printer->Print(
-    "}\n");
+  printer->Print("}\n");
 }
 
-void ImmutablePrimitiveOneofFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
+void ImmutablePrimitiveOneofFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .compute$capitalized_type$Size(\n");
+                 "if ($has_oneof_case_message$) {\n"
+                 "  size += com.google.protobuf.CodedOutputStream\n"
+                 "    .compute$capitalized_type$Size(\n");
   // $type$ and $boxed_type$ is the same for bytes fields so we don't need to
   // do redundant casts.
   if (GetJavaType(descriptor_) == JAVATYPE_BYTES) {
-    printer->Print(variables_,
-      "        $number$, ($type$) $oneof_name$_);\n");
+    printer->Print(variables_, "        $number$, ($type$) $oneof_name$_);\n");
   } else {
-    printer->Print(variables_,
-      "        $number$, ($type$)(($boxed_type$) $oneof_name$_));\n");
+    printer->Print(
+        variables_,
+        "        $number$, ($type$)(($boxed_type$) $oneof_name$_));\n");
   }
-  printer->Print(
-    "}\n");
+  printer->Print("}\n");
 }
 
 // ===================================================================
 
 RepeatedImmutablePrimitiveFieldGenerator::
-RepeatedImmutablePrimitiveFieldGenerator(const FieldDescriptor* descriptor,
-                                         int messageBitIndex,
-                                         int builderBitIndex,
-                                         Context* context)
-  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
-    builderBitIndex_(builderBitIndex), context_(context),
-    name_resolver_(context->GetNameResolver()) {
+    RepeatedImmutablePrimitiveFieldGenerator(const FieldDescriptor* descriptor,
+                                             int messageBitIndex,
+                                             int builderBitIndex,
+                                             Context* context)
+    : descriptor_(descriptor),
+      messageBitIndex_(messageBitIndex),
+      builderBitIndex_(builderBitIndex),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,
                         context->GetFieldGeneratorInfo(descriptor),
                         name_resolver_, &variables_);
 }
 
 RepeatedImmutablePrimitiveFieldGenerator::
-~RepeatedImmutablePrimitiveFieldGenerator() {}
+    ~RepeatedImmutablePrimitiveFieldGenerator() {}
 
 int RepeatedImmutablePrimitiveFieldGenerator::GetNumBitsForMessage() const {
   return 0;
@@ -640,53 +648,54 @@
   return 1;
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.util.List<$boxed_type$> get$capitalized_name$List();\n");
+                 "$deprecation$java.util.List<$boxed_type$> "
+                 "get$capitalized_name$List();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$int get$capitalized_name$Count();\n");
+                 "$deprecation$int get$capitalized_name$Count();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$(int index);\n");
+                 "$deprecation$$type$ get$capitalized_name$(int index);\n");
 }
 
-
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private $field_list_type$ $name$_;\n");
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_, "private $field_list_type$ $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.util.List<$boxed_type$>\n"
-    "    ${$get$capitalized_name$List$}$() {\n"
-    "  return $name$_;\n"   // note:  unmodifiable list
-    "}\n");
+                 "$deprecation$public java.util.List<$boxed_type$>\n"
+                 "    ${$get$capitalized_name$List$}$() {\n"
+                 "  return $name$_;\n"  // note:  unmodifiable list
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return $repeated_get$(index);\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return $repeated_get$(index);\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   if (descriptor_->is_packed()) {
     printer->Print(variables_,
-      "private int $name$MemoizedSerializedSize = -1;\n");
+                   "private int $name$MemoizedSerializedSize = -1;\n");
   }
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   // One field is the list and the bit field keeps track of whether the
   // list is immutable. If it's immutable, the invariant is that it must
   // either an instance of Collections.emptyList() or it's an ArrayList
@@ -697,244 +706,254 @@
   // just that the list cannot be modified via the reference but that the
   // list can never be modified.
   printer->Print(variables_,
-    "private $field_list_type$ $name$_ = $empty_list$;\n");
+                 "private $field_list_type$ $name$_ = $empty_list$;\n");
 
   printer->Print(variables_,
-    "private void ensure$capitalized_name$IsMutable() {\n"
-    "  if (!$get_mutable_bit_builder$) {\n"
-    "    $name$_ = $mutable_copy_list$;\n"
-    "    $set_mutable_bit_builder$;\n"
-    "   }\n"
-    "}\n");
+                 "private void ensure$capitalized_name$IsMutable() {\n"
+                 "  if (!$get_mutable_bit_builder$) {\n"
+                 "    $name$_ = $mutable_copy_list$;\n"
+                 "    $set_mutable_bit_builder$;\n"
+                 "   }\n"
+                 "}\n");
 
-    // Note:  We return an unmodifiable list because otherwise the caller
-    //   could hold on to the returned list and modify it after the message
-    //   has been built, thus mutating the message which is supposed to be
-    //   immutable.
+  // Note:  We return an unmodifiable list because otherwise the caller
+  //   could hold on to the returned list and modify it after the message
+  //   has been built, thus mutating the message which is supposed to be
+  //   immutable.
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public java.util.List<$boxed_type$>\n"
-    "    ${$get$capitalized_name$List$}$() {\n"
-    "  return $get_mutable_bit_builder$ ?\n"
-    "           java.util.Collections.unmodifiableList($name$_) : $name$_;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public java.util.List<$boxed_type$>\n"
+      "    ${$get$capitalized_name$List$}$() {\n"
+      "  return $get_mutable_bit_builder$ ?\n"
+      "           java.util.Collections.unmodifiableList($name$_) : $name$_;\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return $repeated_get$(index);\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    int index, $type$ value) {\n"
+                 "$null_check$"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $repeated_set$(index, value);\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return $repeated_get$(index);\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$add$capitalized_name$$}$($type$ value) {\n"
+                 "$null_check$"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $repeated_add$(value);\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    int index, $type$ value) {\n"
-    "$null_check$"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $repeated_set$(index, value);\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
+                 "    java.lang.Iterable<? extends $boxed_type$> values) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
+                 "      values, $name$_);\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value) {\n"
-    "$null_check$"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $repeated_add$(value);\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
-    "    java.lang.Iterable<? extends $boxed_type$> values) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
-    "      values, $name$_);\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  $name$_ = $empty_list$;\n"
-    "  $clear_mutable_bit_builder$;\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  $name$_ = $empty_list$;\n"
+      "  $clear_mutable_bit_builder$;\n"
+      "  $on_changed$\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
 void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+    GenerateFieldBuilderInitializationCode(io::Printer* printer) const {
   // noop for primitives
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = $empty_list$;\n");
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateBuilderClearCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$name$_ = $empty_list$;\n"
-    "$clear_mutable_bit_builder$;\n");
+                 "$name$_ = $empty_list$;\n"
+                 "$clear_mutable_bit_builder$;\n");
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   // The code below does two optimizations:
   //   1. If the other list is empty, there's nothing to do. This ensures we
   //      don't allocate a new array if we already have an immutable one.
   //   2. If the other list is non-empty and our current list is empty, we can
   //      reuse the other list which is guaranteed to be immutable.
   printer->Print(variables_,
-    "if (!other.$name$_.isEmpty()) {\n"
-    "  if ($name$_.isEmpty()) {\n"
-    "    $name$_ = other.$name$_;\n"
-    "    $clear_mutable_bit_builder$;\n"
-    "  } else {\n"
-    "    ensure$capitalized_name$IsMutable();\n"
-    "    $name$_.addAll(other.$name$_);\n"
-    "  }\n"
-    "  $on_changed$\n"
-    "}\n");
+                 "if (!other.$name$_.isEmpty()) {\n"
+                 "  if ($name$_.isEmpty()) {\n"
+                 "    $name$_ = other.$name$_;\n"
+                 "    $clear_mutable_bit_builder$;\n"
+                 "  } else {\n"
+                 "    ensure$capitalized_name$IsMutable();\n"
+                 "    $name$_.addAll(other.$name$_);\n"
+                 "  }\n"
+                 "  $on_changed$\n"
+                 "}\n");
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   // The code below ensures that the result has an immutable list. If our
   // list is immutable, we can just reuse it. If not, we make it immutable.
   printer->Print(variables_,
-    "if ($get_mutable_bit_builder$) {\n"
-    "  $name_make_immutable$;\n"
-    "  $clear_mutable_bit_builder$;\n"
-    "}\n"
-    "result.$name$_ = $name$_;\n");
+                 "if ($get_mutable_bit_builder$) {\n"
+                 "  $name_make_immutable$;\n"
+                 "  $clear_mutable_bit_builder$;\n"
+                 "}\n"
+                 "result.$name$_ = $name$_;\n");
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if (!$get_mutable_bit_parser$) {\n"
-    "  $name$_ = $create_list$;\n"
-    "  $set_mutable_bit_parser$;\n"
-    "}\n"
-    "$repeated_add$(input.read$capitalized_type$());\n");
+                 "if (!$get_mutable_bit_parser$) {\n"
+                 "  $name$_ = $create_list$;\n"
+                 "  $set_mutable_bit_parser$;\n"
+                 "}\n"
+                 "$repeated_add$(input.read$capitalized_type$());\n");
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateParsingCodeFromPacked(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateParsingCodeFromPacked(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "int length = input.readRawVarint32();\n"
+      "int limit = input.pushLimit(length);\n"
+      "if (!$get_mutable_bit_parser$ && input.getBytesUntilLimit() > 0) {\n"
+      "  $name$_ = $create_list$;\n"
+      "  $set_mutable_bit_parser$;\n"
+      "}\n"
+      "while (input.getBytesUntilLimit() > 0) {\n"
+      "  $repeated_add$(input.read$capitalized_type$());\n"
+      "}\n"
+      "input.popLimit(limit);\n");
+}
+
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateParsingDoneCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "int length = input.readRawVarint32();\n"
-    "int limit = input.pushLimit(length);\n"
-    "if (!$get_mutable_bit_parser$ && input.getBytesUntilLimit() > 0) {\n"
-    "  $name$_ = $create_list$;\n"
-    "  $set_mutable_bit_parser$;\n"
-    "}\n"
-    "while (input.getBytesUntilLimit() > 0) {\n"
-    "  $repeated_add$(input.read$capitalized_type$());\n"
-    "}\n"
-    "input.popLimit(limit);\n");
+                 "if ($get_mutable_bit_parser$) {\n"
+                 "  $name_make_immutable$; // C\n"
+                 "}\n");
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($get_mutable_bit_parser$) {\n"
-    "  $name_make_immutable$; // C\n"
-    "}\n");
-}
-
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
   if (descriptor_->is_packed()) {
     // We invoke getSerializedSize in writeTo for messages that have packed
     // fields in ImmutableMessageGenerator::GenerateMessageSerializationMethods.
     // That makes it safe to rely on the memoized size here.
     printer->Print(variables_,
-      "if (get$capitalized_name$List().size() > 0) {\n"
-      "  output.writeUInt32NoTag($tag$);\n"
-      "  output.writeUInt32NoTag($name$MemoizedSerializedSize);\n"
-      "}\n"
-      "for (int i = 0; i < $name$_.size(); i++) {\n"
-      "  output.write$capitalized_type$NoTag($repeated_get$(i));\n"
-      "}\n");
+                   "if (get$capitalized_name$List().size() > 0) {\n"
+                   "  output.writeUInt32NoTag($tag$);\n"
+                   "  output.writeUInt32NoTag($name$MemoizedSerializedSize);\n"
+                   "}\n"
+                   "for (int i = 0; i < $name$_.size(); i++) {\n"
+                   "  output.write$capitalized_type$NoTag($repeated_get$(i));\n"
+                   "}\n");
   } else {
-    printer->Print(variables_,
-      "for (int i = 0; i < $name$_.size(); i++) {\n"
-      "  output.write$capitalized_type$($number$, $repeated_get$(i));\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "for (int i = 0; i < $name$_.size(); i++) {\n"
+        "  output.write$capitalized_type$($number$, $repeated_get$(i));\n"
+        "}\n");
   }
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "{\n"
-    "  int dataSize = 0;\n");
+                 "{\n"
+                 "  int dataSize = 0;\n");
   printer->Indent();
 
   if (FixedSize(GetType(descriptor_)) == -1) {
-    printer->Print(variables_,
-      "for (int i = 0; i < $name$_.size(); i++) {\n"
-      "  dataSize += com.google.protobuf.CodedOutputStream\n"
-      "    .compute$capitalized_type$SizeNoTag($repeated_get$(i));\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "for (int i = 0; i < $name$_.size(); i++) {\n"
+        "  dataSize += com.google.protobuf.CodedOutputStream\n"
+        "    .compute$capitalized_type$SizeNoTag($repeated_get$(i));\n"
+        "}\n");
   } else {
-    printer->Print(variables_,
-      "dataSize = $fixed_size$ * get$capitalized_name$List().size();\n");
+    printer->Print(
+        variables_,
+        "dataSize = $fixed_size$ * get$capitalized_name$List().size();\n");
   }
 
-  printer->Print(
-      "size += dataSize;\n");
+  printer->Print("size += dataSize;\n");
 
   if (descriptor_->is_packed()) {
     printer->Print(variables_,
-      "if (!get$capitalized_name$List().isEmpty()) {\n"
-      "  size += $tag_size$;\n"
-      "  size += com.google.protobuf.CodedOutputStream\n"
-      "      .computeInt32SizeNoTag(dataSize);\n"
-      "}\n");
+                   "if (!get$capitalized_name$List().isEmpty()) {\n"
+                   "  size += $tag_size$;\n"
+                   "  size += com.google.protobuf.CodedOutputStream\n"
+                   "      .computeInt32SizeNoTag(dataSize);\n"
+                   "}\n");
   } else {
-    printer->Print(variables_,
-      "size += $tag_size$ * get$capitalized_name$List().size();\n");
+    printer->Print(
+        variables_,
+        "size += $tag_size$ * get$capitalized_name$List().size();\n");
   }
 
   // cache the data size for packed fields.
   if (descriptor_->is_packed()) {
-    printer->Print(variables_,
-      "$name$MemoizedSerializedSize = dataSize;\n");
+    printer->Print(variables_, "$name$MemoizedSerializedSize = dataSize;\n");
   }
 
   printer->Outdent();
   printer->Print("}\n");
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (!get$capitalized_name$List()\n"
-    "    .equals(other.get$capitalized_name$List())) return false;\n");
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateEqualsCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if (!get$capitalized_name$List()\n"
+      "    .equals(other.get$capitalized_name$List())) return false;\n");
 }
 
-void RepeatedImmutablePrimitiveFieldGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (get$capitalized_name$Count() > 0) {\n"
-    "  hash = (37 * hash) + $constant_name$;\n"
-    "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
-    "}\n");
+void RepeatedImmutablePrimitiveFieldGenerator::GenerateHashCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if (get$capitalized_name$Count() > 0) {\n"
+      "  hash = (37 * hash) + $constant_name$;\n"
+      "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
+      "}\n");
 }
 
 std::string RepeatedImmutablePrimitiveFieldGenerator::GetBoxedType() const {
diff --git a/src/google/protobuf/compiler/java/java_primitive_field_lite.cc b/src/google/protobuf/compiler/java/java_primitive_field_lite.cc
index be5f0f1..7ca3073 100644
--- a/src/google/protobuf/compiler/java/java_primitive_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_primitive_field_lite.cc
@@ -134,8 +134,8 @@
   }
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
-  (*variables)["deprecation"] = descriptor->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  (*variables)["deprecation"] =
+      descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
   int fixed_size = FixedSize(GetType(descriptor));
   if (fixed_size != -1) {
     (*variables)["fixed_size"] = StrCat(fixed_size);
@@ -196,20 +196,19 @@
   return SupportFieldPresence(descriptor_->file()) ? 1 : 0;
 }
 
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void ImmutablePrimitiveFieldLiteGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$boolean has$capitalized_name$();\n");
+                   "$deprecation$boolean has$capitalized_name$();\n");
   }
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$();\n");
+  printer->Print(variables_, "$deprecation$$type$ get$capitalized_name$();\n");
 }
 
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutablePrimitiveFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
   if (IsByteStringWithCustomDefaultValue(descriptor_)) {
     // allocate this once statically since we know ByteStrings are immutable
     // values that can be reused.
@@ -217,100 +216,107 @@
         variables_,
         "private static final $field_type$ $bytes_default$ = $default$;\n");
   }
-  printer->Print(variables_,
-    "private $field_type$ $name$_;\n");
+  printer->Print(variables_, "private $field_type$ $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  return $name$_;\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  return $name$_;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$($type$ value) {\n"
-    "$null_check$"
-    "  $set_has_field_bit_message$\n"
-    "  $name$_ = value;\n"
-    "}\n");
+                 "private void set$capitalized_name$($type$ value) {\n"
+                 "$null_check$"
+                 "  $set_has_field_bit_message$\n"
+                 "  $name$_ = value;\n"
+                 "}\n");
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void clear$capitalized_name$() {\n"
-    "  $clear_has_field_bit_message$\n");
+                 "private void clear$capitalized_name$() {\n"
+                 "  $clear_has_field_bit_message$\n");
   JavaType type = GetJavaType(descriptor_);
   if (type == JAVATYPE_STRING || type == JAVATYPE_BYTES) {
     // The default value is not a simple literal so we want to avoid executing
     // it multiple times.  Instead, get the default out of the default instance.
-    printer->Print(variables_,
-      "  $name$_ = getDefaultInstance().get$capitalized_name$();\n");
+    printer->Print(
+        variables_,
+        "  $name$_ = getDefaultInstance().get$capitalized_name$();\n");
   } else {
-    printer->Print(variables_,
-      "  $name$_ = $default$;\n");
+    printer->Print(variables_, "  $name$_ = $default$;\n");
   }
-  printer->Print(variables_,
-    "}\n");
+  printer->Print(variables_, "}\n");
 }
 
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutablePrimitiveFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return instance.has$capitalized_name$();\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return instance.has$capitalized_name$();\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  return instance.get$capitalized_name$();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  return instance.get$capitalized_name$();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$set$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  copyOnWrite();\n"
+      "  instance.clear$capitalized_name$();\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
-  // noop for primitives
+void ImmutablePrimitiveFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
+  if (SupportFieldPresence(descriptor_->file())) {
+    WriteIntToUtf16CharSequence(messageBitIndex_, output);
+  }
+  printer->Print(variables_, "\"$name$_\",\n");
 }
 
-
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void ImmutablePrimitiveFieldLiteGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   if (IsByteStringWithCustomDefaultValue(descriptor_)) {
     printer->Print(variables_, "$name$_ = $bytes_default$;\n");
   } else if (!IsDefaultValueJavaDefault(descriptor_)) {
@@ -318,154 +324,6 @@
   }
 }
 
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
-  // noop for primitives
-}
-
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
-  if (SupportFieldPresence(descriptor_->file())) {
-    printer->Print(variables_,
-      "$name$_ = visitor.visit$visit_type$(\n"
-      "    has$capitalized_name$(), $name$_,\n"
-      "    other.has$capitalized_name$(), other.$name$_);\n");
-  } else {
-    printer->Print(variables_,
-      "$name$_ = visitor.visit$visit_type$($name$_ != $default$, $name$_,\n"
-      "    other.$name$_ != $default$, other.$name$_);\n");
-  }
-}
-
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
-  // noop for primitives
-}
-
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const {
-  // noop for scalars
-}
-
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$set_has_field_bit_message$\n"
-    "$name$_ = input.read$capitalized_type$();\n");
-}
-
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  // noop for primitives.
-}
-
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  output.write$capitalized_type$($number$, $name$_);\n"
-    "}\n");
-}
-
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .compute$capitalized_type$Size($number$, $name$_);\n"
-    "}\n");
-}
-
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  switch (GetJavaType(descriptor_)) {
-    case JAVATYPE_INT:
-    case JAVATYPE_LONG:
-    case JAVATYPE_BOOLEAN:
-      printer->Print(variables_,
-        "result = result && (get$capitalized_name$()\n"
-        "    == other.get$capitalized_name$());\n");
-      break;
-
-    case JAVATYPE_FLOAT:
-      printer->Print(variables_,
-        "result = result && (\n"
-        "    java.lang.Float.floatToIntBits(get$capitalized_name$())\n"
-        "    == java.lang.Float.floatToIntBits(\n"
-        "        other.get$capitalized_name$()));\n");
-      break;
-
-    case JAVATYPE_DOUBLE:
-      printer->Print(variables_,
-        "result = result && (\n"
-        "    java.lang.Double.doubleToLongBits(get$capitalized_name$())\n"
-        "    == java.lang.Double.doubleToLongBits(\n"
-        "        other.get$capitalized_name$()));\n");
-      break;
-
-    case JAVATYPE_STRING:
-    case JAVATYPE_BYTES:
-      printer->Print(variables_,
-        "result = result && get$capitalized_name$()\n"
-        "    .equals(other.get$capitalized_name$());\n");
-      break;
-
-    case JAVATYPE_ENUM:
-    case JAVATYPE_MESSAGE:
-    default:
-      GOOGLE_LOG(FATAL) << "Can't get here.";
-      break;
-  }
-}
-
-void ImmutablePrimitiveFieldLiteGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "hash = (37 * hash) + $constant_name$;\n");
-  switch (GetJavaType(descriptor_)) {
-    case JAVATYPE_INT:
-      printer->Print(variables_,
-        "hash = (53 * hash) + get$capitalized_name$();\n");
-      break;
-
-    case JAVATYPE_LONG:
-      printer->Print(variables_,
-        "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n"
-        "    get$capitalized_name$());\n");
-      break;
-
-    case JAVATYPE_BOOLEAN:
-      printer->Print(variables_,
-        "hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(\n"
-        "    get$capitalized_name$());\n");
-      break;
-
-    case JAVATYPE_FLOAT:
-      printer->Print(variables_,
-        "hash = (53 * hash) + java.lang.Float.floatToIntBits(\n"
-        "    get$capitalized_name$());\n");
-      break;
-
-    case JAVATYPE_DOUBLE:
-      printer->Print(variables_,
-        "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n"
-        "    java.lang.Double.doubleToLongBits(get$capitalized_name$()));\n");
-      break;
-
-    case JAVATYPE_STRING:
-    case JAVATYPE_BYTES:
-      printer->Print(variables_,
-        "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
-      break;
-
-    case JAVATYPE_ENUM:
-    case JAVATYPE_MESSAGE:
-    default:
-      GOOGLE_LOG(FATAL) << "Can't get here.";
-      break;
-  }
-}
-
 std::string ImmutablePrimitiveFieldLiteGenerator::GetBoxedType() const {
   return BoxedPrimitiveTypeName(GetJavaType(descriptor_));
 }
@@ -484,128 +342,101 @@
 }
 
 ImmutablePrimitiveOneofFieldLiteGenerator::
-~ImmutablePrimitiveOneofFieldLiteGenerator() {}
+    ~ImmutablePrimitiveOneofFieldLiteGenerator() {}
 
-void ImmutablePrimitiveOneofFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutablePrimitiveOneofFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
   PrintExtraFieldInfo(variables_, printer);
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $has_oneof_case_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $has_oneof_case_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    return ($boxed_type$) $oneof_name$_;\n"
-    "  }\n"
-    "  return $default$;\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    return ($boxed_type$) $oneof_name$_;\n"
+                 "  }\n"
+                 "  return $default$;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$($type$ value) {\n"
-    "$null_check$"
-    "  $set_oneof_case_message$;\n"
-    "  $oneof_name$_ = value;\n"
-    "}\n");
+                 "private void set$capitalized_name$($type$ value) {\n"
+                 "$null_check$"
+                 "  $set_oneof_case_message$;\n"
+                 "  $oneof_name$_ = value;\n"
+                 "}\n");
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void clear$capitalized_name$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    $clear_oneof_case_message$;\n"
-    "    $oneof_name$_ = null;\n"
-    "  }\n"
-    "}\n");
+                 "private void clear$capitalized_name$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    $clear_oneof_case_message$;\n"
+                 "    $oneof_name$_ = null;\n"
+                 "  }\n"
+                 "}\n");
 }
 
+void ImmutablePrimitiveOneofFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
+  WriteIntToUtf16CharSequence(descriptor_->containing_oneof()->index(), output);
+}
 
-void ImmutablePrimitiveOneofFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutablePrimitiveOneofFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return instance.has$capitalized_name$();\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return instance.has$capitalized_name$();\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
-    "  return instance.get$capitalized_name$();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public $type$ ${$get$capitalized_name$$}$() {\n"
+                 "  return instance.get$capitalized_name$();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder "
+                 "${$set$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  copyOnWrite();\n"
+      "  instance.clear$capitalized_name$();\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutablePrimitiveOneofFieldLiteGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
-  // noop for primitives
-}
-
-void ImmutablePrimitiveOneofFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
-  printer->Print(variables_,
-      "$oneof_name$_ = visitor.visitOneof$visit_type$(\n"
-      "    $has_oneof_case_message$, $oneof_name$_, other.$oneof_name$_);\n");
-}
-
-void ImmutablePrimitiveOneofFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$set_oneof_case_message$;\n"
-    "$oneof_name$_ = input.read$capitalized_type$();\n");
-}
-
-void ImmutablePrimitiveOneofFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  output.write$capitalized_type$(\n"
-    "      $number$, ($type$)(($boxed_type$) $oneof_name$_));\n"
-    "}\n");
-}
-
-void ImmutablePrimitiveOneofFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .compute$capitalized_type$Size(\n"
-    "        $number$, ($type$)(($boxed_type$) $oneof_name$_));\n"
-    "}\n");
-}
-
 // ===================================================================
 
 RepeatedImmutablePrimitiveFieldLiteGenerator::
@@ -622,326 +453,176 @@
 }
 
 RepeatedImmutablePrimitiveFieldLiteGenerator::
-~RepeatedImmutablePrimitiveFieldLiteGenerator() {}
+    ~RepeatedImmutablePrimitiveFieldLiteGenerator() {}
 
 int RepeatedImmutablePrimitiveFieldLiteGenerator::GetNumBitsForMessage() const {
   return 0;
 }
 
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.util.List<$boxed_type$> get$capitalized_name$List();\n");
+                 "$deprecation$java.util.List<$boxed_type$> "
+                 "get$capitalized_name$List();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$int get$capitalized_name$Count();\n");
+                 "$deprecation$int get$capitalized_name$Count();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$$type$ get$capitalized_name$(int index);\n");
+                 "$deprecation$$type$ get$capitalized_name$(int index);\n");
 }
 
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private $field_list_type$ $name$_;\n");
+void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_, "private $field_list_type$ $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.util.List<$boxed_type$>\n"
-    "    ${$get$capitalized_name$List$}$() {\n"
-    "  return $name$_;\n"   // note:  unmodifiable list
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public java.util.List<$boxed_type$>\n"
+                 "    ${$get$capitalized_name$List$}$() {\n"
+                 "  return $name$_;\n"  // note:  unmodifiable list
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return $repeated_get$(index);\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return $repeated_get$(index);\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   if (!EnableExperimentalRuntimeForLite() && descriptor_->is_packed() &&
       context_->HasGeneratedMethods(descriptor_->containing_type())) {
     printer->Print(variables_,
-      "private int $name$MemoizedSerializedSize = -1;\n");
-  }
-
-  printer->Print(variables_,
-    "private void ensure$capitalized_name$IsMutable() {\n"
-    "  if (!$is_mutable$) {\n"
-    "    $name$_ =\n"
-    "        com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
-    "   }\n"
-    "}\n");
-
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void set$capitalized_name$(\n"
-    "    int index, $type$ value) {\n"
-    "$null_check$"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $repeated_set$(index, value);\n"
-    "}\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void add$capitalized_name$($type$ value) {\n"
-    "$null_check$"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $repeated_add$(value);\n"
-    "}\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void addAll$capitalized_name$(\n"
-    "    java.lang.Iterable<? extends $boxed_type$> values) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  com.google.protobuf.AbstractMessageLite.addAll(\n"
-    "      values, $name$_);\n"
-    "}\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void clear$capitalized_name$() {\n"
-    "  $name$_ = $empty_list$;\n"
-    "}\n");
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.util.List<$boxed_type$>\n"
-    "    ${$get$capitalized_name$List$}$() {\n"
-    "  return java.util.Collections.unmodifiableList(\n"
-    "      instance.get$capitalized_name$List());\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return instance.get$capitalized_name$Count();\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
-    "  return instance.get$capitalized_name$(index);\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    int index, $type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(index, value);\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$($type$ value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.add$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
-    "    java.lang.Iterable<? extends $boxed_type$> values) {\n"
-    "  copyOnWrite();\n"
-    "  instance.addAll$capitalized_name$(values);\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
-  // noop for primitives
-}
-
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_ = $empty_list$;\n");
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
-  // noop for primitives
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
-  printer->Print(variables_,
-      "$name$_= visitor.$visit_type_list$($name$_, other.$name$_);\n");
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
-  // noop for primitives
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$name$_.makeImmutable();\n");
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  // TODO(dweis): Scan the input buffer to count, then initialize
-  // appropriately.
-  // TODO(dweis): Scan the input buffer to count and ensure capacity.
-  printer->Print(variables_,
-    "if (!$is_mutable$) {\n"
-    "  $name$_ =\n"
-    "      com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
-    "}\n"
-    "$repeated_add$(input.read$capitalized_type$());\n");
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateParsingCodeFromPacked(io::Printer* printer) const {
-  printer->Print(variables_,
-    "int length = input.readRawVarint32();\n"
-    "int limit = input.pushLimit(length);\n"
-    "if (!$is_mutable$ && input.getBytesUntilLimit() > 0) {\n");
-
-  int fixed_size = FixedSize(GetType(descriptor_));
-  if (fixed_size == -1) {
-    // TODO(dweis): Scan the input buffer to count, then initialize
-    // appropriately.
-    printer->Print(variables_,
-      "  $name$_ =\n"
-      "      com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n");
-  } else {
-    printer->Print(variables_,
-      "  final int currentSize = $name$_.size();\n"
-      "  $name$_ = $name$_.mutableCopyWithCapacity(\n"
-      "      currentSize + (length/$fixed_size$));\n");
-  }
-
-  // TODO(dweis): Scan the input buffer to count and ensure capacity.
-  printer->Print(variables_,
-    "}\n"
-    "while (input.getBytesUntilLimit() > 0) {\n"
-    "  $repeated_add$(input.read$capitalized_type$());\n"
-    "}\n"
-    "input.popLimit(limit);\n");
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_mutable$) {\n"
-    "  $make_name_unmodifiable$;\n"
-    "}\n");
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  GOOGLE_CHECK(!EnableExperimentalRuntimeForLite());
-
-  if (descriptor_->is_packed()) {
-    // We invoke getSerializedSize in writeTo for messages that have packed
-    // fields in ImmutableMessageGenerator::GenerateMessageSerializationMethods.
-    // That makes it safe to rely on the memoized size here.
-    printer->Print(variables_,
-      "if (get$capitalized_name$List().size() > 0) {\n"
-      "  output.writeUInt32NoTag($tag$);\n"
-      "  output.writeUInt32NoTag($name$MemoizedSerializedSize);\n"
-      "}\n"
-      "for (int i = 0; i < $name$_.size(); i++) {\n"
-      "  output.write$capitalized_type$NoTag($repeated_get$(i));\n"
-      "}\n");
-  } else {
-    printer->Print(variables_,
-      "for (int i = 0; i < $name$_.size(); i++) {\n"
-      "  output.write$capitalized_type$($number$, $repeated_get$(i));\n"
-      "}\n");
-  }
-}
-
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  GOOGLE_CHECK(!EnableExperimentalRuntimeForLite());
-
-  printer->Print(variables_,
-    "{\n"
-    "  int dataSize = 0;\n");
-  printer->Indent();
-
-  if (FixedSize(GetType(descriptor_)) == -1) {
-    printer->Print(variables_,
-      "for (int i = 0; i < $name$_.size(); i++) {\n"
-      "  dataSize += com.google.protobuf.CodedOutputStream\n"
-      "    .compute$capitalized_type$SizeNoTag($repeated_get$(i));\n"
-      "}\n");
-  } else {
-    printer->Print(variables_,
-      "dataSize = $fixed_size$ * get$capitalized_name$List().size();\n");
+                   "private int $name$MemoizedSerializedSize = -1;\n");
   }
 
   printer->Print(
-      "size += dataSize;\n");
-
-  if (descriptor_->is_packed()) {
-    printer->Print(variables_,
-      "if (!get$capitalized_name$List().isEmpty()) {\n"
-      "  size += $tag_size$;\n"
-      "  size += com.google.protobuf.CodedOutputStream\n"
-      "      .computeInt32SizeNoTag(dataSize);\n"
+      variables_,
+      "private void ensure$capitalized_name$IsMutable() {\n"
+      "  if (!$is_mutable$) {\n"
+      "    $name$_ =\n"
+      "        com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
+      "   }\n"
       "}\n");
-  } else {
-    printer->Print(variables_,
-      "size += $tag_size$ * get$capitalized_name$List().size();\n");
-  }
 
-  // cache the data size for packed fields.
-  if (descriptor_->is_packed()) {
-    printer->Print(variables_,
-      "$name$MemoizedSerializedSize = dataSize;\n");
-  }
-
-  printer->Outdent();
-  printer->Print("}\n");
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "private void set$capitalized_name$(\n"
+                 "    int index, $type$ value) {\n"
+                 "$null_check$"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $repeated_set$(index, value);\n"
+                 "}\n");
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "private void add$capitalized_name$($type$ value) {\n"
+                 "$null_check$"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $repeated_add$(value);\n"
+                 "}\n");
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "private void addAll$capitalized_name$(\n"
+                 "    java.lang.Iterable<? extends $boxed_type$> values) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  com.google.protobuf.AbstractMessageLite.addAll(\n"
+                 "      values, $name$_);\n"
+                 "}\n");
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "private void clear$capitalized_name$() {\n"
+                 "  $name$_ = $empty_list$;\n"
+                 "}\n");
 }
 
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
+void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
+  WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "result = result && get$capitalized_name$List()\n"
-    "    .equals(other.get$capitalized_name$List());\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public java.util.List<$boxed_type$>\n"
+                 "    ${$get$capitalized_name$List$}$() {\n"
+                 "  return java.util.Collections.unmodifiableList(\n"
+                 "      instance.get$capitalized_name$List());\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return instance.get$capitalized_name$Count();\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public $type$ ${$get$capitalized_name$$}$(int index) {\n"
+      "  return instance.get$capitalized_name$(index);\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    int index, $type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(index, value);\n"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder "
+                 "${$add$capitalized_name$$}$($type$ value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.add$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
+                 "    java.lang.Iterable<? extends $boxed_type$> values) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.addAll$capitalized_name$(values);\n"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  copyOnWrite();\n"
+      "  instance.clear$capitalized_name$();\n"
+      "  return this;\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
 }
 
-void RepeatedImmutablePrimitiveFieldLiteGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (get$capitalized_name$Count() > 0) {\n"
-    "  hash = (37 * hash) + $constant_name$;\n"
-    "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
-    "}\n");
+void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
+  printer->Print(variables_, "\"$name$_\",\n");
+}
+
+void RepeatedImmutablePrimitiveFieldLiteGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
+  printer->Print(variables_, "$name$_ = $empty_list$;\n");
 }
 
 std::string RepeatedImmutablePrimitiveFieldLiteGenerator::GetBoxedType() const {
diff --git a/src/google/protobuf/compiler/java/java_primitive_field_lite.h b/src/google/protobuf/compiler/java/java_primitive_field_lite.h
index 6c05521..61d1e4c 100644
--- a/src/google/protobuf/compiler/java/java_primitive_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_primitive_field_lite.h
@@ -69,18 +69,8 @@
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
   void GenerateInitializationCode(io::Printer* printer) const;
-  void GenerateBuilderClearCode(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateBuildingCode(io::Printer* printer) const;
-  void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateParsingDoneCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;
-  void GenerateEqualsCode(io::Printer* printer) const;
-  void GenerateHashCode(io::Printer* printer) const;
-
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
   std::string GetBoxedType() const;
 
@@ -105,12 +95,9 @@
 
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
-  void GenerateBuildingCode(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
 
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutablePrimitiveOneofFieldLiteGenerator);
@@ -129,19 +116,8 @@
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
   void GenerateInitializationCode(io::Printer* printer) const;
-  void GenerateBuilderClearCode(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateBuildingCode(io::Printer* printer) const;
-  void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateParsingCodeFromPacked(io::Printer* printer) const;
-  void GenerateParsingDoneCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;
-  void GenerateEqualsCode(io::Printer* printer) const;
-  void GenerateHashCode(io::Printer* printer) const;
-
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
   std::string GetBoxedType() const;
 
diff --git a/src/google/protobuf/compiler/java/java_service.cc b/src/google/protobuf/compiler/java/java_service.cc
index c598330..17d8e70 100644
--- a/src/google/protobuf/compiler/java/java_service.cc
+++ b/src/google/protobuf/compiler/java/java_service.cc
@@ -48,15 +48,16 @@
 namespace java {
 
 ServiceGenerator::ServiceGenerator(const ServiceDescriptor* descriptor)
-  : descriptor_(descriptor) {}
+    : descriptor_(descriptor) {}
 
 ServiceGenerator::~ServiceGenerator() {}
 
 // ===================================================================
 ImmutableServiceGenerator::ImmutableServiceGenerator(
     const ServiceDescriptor* descriptor, Context* context)
-    : ServiceGenerator(descriptor), context_(context),
-    name_resolver_(context->GetNameResolver()) {}
+    : ServiceGenerator(descriptor),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {}
 
 ImmutableServiceGenerator::~ImmutableServiceGenerator() {}
 
@@ -66,15 +67,13 @@
   MaybePrintGeneratedAnnotation(context_, printer, descriptor_,
                                 /* immutable = */ true);
   printer->Print(
-    "public $static$ abstract class $classname$\n"
-    "    implements com.google.protobuf.Service {\n",
-    "static", is_own_file ? "" : "static",
-    "classname", descriptor_->name());
+      "public $static$ abstract class $classname$\n"
+      "    implements com.google.protobuf.Service {\n",
+      "static", is_own_file ? "" : "static", "classname", descriptor_->name());
   printer->Indent();
 
-  printer->Print(
-    "protected $classname$() {}\n\n",
-    "classname", descriptor_->name());
+  printer->Print("protected $classname$() {}\n\n", "classname",
+                 descriptor_->name());
 
   GenerateInterface(printer);
 
@@ -103,9 +102,9 @@
 
   // Add an insertion point.
   printer->Print(
-    "\n"
-    "// @@protoc_insertion_point(class_scope:$full_name$)\n",
-    "full_name", descriptor_->full_name());
+      "\n"
+      "// @@protoc_insertion_point(class_scope:$full_name$)\n",
+      "full_name", descriptor_->full_name());
 
   printer->Outdent();
   printer->Print("}\n\n");
@@ -114,10 +113,10 @@
 void ImmutableServiceGenerator::GenerateGetDescriptorForType(
     io::Printer* printer) {
   printer->Print(
-    "public final com.google.protobuf.Descriptors.ServiceDescriptor\n"
-    "    getDescriptorForType() {\n"
-    "  return getDescriptor();\n"
-    "}\n");
+      "public final com.google.protobuf.Descriptors.ServiceDescriptor\n"
+      "    getDescriptorForType() {\n"
+      "  return getDescriptor();\n"
+      "}\n");
 }
 
 void ImmutableServiceGenerator::GenerateInterface(io::Printer* printer) {
@@ -131,10 +130,10 @@
 void ImmutableServiceGenerator::GenerateNewReflectiveServiceMethod(
     io::Printer* printer) {
   printer->Print(
-    "public static com.google.protobuf.Service newReflectiveService(\n"
-    "    final Interface impl) {\n"
-    "  return new $classname$() {\n",
-    "classname", descriptor_->name());
+      "public static com.google.protobuf.Service newReflectiveService(\n"
+      "    final Interface impl) {\n"
+      "  return new $classname$() {\n",
+      "classname", descriptor_->name());
   printer->Indent();
   printer->Indent();
 
@@ -143,10 +142,10 @@
     printer->Print("@java.lang.Override\n");
     GenerateMethodSignature(printer, method, IS_CONCRETE);
     printer->Print(
-      " {\n"
-      "  impl.$method$(controller, request, done);\n"
-      "}\n\n",
-      "method", UnderscoresToCamelCase(method));
+        " {\n"
+        "  impl.$method$(controller, request, done);\n"
+        "}\n\n",
+        "method", UnderscoresToCamelCase(method));
   }
 
   printer->Outdent();
@@ -158,9 +157,9 @@
 void ImmutableServiceGenerator::GenerateNewReflectiveBlockingServiceMethod(
     io::Printer* printer) {
   printer->Print(
-    "public static com.google.protobuf.BlockingService\n"
-    "    newReflectiveBlockingService(final BlockingInterface impl) {\n"
-    "  return new com.google.protobuf.BlockingService() {\n");
+      "public static com.google.protobuf.BlockingService\n"
+      "    newReflectiveBlockingService(final BlockingInterface impl) {\n"
+      "  return new com.google.protobuf.BlockingService() {\n");
   printer->Indent();
   printer->Indent();
 
@@ -192,19 +191,19 @@
 
 void ImmutableServiceGenerator::GenerateCallMethod(io::Printer* printer) {
   printer->Print(
-    "\n"
-    "public final void callMethod(\n"
-    "    com.google.protobuf.Descriptors.MethodDescriptor method,\n"
-    "    com.google.protobuf.RpcController controller,\n"
-    "    com.google.protobuf.Message request,\n"
-    "    com.google.protobuf.RpcCallback<\n"
-    "      com.google.protobuf.Message> done) {\n"
-    "  if (method.getService() != getDescriptor()) {\n"
-    "    throw new java.lang.IllegalArgumentException(\n"
-    "      \"Service.callMethod() given method descriptor for wrong \" +\n"
-    "      \"service type.\");\n"
-    "  }\n"
-    "  switch(method.getIndex()) {\n");
+      "\n"
+      "public final void callMethod(\n"
+      "    com.google.protobuf.Descriptors.MethodDescriptor method,\n"
+      "    com.google.protobuf.RpcController controller,\n"
+      "    com.google.protobuf.Message request,\n"
+      "    com.google.protobuf.RpcCallback<\n"
+      "      com.google.protobuf.Message> done) {\n"
+      "  if (method.getService() != getDescriptor()) {\n"
+      "    throw new java.lang.IllegalArgumentException(\n"
+      "      \"Service.callMethod() given method descriptor for wrong \" +\n"
+      "      \"service type.\");\n"
+      "  }\n"
+      "  switch(method.getIndex()) {\n");
   printer->Indent();
   printer->Indent();
 
@@ -213,45 +212,45 @@
     std::map<std::string, std::string> vars;
     vars["index"] = StrCat(i);
     vars["method"] = UnderscoresToCamelCase(method);
-    vars["input"] = name_resolver_->GetImmutableClassName(
-        method->input_type());
+    vars["input"] = name_resolver_->GetImmutableClassName(method->input_type());
     vars["output"] = GetOutput(method);
-    printer->Print(vars,
-      "case $index$:\n"
-      "  this.$method$(controller, ($input$)request,\n"
-      "    com.google.protobuf.RpcUtil.<$output$>specializeCallback(\n"
-      "      done));\n"
-      "  return;\n");
+    printer->Print(
+        vars,
+        "case $index$:\n"
+        "  this.$method$(controller, ($input$)request,\n"
+        "    com.google.protobuf.RpcUtil.<$output$>specializeCallback(\n"
+        "      done));\n"
+        "  return;\n");
   }
 
   printer->Print(
-    "default:\n"
-    "  throw new java.lang.AssertionError(\"Can't get here.\");\n");
+      "default:\n"
+      "  throw new java.lang.AssertionError(\"Can't get here.\");\n");
 
   printer->Outdent();
   printer->Outdent();
 
   printer->Print(
-    "  }\n"
-    "}\n"
-    "\n");
+      "  }\n"
+      "}\n"
+      "\n");
 }
 
 void ImmutableServiceGenerator::GenerateCallBlockingMethod(
     io::Printer* printer) {
   printer->Print(
-    "\n"
-    "public final com.google.protobuf.Message callBlockingMethod(\n"
-    "    com.google.protobuf.Descriptors.MethodDescriptor method,\n"
-    "    com.google.protobuf.RpcController controller,\n"
-    "    com.google.protobuf.Message request)\n"
-    "    throws com.google.protobuf.ServiceException {\n"
-    "  if (method.getService() != getDescriptor()) {\n"
-    "    throw new java.lang.IllegalArgumentException(\n"
-    "      \"Service.callBlockingMethod() given method descriptor for \" +\n"
-    "      \"wrong service type.\");\n"
-    "  }\n"
-    "  switch(method.getIndex()) {\n");
+      "\n"
+      "public final com.google.protobuf.Message callBlockingMethod(\n"
+      "    com.google.protobuf.Descriptors.MethodDescriptor method,\n"
+      "    com.google.protobuf.RpcController controller,\n"
+      "    com.google.protobuf.Message request)\n"
+      "    throws com.google.protobuf.ServiceException {\n"
+      "  if (method.getService() != getDescriptor()) {\n"
+      "    throw new java.lang.IllegalArgumentException(\n"
+      "      \"Service.callBlockingMethod() given method descriptor for \" +\n"
+      "      \"wrong service type.\");\n"
+      "  }\n"
+      "  switch(method.getIndex()) {\n");
   printer->Indent();
   printer->Indent();
 
@@ -260,44 +259,43 @@
     std::map<std::string, std::string> vars;
     vars["index"] = StrCat(i);
     vars["method"] = UnderscoresToCamelCase(method);
-    vars["input"] = name_resolver_->GetImmutableClassName(
-        method->input_type());
+    vars["input"] = name_resolver_->GetImmutableClassName(method->input_type());
     vars["output"] = GetOutput(method);
     printer->Print(vars,
-      "case $index$:\n"
-      "  return impl.$method$(controller, ($input$)request);\n");
+                   "case $index$:\n"
+                   "  return impl.$method$(controller, ($input$)request);\n");
   }
 
   printer->Print(
-    "default:\n"
-    "  throw new java.lang.AssertionError(\"Can't get here.\");\n");
+      "default:\n"
+      "  throw new java.lang.AssertionError(\"Can't get here.\");\n");
 
   printer->Outdent();
   printer->Outdent();
 
   printer->Print(
-    "  }\n"
-    "}\n"
-    "\n");
+      "  }\n"
+      "}\n"
+      "\n");
 }
 
 void ImmutableServiceGenerator::GenerateGetPrototype(RequestOrResponse which,
-                                            io::Printer* printer) {
+                                                     io::Printer* printer) {
   /*
    * TODO(cpovirk): The exception message says "Service.foo" when it may be
    * "BlockingService.foo."  Consider fixing.
    */
   printer->Print(
-    "public final com.google.protobuf.Message\n"
-    "    get$request_or_response$Prototype(\n"
-    "    com.google.protobuf.Descriptors.MethodDescriptor method) {\n"
-    "  if (method.getService() != getDescriptor()) {\n"
-    "    throw new java.lang.IllegalArgumentException(\n"
-    "      \"Service.get$request_or_response$Prototype() given method \" +\n"
-    "      \"descriptor for wrong service type.\");\n"
-    "  }\n"
-    "  switch(method.getIndex()) {\n",
-    "request_or_response", (which == REQUEST) ? "Request" : "Response");
+      "public final com.google.protobuf.Message\n"
+      "    get$request_or_response$Prototype(\n"
+      "    com.google.protobuf.Descriptors.MethodDescriptor method) {\n"
+      "  if (method.getService() != getDescriptor()) {\n"
+      "    throw new java.lang.IllegalArgumentException(\n"
+      "      \"Service.get$request_or_response$Prototype() given method \" +\n"
+      "      \"descriptor for wrong service type.\");\n"
+      "  }\n"
+      "  switch(method.getIndex()) {\n",
+      "request_or_response", (which == REQUEST) ? "Request" : "Response");
   printer->Indent();
   printer->Indent();
 
@@ -310,45 +308,46 @@
             ? name_resolver_->GetImmutableClassName(method->input_type())
             : GetOutput(method);
     printer->Print(vars,
-      "case $index$:\n"
-      "  return $type$.getDefaultInstance();\n");
+                   "case $index$:\n"
+                   "  return $type$.getDefaultInstance();\n");
   }
 
   printer->Print(
-    "default:\n"
-    "  throw new java.lang.AssertionError(\"Can't get here.\");\n");
+      "default:\n"
+      "  throw new java.lang.AssertionError(\"Can't get here.\");\n");
 
   printer->Outdent();
   printer->Outdent();
 
   printer->Print(
-    "  }\n"
-    "}\n"
-    "\n");
+      "  }\n"
+      "}\n"
+      "\n");
 }
 
 void ImmutableServiceGenerator::GenerateStub(io::Printer* printer) {
   printer->Print(
-    "public static Stub newStub(\n"
-    "    com.google.protobuf.RpcChannel channel) {\n"
-    "  return new Stub(channel);\n"
-    "}\n"
-    "\n"
-    "public static final class Stub extends $classname$ implements Interface {"
-    "\n",
-    "classname", name_resolver_->GetImmutableClassName(descriptor_));
+      "public static Stub newStub(\n"
+      "    com.google.protobuf.RpcChannel channel) {\n"
+      "  return new Stub(channel);\n"
+      "}\n"
+      "\n"
+      "public static final class Stub extends $classname$ implements Interface "
+      "{"
+      "\n",
+      "classname", name_resolver_->GetImmutableClassName(descriptor_));
   printer->Indent();
 
   printer->Print(
-    "private Stub(com.google.protobuf.RpcChannel channel) {\n"
-    "  this.channel = channel;\n"
-    "}\n"
-    "\n"
-    "private final com.google.protobuf.RpcChannel channel;\n"
-    "\n"
-    "public com.google.protobuf.RpcChannel getChannel() {\n"
-    "  return channel;\n"
-    "}\n");
+      "private Stub(com.google.protobuf.RpcChannel channel) {\n"
+      "  this.channel = channel;\n"
+      "}\n"
+      "\n"
+      "private final com.google.protobuf.RpcChannel channel;\n"
+      "\n"
+      "public com.google.protobuf.RpcChannel getChannel() {\n"
+      "  return channel;\n"
+      "}\n");
 
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
@@ -361,15 +360,15 @@
     vars["index"] = StrCat(i);
     vars["output"] = GetOutput(method);
     printer->Print(vars,
-      "channel.callMethod(\n"
-      "  getDescriptor().getMethods().get($index$),\n"
-      "  controller,\n"
-      "  request,\n"
-      "  $output$.getDefaultInstance(),\n"
-      "  com.google.protobuf.RpcUtil.generalizeCallback(\n"
-      "    done,\n"
-      "    $output$.class,\n"
-      "    $output$.getDefaultInstance()));\n");
+                   "channel.callMethod(\n"
+                   "  getDescriptor().getMethods().get($index$),\n"
+                   "  controller,\n"
+                   "  request,\n"
+                   "  $output$.getDefaultInstance(),\n"
+                   "  com.google.protobuf.RpcUtil.generalizeCallback(\n"
+                   "    done,\n"
+                   "    $output$.class,\n"
+                   "    $output$.getDefaultInstance()));\n");
 
     printer->Outdent();
     printer->Print("}\n");
@@ -377,20 +376,19 @@
 
   printer->Outdent();
   printer->Print(
-    "}\n"
-    "\n");
+      "}\n"
+      "\n");
 }
 
 void ImmutableServiceGenerator::GenerateBlockingStub(io::Printer* printer) {
   printer->Print(
-    "public static BlockingInterface newBlockingStub(\n"
-    "    com.google.protobuf.BlockingRpcChannel channel) {\n"
-    "  return new BlockingStub(channel);\n"
-    "}\n"
-    "\n");
+      "public static BlockingInterface newBlockingStub(\n"
+      "    com.google.protobuf.BlockingRpcChannel channel) {\n"
+      "  return new BlockingStub(channel);\n"
+      "}\n"
+      "\n");
 
-  printer->Print(
-    "public interface BlockingInterface {");
+  printer->Print("public interface BlockingInterface {");
   printer->Indent();
 
   for (int i = 0; i < descriptor_->method_count(); i++) {
@@ -401,19 +399,20 @@
 
   printer->Outdent();
   printer->Print(
-    "}\n"
-    "\n");
+      "}\n"
+      "\n");
 
   printer->Print(
-    "private static final class BlockingStub implements BlockingInterface {\n");
+      "private static final class BlockingStub implements BlockingInterface "
+      "{\n");
   printer->Indent();
 
   printer->Print(
-    "private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) {\n"
-    "  this.channel = channel;\n"
-    "}\n"
-    "\n"
-    "private final com.google.protobuf.BlockingRpcChannel channel;\n");
+      "private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) {\n"
+      "  this.channel = channel;\n"
+      "}\n"
+      "\n"
+      "private final com.google.protobuf.BlockingRpcChannel channel;\n");
 
   for (int i = 0; i < descriptor_->method_count(); i++) {
     const MethodDescriptor* method = descriptor_->method(i);
@@ -425,50 +424,49 @@
     vars["index"] = StrCat(i);
     vars["output"] = GetOutput(method);
     printer->Print(vars,
-      "return ($output$) channel.callBlockingMethod(\n"
-      "  getDescriptor().getMethods().get($index$),\n"
-      "  controller,\n"
-      "  request,\n"
-      "  $output$.getDefaultInstance());\n");
+                   "return ($output$) channel.callBlockingMethod(\n"
+                   "  getDescriptor().getMethods().get($index$),\n"
+                   "  controller,\n"
+                   "  request,\n"
+                   "  $output$.getDefaultInstance());\n");
 
     printer->Outdent();
     printer->Print(
-      "}\n"
-      "\n");
+        "}\n"
+        "\n");
   }
 
   printer->Outdent();
   printer->Print("}\n");
 }
 
-void ImmutableServiceGenerator::GenerateMethodSignature(io::Printer* printer,
-                                               const MethodDescriptor* method,
-                                               IsAbstract is_abstract) {
+void ImmutableServiceGenerator::GenerateMethodSignature(
+    io::Printer* printer, const MethodDescriptor* method,
+    IsAbstract is_abstract) {
   std::map<std::string, std::string> vars;
   vars["name"] = UnderscoresToCamelCase(method);
   vars["input"] = name_resolver_->GetImmutableClassName(method->input_type());
   vars["output"] = GetOutput(method);
   vars["abstract"] = (is_abstract == IS_ABSTRACT) ? "abstract" : "";
   printer->Print(vars,
-    "public $abstract$ void $name$(\n"
-    "    com.google.protobuf.RpcController controller,\n"
-    "    $input$ request,\n"
-    "    com.google.protobuf.RpcCallback<$output$> done)");
+                 "public $abstract$ void $name$(\n"
+                 "    com.google.protobuf.RpcController controller,\n"
+                 "    $input$ request,\n"
+                 "    com.google.protobuf.RpcCallback<$output$> done)");
 }
 
 void ImmutableServiceGenerator::GenerateBlockingMethodSignature(
-    io::Printer* printer,
-    const MethodDescriptor* method) {
+    io::Printer* printer, const MethodDescriptor* method) {
   std::map<std::string, std::string> vars;
   vars["method"] = UnderscoresToCamelCase(method);
   vars["input"] = name_resolver_->GetImmutableClassName(method->input_type());
   vars["output"] = GetOutput(method);
   printer->Print(vars,
-    "\n"
-    "public $output$ $method$(\n"
-    "    com.google.protobuf.RpcController controller,\n"
-    "    $input$ request)\n"
-    "    throws com.google.protobuf.ServiceException");
+                 "\n"
+                 "public $output$ $method$(\n"
+                 "    com.google.protobuf.RpcController controller,\n"
+                 "    $input$ request)\n"
+                 "    throws com.google.protobuf.ServiceException");
 }
 
 }  // namespace java
diff --git a/src/google/protobuf/compiler/java/java_service.h b/src/google/protobuf/compiler/java/java_service.h
index 24b0cca..1c82c16 100644
--- a/src/google/protobuf/compiler/java/java_service.h
+++ b/src/google/protobuf/compiler/java/java_service.h
@@ -83,7 +83,6 @@
   virtual void Generate(io::Printer* printer);
 
  private:
-
   // Generate the getDescriptorForType() method.
   void GenerateGetDescriptorForType(io::Printer* printer);
 
diff --git a/src/google/protobuf/compiler/java/java_shared_code_generator.cc b/src/google/protobuf/compiler/java/java_shared_code_generator.cc
index a7931f0..f673e68 100644
--- a/src/google/protobuf/compiler/java/java_shared_code_generator.cc
+++ b/src/google/protobuf/compiler/java/java_shared_code_generator.cc
@@ -52,8 +52,7 @@
                                          const Options& options)
     : name_resolver_(new ClassNameResolver), file_(file), options_(options) {}
 
-SharedCodeGenerator::~SharedCodeGenerator() {
-}
+SharedCodeGenerator::~SharedCodeGenerator() {}
 
 void SharedCodeGenerator::Generate(
     GeneratorContext* context, std::vector<std::string>* file_list,
@@ -82,9 +81,9 @@
         "filename", file_->name());
     if (!java_package.empty()) {
       printer->Print(
-        "package $package$;\n"
-        "\n",
-        "package", java_package);
+          "package $package$;\n"
+          "\n",
+          "package", java_package);
     }
     PrintGeneratedAnnotation(printer.get(), '$',
                              options_.annotate_code ? info_relative_path : "");
@@ -101,8 +100,8 @@
     printer->Outdent();
     printer->Outdent();
     printer->Print(
-      "  }\n"
-      "}\n");
+        "  }\n"
+        "}\n");
 
     if (options_.annotate_code) {
       std::unique_ptr<io::ZeroCopyOutputStream> info_output(
@@ -133,8 +132,7 @@
   std::string file_data;
   file_proto.SerializeToString(&file_data);
 
-  printer->Print(
-    "java.lang.String[] descriptorData = {\n");
+  printer->Print("java.lang.String[] descriptorData = {\n");
   printer->Indent();
 
   // Limit the number of bytes per line.
@@ -152,8 +150,8 @@
         printer->Print(" +\n");
       }
     }
-    printer->Print("\"$data$\"",
-      "data", CEscape(file_data.substr(i, kBytesPerLine)));
+    printer->Print("\"$data$\"", "data",
+                   CEscape(file_data.substr(i, kBytesPerLine)));
   }
 
   printer->Outdent();
@@ -179,20 +177,18 @@
   // -----------------------------------------------------------------
   // Invoke internalBuildGeneratedFileFrom() to build the file.
   printer->Print(
-    "descriptor = com.google.protobuf.Descriptors.FileDescriptor\n"
-    "  .internalBuildGeneratedFileFrom(descriptorData,\n");
+      "descriptor = com.google.protobuf.Descriptors.FileDescriptor\n"
+      "  .internalBuildGeneratedFileFrom(descriptorData,\n");
   printer->Print(
-    "    new com.google.protobuf.Descriptors.FileDescriptor[] {\n");
+      "    new com.google.protobuf.Descriptors.FileDescriptor[] {\n");
 
   for (int i = 0; i < dependencies.size(); i++) {
     const std::string& dependency = dependencies[i].second;
-    printer->Print(
-        "      $dependency$.getDescriptor(),\n",
-        "dependency", dependency);
+    printer->Print("      $dependency$.getDescriptor(),\n", "dependency",
+                   dependency);
   }
 
-  printer->Print(
-    "    });\n");
+  printer->Print("    });\n");
 }
 
 }  // namespace java
diff --git a/src/google/protobuf/compiler/java/java_shared_code_generator.h b/src/google/protobuf/compiler/java/java_shared_code_generator.h
index 2f09c3a..7c79abe 100644
--- a/src/google/protobuf/compiler/java/java_shared_code_generator.h
+++ b/src/google/protobuf/compiler/java/java_shared_code_generator.h
@@ -82,7 +82,6 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SharedCodeGenerator);
 };
 
-
 }  // namespace java
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/java/java_string_field.cc b/src/google/protobuf/compiler/java/java_string_field.cc
index a20d7ef..d68f178 100644
--- a/src/google/protobuf/compiler/java/java_string_field.cc
+++ b/src/google/protobuf/compiler/java/java_string_field.cc
@@ -79,17 +79,16 @@
       "  if (value == null) {\n"
       "    throw new NullPointerException();\n"
       "  }\n";
-  (*variables)["writeString"] =
-      "com.google.protobuf.GeneratedMessage" + GeneratedCodeVersionSuffix() +
-      ".writeString";
-  (*variables)["computeStringSize"] =
-      "com.google.protobuf.GeneratedMessage" + GeneratedCodeVersionSuffix() +
-      ".computeStringSize";
+  (*variables)["writeString"] = "com.google.protobuf.GeneratedMessage" +
+                                GeneratedCodeVersionSuffix() + ".writeString";
+  (*variables)["computeStringSize"] = "com.google.protobuf.GeneratedMessage" +
+                                      GeneratedCodeVersionSuffix() +
+                                      ".computeStringSize";
 
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
-  (*variables)["deprecation"] = descriptor->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  (*variables)["deprecation"] =
+      descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
   (*variables)["on_changed"] = "onChanged();";
 
   if (SupportFieldPresence(descriptor->file())) {
@@ -137,14 +136,14 @@
 
 // ===================================================================
 
-ImmutableStringFieldGenerator::
-ImmutableStringFieldGenerator(const FieldDescriptor* descriptor,
-                              int messageBitIndex,
-                              int builderBitIndex,
-                              Context* context)
-  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
-    builderBitIndex_(builderBitIndex), context_(context),
-    name_resolver_(context->GetNameResolver()) {
+ImmutableStringFieldGenerator::ImmutableStringFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : descriptor_(descriptor),
+      messageBitIndex_(messageBitIndex),
+      builderBitIndex_(builderBitIndex),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,
                         context->GetFieldGeneratorInfo(descriptor),
                         name_resolver_, &variables_);
@@ -192,275 +191,275 @@
 // For single fields, the logic for this is done inside the generated code. For
 // repeated fields, the logic is done in LazyStringArrayList and
 // UnmodifiableLazyStringList.
-void ImmutableStringFieldGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$boolean has$capitalized_name$();\n");
+                   "$deprecation$boolean has$capitalized_name$();\n");
   }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.lang.String get$capitalized_name$();\n");
+                 "$deprecation$java.lang.String get$capitalized_name$();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$com.google.protobuf.ByteString\n"
-    "    get$capitalized_name$Bytes();\n");
+                 "$deprecation$com.google.protobuf.ByteString\n"
+                 "    get$capitalized_name$Bytes();\n");
 }
 
-void ImmutableStringFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private volatile java.lang.Object $name$_;\n");
+void ImmutableStringFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_, "private volatile java.lang.Object $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
 
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
-    "  java.lang.Object ref = $name$_;\n"
-    "  if (ref instanceof java.lang.String) {\n"
-    "    return (java.lang.String) ref;\n"
-    "  } else {\n"
-    "    com.google.protobuf.ByteString bs = \n"
-    "        (com.google.protobuf.ByteString) ref;\n"
+  printer->Print(
+      variables_,
+      "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
+      "  java.lang.Object ref = $name$_;\n"
+      "  if (ref instanceof java.lang.String) {\n"
+      "    return (java.lang.String) ref;\n"
+      "  } else {\n"
+      "    com.google.protobuf.ByteString bs = \n"
+      "        (com.google.protobuf.ByteString) ref;\n"
       "    java.lang.String s = bs.toStringUtf8();\n");
   printer->Annotate("{", "}", descriptor_);
   if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "    $name$_ = s;\n");
+    printer->Print(variables_, "    $name$_ = s;\n");
   } else {
     printer->Print(variables_,
-      "    if (bs.isValidUtf8()) {\n"
-      "      $name$_ = s;\n"
-      "    }\n");
+                   "    if (bs.isValidUtf8()) {\n"
+                   "      $name$_ = s;\n"
+                   "    }\n");
   }
   printer->Print(variables_,
-    "    return s;\n"
-    "  }\n"
-    "}\n");
+                 "    return s;\n"
+                 "  }\n"
+                 "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
-    "  java.lang.Object ref = $name$_;\n"
-    "  if (ref instanceof java.lang.String) {\n"
-    "    com.google.protobuf.ByteString b = \n"
-    "        com.google.protobuf.ByteString.copyFromUtf8(\n"
-    "            (java.lang.String) ref);\n"
-    "    $name$_ = b;\n"
-    "    return b;\n"
-    "  } else {\n"
-    "    return (com.google.protobuf.ByteString) ref;\n"
-    "  }\n"
-    "}\n");
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$() {\n"
+                 "  java.lang.Object ref = $name$_;\n"
+                 "  if (ref instanceof java.lang.String) {\n"
+                 "    com.google.protobuf.ByteString b = \n"
+                 "        com.google.protobuf.ByteString.copyFromUtf8(\n"
+                 "            (java.lang.String) ref);\n"
+                 "    $name$_ = b;\n"
+                 "    return b;\n"
+                 "  } else {\n"
+                 "    return (com.google.protobuf.ByteString) ref;\n"
+                 "  }\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableStringFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "private java.lang.Object $name$_ $default_init$;\n");
+                 "private java.lang.Object $name$_ $default_init$;\n");
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_builder$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_builder$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
-    "  java.lang.Object ref = $name$_;\n"
-    "  if (!(ref instanceof java.lang.String)) {\n"
-    "    com.google.protobuf.ByteString bs =\n"
-    "        (com.google.protobuf.ByteString) ref;\n"
-    "    java.lang.String s = bs.toStringUtf8();\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
+      "  java.lang.Object ref = $name$_;\n"
+      "  if (!(ref instanceof java.lang.String)) {\n"
+      "    com.google.protobuf.ByteString bs =\n"
+      "        (com.google.protobuf.ByteString) ref;\n"
+      "    java.lang.String s = bs.toStringUtf8();\n");
   printer->Annotate("{", "}", descriptor_);
   if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "    $name$_ = s;\n");
+    printer->Print(variables_, "    $name$_ = s;\n");
   } else {
     printer->Print(variables_,
-      "    if (bs.isValidUtf8()) {\n"
-      "      $name$_ = s;\n"
-      "    }\n");
+                   "    if (bs.isValidUtf8()) {\n"
+                   "      $name$_ = s;\n"
+                   "    }\n");
   }
   printer->Print(variables_,
-    "    return s;\n"
-    "  } else {\n"
-    "    return (java.lang.String) ref;\n"
-    "  }\n"
-    "}\n");
+                 "    return s;\n"
+                 "  } else {\n"
+                 "    return (java.lang.String) ref;\n"
+                 "  }\n"
+                 "}\n");
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
-    "  java.lang.Object ref = $name$_;\n"
-    "  if (ref instanceof String) {\n"
-    "    com.google.protobuf.ByteString b = \n"
-    "        com.google.protobuf.ByteString.copyFromUtf8(\n"
-    "            (java.lang.String) ref);\n"
-    "    $name$_ = b;\n"
-    "    return b;\n"
-    "  } else {\n"
-    "    return (com.google.protobuf.ByteString) ref;\n"
-    "  }\n"
-    "}\n");
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$() {\n"
+                 "  java.lang.Object ref = $name$_;\n"
+                 "  if (ref instanceof String) {\n"
+                 "    com.google.protobuf.ByteString b = \n"
+                 "        com.google.protobuf.ByteString.copyFromUtf8(\n"
+                 "            (java.lang.String) ref);\n"
+                 "    $name$_ = b;\n"
+                 "    return b;\n"
+                 "  } else {\n"
+                 "    return (com.google.protobuf.ByteString) ref;\n"
+                 "  }\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    java.lang.String value) {\n"
-    "$null_check$"
-    "  $set_has_field_bit_builder$\n"
-    "  $name$_ = value;\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    java.lang.String value) {\n"
+                 "$null_check$"
+                 "  $set_has_field_bit_builder$\n"
+                 "  $name$_ = value;\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  $clear_has_field_bit_builder$\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  $clear_has_field_bit_builder$\n");
   printer->Annotate("{", "}", descriptor_);
   // The default value is not a simple literal so we want to avoid executing
   // it multiple times.  Instead, get the default out of the default instance.
   printer->Print(variables_,
-    "  $name$_ = getDefaultInstance().get$capitalized_name$();\n");
+                 "  $name$_ = getDefaultInstance().get$capitalized_name$();\n");
   printer->Print(variables_,
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n"
-    "    com.google.protobuf.ByteString value) {\n"
-    "$null_check$");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n"
+      "    com.google.protobuf.ByteString value) {\n"
+      "$null_check$");
   printer->Annotate("{", "}", descriptor_);
   if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "  checkByteStringIsUtf8(value);\n");
+    printer->Print(variables_, "  checkByteStringIsUtf8(value);\n");
   }
   printer->Print(variables_,
-    "  $set_has_field_bit_builder$\n"
-    "  $name$_ = value;\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "  $set_has_field_bit_builder$\n"
+                 "  $name$_ = value;\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
 }
 
-void ImmutableStringFieldGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+void ImmutableStringFieldGenerator::GenerateFieldBuilderInitializationCode(
+    io::Printer* printer) const {
   // noop for primitives
 }
 
-void ImmutableStringFieldGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = $default$;\n");
 }
 
-void ImmutableStringFieldGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateBuilderClearCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$name$_ = $default$;\n"
-    "$clear_has_field_bit_builder$\n");
+                 "$name$_ = $default$;\n"
+                 "$clear_has_field_bit_builder$\n");
 }
 
-void ImmutableStringFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     // Allow a slight breach of abstraction here in order to avoid forcing
     // all string fields to Strings when copying fields from a Message.
     printer->Print(variables_,
-      "if (other.has$capitalized_name$()) {\n"
-      "  $set_has_field_bit_builder$\n"
-      "  $name$_ = other.$name$_;\n"
-      "  $on_changed$\n"
-      "}\n");
+                   "if (other.has$capitalized_name$()) {\n"
+                   "  $set_has_field_bit_builder$\n"
+                   "  $name$_ = other.$name$_;\n"
+                   "  $on_changed$\n"
+                   "}\n");
   } else {
     printer->Print(variables_,
-      "if (!other.get$capitalized_name$().isEmpty()) {\n"
-      "  $name$_ = other.$name$_;\n"
-      "  $on_changed$\n"
-      "}\n");
+                   "if (!other.get$capitalized_name$().isEmpty()) {\n"
+                   "  $name$_ = other.$name$_;\n"
+                   "  $on_changed$\n"
+                   "}\n");
   }
 }
 
-void ImmutableStringFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     printer->Print(variables_,
-      "if ($get_has_field_bit_from_local$) {\n"
-      "  $set_has_field_bit_to_local$;\n"
-      "}\n");
+                   "if ($get_has_field_bit_from_local$) {\n"
+                   "  $set_has_field_bit_to_local$;\n"
+                   "}\n");
   }
-  printer->Print(variables_,
-    "result.$name$_ = $name$_;\n");
+  printer->Print(variables_, "result.$name$_ = $name$_;\n");
 }
 
-void ImmutableStringFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   if (CheckUtf8(descriptor_)) {
     printer->Print(variables_,
-      "java.lang.String s = input.readStringRequireUtf8();\n"
-      "$set_has_field_bit_message$\n"
-      "$name$_ = s;\n");
+                   "java.lang.String s = input.readStringRequireUtf8();\n"
+                   "$set_has_field_bit_message$\n"
+                   "$name$_ = s;\n");
   } else {
     printer->Print(variables_,
-      "com.google.protobuf.ByteString bs = input.readBytes();\n"
-      "$set_has_field_bit_message$\n"
-      "$name$_ = bs;\n");
+                   "com.google.protobuf.ByteString bs = input.readBytes();\n"
+                   "$set_has_field_bit_message$\n"
+                   "$name$_ = bs;\n");
   }
 }
 
-void ImmutableStringFieldGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateParsingDoneCode(
+    io::Printer* printer) const {
   // noop for strings.
 }
 
-void ImmutableStringFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  $writeString$(output, $number$, $name$_);\n"
-    "}\n");
+                 "if ($is_field_present_message$) {\n"
+                 "  $writeString$(output, $number$, $name$_);\n"
+                 "}\n");
 }
 
-void ImmutableStringFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  size += $computeStringSize$($number$, $name$_);\n"
-    "}\n");
+                 "if ($is_field_present_message$) {\n"
+                 "  size += $computeStringSize$($number$, $name$_);\n"
+                 "}\n");
 }
 
-void ImmutableStringFieldGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateEqualsCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if (!get$capitalized_name$()\n"
-    "    .equals(other.get$capitalized_name$())) return false;\n");
+                 "if (!get$capitalized_name$()\n"
+                 "    .equals(other.get$capitalized_name$())) return false;\n");
 }
 
-void ImmutableStringFieldGenerator::
-GenerateHashCode(io::Printer* printer) const {
+void ImmutableStringFieldGenerator::GenerateHashCode(
+    io::Printer* printer) const {
+  printer->Print(variables_, "hash = (37 * hash) + $constant_name$;\n");
   printer->Print(variables_,
-    "hash = (37 * hash) + $constant_name$;\n");
-  printer->Print(variables_,
-    "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
+                 "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
 }
 
 std::string ImmutableStringFieldGenerator::GetBoxedType() const {
@@ -469,257 +468,258 @@
 
 // ===================================================================
 
-ImmutableStringOneofFieldGenerator::
-ImmutableStringOneofFieldGenerator(const FieldDescriptor* descriptor,
-                                   int messageBitIndex,
-                                   int builderBitIndex,
-                                   Context* context)
-    : ImmutableStringFieldGenerator(
-          descriptor, messageBitIndex, builderBitIndex, context) {
+ImmutableStringOneofFieldGenerator::ImmutableStringOneofFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : ImmutableStringFieldGenerator(descriptor, messageBitIndex,
+                                    builderBitIndex, context) {
   const OneofGeneratorInfo* info =
       context->GetOneofGeneratorInfo(descriptor->containing_oneof());
   SetCommonOneofVariables(descriptor, info, &variables_);
 }
 
-ImmutableStringOneofFieldGenerator::
-~ImmutableStringOneofFieldGenerator() {}
+ImmutableStringOneofFieldGenerator::~ImmutableStringOneofFieldGenerator() {}
 
-void ImmutableStringOneofFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutableStringOneofFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
   PrintExtraFieldInfo(variables_, printer);
 
   if (SupportFieldPresence(descriptor_->file())) {
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-    "  return $has_oneof_case_message$;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  }
-
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
-    "  java.lang.Object ref $default_init$;\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    ref = $oneof_name$_;\n"
-    "  }\n"
-    "  if (ref instanceof java.lang.String) {\n"
-    "    return (java.lang.String) ref;\n"
-    "  } else {\n"
-    "    com.google.protobuf.ByteString bs = \n"
-    "        (com.google.protobuf.ByteString) ref;\n"
-    "    java.lang.String s = bs.toStringUtf8();\n");
-  printer->Annotate("{", "}", descriptor_);
-  if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-    "    if ($has_oneof_case_message$) {\n"
-    "      $oneof_name$_ = s;\n"
-    "    }\n");
-  } else {
-    printer->Print(variables_,
-    "    if (bs.isValidUtf8() && ($has_oneof_case_message$)) {\n"
-    "      $oneof_name$_ = s;\n"
-    "    }\n");
-  }
-  printer->Print(variables_,
-    "    return s;\n"
-    "  }\n"
-    "}\n");
-  WriteFieldDocComment(printer, descriptor_);
-
-  printer->Print(variables_,
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
-    "  java.lang.Object ref $default_init$;\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    ref = $oneof_name$_;\n"
-    "  }\n"
-    "  if (ref instanceof java.lang.String) {\n"
-    "    com.google.protobuf.ByteString b = \n"
-    "        com.google.protobuf.ByteString.copyFromUtf8(\n"
-    "            (java.lang.String) ref);\n"
-    "    if ($has_oneof_case_message$) {\n"
-    "      $oneof_name$_ = b;\n"
-    "    }\n"
-    "    return b;\n"
-    "  } else {\n"
-    "    return (com.google.protobuf.ByteString) ref;\n"
-    "  }\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-}
-
-void ImmutableStringOneofFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
-  if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $has_oneof_case_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $has_oneof_case_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
-    "  java.lang.Object ref $default_init$;\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    ref = $oneof_name$_;\n"
-    "  }\n"
-    "  if (!(ref instanceof java.lang.String)) {\n"
-    "    com.google.protobuf.ByteString bs =\n"
-    "        (com.google.protobuf.ByteString) ref;\n"
-    "    java.lang.String s = bs.toStringUtf8();\n"
-    "    if ($has_oneof_case_message$) {\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
+      "  java.lang.Object ref $default_init$;\n"
+      "  if ($has_oneof_case_message$) {\n"
+      "    ref = $oneof_name$_;\n"
+      "  }\n"
+      "  if (ref instanceof java.lang.String) {\n"
+      "    return (java.lang.String) ref;\n"
+      "  } else {\n"
+      "    com.google.protobuf.ByteString bs = \n"
+      "        (com.google.protobuf.ByteString) ref;\n"
+      "    java.lang.String s = bs.toStringUtf8();\n");
   printer->Annotate("{", "}", descriptor_);
   if (CheckUtf8(descriptor_)) {
     printer->Print(variables_,
-      "      $oneof_name$_ = s;\n");
+                   "    if ($has_oneof_case_message$) {\n"
+                   "      $oneof_name$_ = s;\n"
+                   "    }\n");
   } else {
     printer->Print(variables_,
-      "      if (bs.isValidUtf8()) {\n"
-      "        $oneof_name$_ = s;\n"
-      "      }\n");
+                   "    if (bs.isValidUtf8() && ($has_oneof_case_message$)) {\n"
+                   "      $oneof_name$_ = s;\n"
+                   "    }\n");
   }
   printer->Print(variables_,
-    "    }\n"
-    "    return s;\n"
-    "  } else {\n"
-    "    return (java.lang.String) ref;\n"
-    "  }\n"
-    "}\n");
+                 "    return s;\n"
+                 "  }\n"
+                 "}\n");
+  WriteFieldDocComment(printer, descriptor_);
 
-  WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
-    "  java.lang.Object ref $default_init$;\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    ref = $oneof_name$_;\n"
-    "  }\n"
-    "  if (ref instanceof String) {\n"
-    "    com.google.protobuf.ByteString b = \n"
-    "        com.google.protobuf.ByteString.copyFromUtf8(\n"
-    "            (java.lang.String) ref);\n"
-    "    if ($has_oneof_case_message$) {\n"
-    "      $oneof_name$_ = b;\n"
-    "    }\n"
-    "    return b;\n"
-    "  } else {\n"
-    "    return (com.google.protobuf.ByteString) ref;\n"
-    "  }\n"
-    "}\n");
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$() {\n"
+                 "  java.lang.Object ref $default_init$;\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    ref = $oneof_name$_;\n"
+                 "  }\n"
+                 "  if (ref instanceof java.lang.String) {\n"
+                 "    com.google.protobuf.ByteString b = \n"
+                 "        com.google.protobuf.ByteString.copyFromUtf8(\n"
+                 "            (java.lang.String) ref);\n"
+                 "    if ($has_oneof_case_message$) {\n"
+                 "      $oneof_name$_ = b;\n"
+                 "    }\n"
+                 "    return b;\n"
+                 "  } else {\n"
+                 "    return (com.google.protobuf.ByteString) ref;\n"
+                 "  }\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
-
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    java.lang.String value) {\n"
-    "$null_check$"
-    "  $set_oneof_case_message$;\n"
-    "  $oneof_name$_ = value;\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    $clear_oneof_case_message$;\n"
-    "    $oneof_name$_ = null;\n"
-    "    $on_changed$\n"
-    "  }\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n"
-    "    com.google.protobuf.ByteString value) {\n"
-    "$null_check$");
-  printer->Annotate("{", "}", descriptor_);
-  if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "  checkByteStringIsUtf8(value);\n");
-  }
-  printer->Print(variables_,
-    "  $set_oneof_case_message$;\n"
-    "  $oneof_name$_ = value;\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
 }
 
-void ImmutableStringOneofFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void ImmutableStringOneofFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
+  if (SupportFieldPresence(descriptor_->file())) {
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(
+        variables_,
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $has_oneof_case_message$;\n"
+        "}\n");
+    printer->Annotate("{", "}", descriptor_);
+  }
+
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
+      "  java.lang.Object ref $default_init$;\n"
+      "  if ($has_oneof_case_message$) {\n"
+      "    ref = $oneof_name$_;\n"
+      "  }\n"
+      "  if (!(ref instanceof java.lang.String)) {\n"
+      "    com.google.protobuf.ByteString bs =\n"
+      "        (com.google.protobuf.ByteString) ref;\n"
+      "    java.lang.String s = bs.toStringUtf8();\n"
+      "    if ($has_oneof_case_message$) {\n");
+  printer->Annotate("{", "}", descriptor_);
+  if (CheckUtf8(descriptor_)) {
+    printer->Print(variables_, "      $oneof_name$_ = s;\n");
+  } else {
+    printer->Print(variables_,
+                   "      if (bs.isValidUtf8()) {\n"
+                   "        $oneof_name$_ = s;\n"
+                   "      }\n");
+  }
+  printer->Print(variables_,
+                 "    }\n"
+                 "    return s;\n"
+                 "  } else {\n"
+                 "    return (java.lang.String) ref;\n"
+                 "  }\n"
+                 "}\n");
+
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$() {\n"
+                 "  java.lang.Object ref $default_init$;\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    ref = $oneof_name$_;\n"
+                 "  }\n"
+                 "  if (ref instanceof String) {\n"
+                 "    com.google.protobuf.ByteString b = \n"
+                 "        com.google.protobuf.ByteString.copyFromUtf8(\n"
+                 "            (java.lang.String) ref);\n"
+                 "    if ($has_oneof_case_message$) {\n"
+                 "      $oneof_name$_ = b;\n"
+                 "    }\n"
+                 "    return b;\n"
+                 "  } else {\n"
+                 "    return (com.google.protobuf.ByteString) ref;\n"
+                 "  }\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    java.lang.String value) {\n"
+                 "$null_check$"
+                 "  $set_oneof_case_message$;\n"
+                 "  $oneof_name$_ = value;\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  if ($has_oneof_case_message$) {\n"
+      "    $clear_oneof_case_message$;\n"
+      "    $oneof_name$_ = null;\n"
+      "    $on_changed$\n"
+      "  }\n"
+      "  return this;\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n"
+      "    com.google.protobuf.ByteString value) {\n"
+      "$null_check$");
+  printer->Annotate("{", "}", descriptor_);
+  if (CheckUtf8(descriptor_)) {
+    printer->Print(variables_, "  checkByteStringIsUtf8(value);\n");
+  }
+  printer->Print(variables_,
+                 "  $set_oneof_case_message$;\n"
+                 "  $oneof_name$_ = value;\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
+}
+
+void ImmutableStringOneofFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   // Allow a slight breach of abstraction here in order to avoid forcing
   // all string fields to Strings when copying fields from a Message.
   printer->Print(variables_,
-    "$set_oneof_case_message$;\n"
-    "$oneof_name$_ = other.$oneof_name$_;\n"
-    "$on_changed$\n");
+                 "$set_oneof_case_message$;\n"
+                 "$oneof_name$_ = other.$oneof_name$_;\n"
+                 "$on_changed$\n");
 }
 
-void ImmutableStringOneofFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void ImmutableStringOneofFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  result.$oneof_name$_ = $oneof_name$_;\n"
-    "}\n");
+                 "if ($has_oneof_case_message$) {\n"
+                 "  result.$oneof_name$_ = $oneof_name$_;\n"
+                 "}\n");
 }
 
-void ImmutableStringOneofFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void ImmutableStringOneofFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   if (CheckUtf8(descriptor_)) {
     printer->Print(variables_,
-      "java.lang.String s = input.readStringRequireUtf8();\n"
-      "$set_oneof_case_message$;\n"
-      "$oneof_name$_ = s;\n");
+                   "java.lang.String s = input.readStringRequireUtf8();\n"
+                   "$set_oneof_case_message$;\n"
+                   "$oneof_name$_ = s;\n");
   } else {
     printer->Print(variables_,
-      "com.google.protobuf.ByteString bs = input.readBytes();\n"
-      "$set_oneof_case_message$;\n"
-      "$oneof_name$_ = bs;\n");
+                   "com.google.protobuf.ByteString bs = input.readBytes();\n"
+                   "$set_oneof_case_message$;\n"
+                   "$oneof_name$_ = bs;\n");
   }
 }
 
-void ImmutableStringOneofFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
+void ImmutableStringOneofFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  $writeString$(output, $number$, $oneof_name$_);\n"
-    "}\n");
+                 "if ($has_oneof_case_message$) {\n"
+                 "  $writeString$(output, $number$, $oneof_name$_);\n"
+                 "}\n");
 }
 
-void ImmutableStringOneofFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
+void ImmutableStringOneofFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  size += $computeStringSize$($number$, $oneof_name$_);\n"
-    "}\n");
+                 "if ($has_oneof_case_message$) {\n"
+                 "  size += $computeStringSize$($number$, $oneof_name$_);\n"
+                 "}\n");
 }
 
 // ===================================================================
 
-RepeatedImmutableStringFieldGenerator::
-RepeatedImmutableStringFieldGenerator(const FieldDescriptor* descriptor,
-                                      int messageBitIndex,
-                                      int builderBitIndex,
-                                      Context* context)
-  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
-    builderBitIndex_(builderBitIndex), context_(context),
-    name_resolver_(context->GetNameResolver()) {
+RepeatedImmutableStringFieldGenerator::RepeatedImmutableStringFieldGenerator(
+    const FieldDescriptor* descriptor, int messageBitIndex, int builderBitIndex,
+    Context* context)
+    : descriptor_(descriptor),
+      messageBitIndex_(messageBitIndex),
+      builderBitIndex_(builderBitIndex),
+      context_(context),
+      name_resolver_(context->GetNameResolver()) {
   SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,
                         context->GetFieldGeneratorInfo(descriptor),
                         name_resolver_, &variables_);
 }
 
 RepeatedImmutableStringFieldGenerator::
-~RepeatedImmutableStringFieldGenerator() {}
+    ~RepeatedImmutableStringFieldGenerator() {}
 
 int RepeatedImmutableStringFieldGenerator::GetNumBitsForMessage() const {
   return 0;
@@ -729,67 +729,69 @@
   return 1;
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      // NOTE: the same method in the implementation class actually returns
+      // com.google.protobuf.ProtocolStringList (a subclass of List). It's
+      // changed between protobuf 2.5.0 release and protobuf 2.6.1 release.
+      // To retain binary compatibility with both 2.5.0 and 2.6.1 generated
+      // code, we make this interface method return List so both methods
+      // with different return types exist in the compiled byte code.
+      "$deprecation$java.util.List<java.lang.String>\n"
+      "    get$capitalized_name$List();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    // NOTE: the same method in the implementation class actually returns
-    // com.google.protobuf.ProtocolStringList (a subclass of List). It's
-    // changed between protobuf 2.5.0 release and protobuf 2.6.1 release.
-    // To retain binary compatibility with both 2.5.0 and 2.6.1 generated
-    // code, we make this interface method return List so both methods
-    // with different return types exist in the compiled byte code.
-    "$deprecation$java.util.List<java.lang.String>\n"
-    "    get$capitalized_name$List();\n");
+                 "$deprecation$int get$capitalized_name$Count();\n");
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$java.lang.String get$capitalized_name$(int index);\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$int get$capitalized_name$Count();\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$java.lang.String get$capitalized_name$(int index);\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$com.google.protobuf.ByteString\n"
-    "    get$capitalized_name$Bytes(int index);\n");
+                 "$deprecation$com.google.protobuf.ByteString\n"
+                 "    get$capitalized_name$Bytes(int index);\n");
 }
 
-
-void RepeatedImmutableStringFieldGenerator::
-GenerateMembers(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateMembers(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "private com.google.protobuf.LazyStringList $name$_;\n");
+                 "private com.google.protobuf.LazyStringList $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public com.google.protobuf.ProtocolStringList\n"
-    "    ${$get$capitalized_name$List$}$() {\n"
-    "  return $name$_;\n"   // note:  unmodifiable list
-    "}\n");
+                 "$deprecation$public com.google.protobuf.ProtocolStringList\n"
+                 "    ${$get$capitalized_name$List$}$() {\n"
+                 "  return $name$_;\n"  // note:  unmodifiable list
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
+                 "$deprecation$public java.lang.String "
+                 "${$get$capitalized_name$$}$(int index) {\n"
+                 "  return $name$_.get(index);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.lang.String "
-    "${$get$capitalized_name$$}$(int index) {\n"
-    "  return $name$_.get(index);\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$(int index) {\n"
-    "  return $name$_.getByteString(index);\n"
-    "}\n");
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$(int index) {\n"
+                 "  return $name$_.getByteString(index);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   // One field is the list and the bit field keeps track of whether the
   // list is immutable. If it's immutable, the invariant is that it must
   // either an instance of Collections.emptyList() or it's an ArrayList
@@ -799,234 +801,237 @@
   // memory allocations. Note, immutable is a strong guarantee here -- not
   // just that the list cannot be modified via the reference but that the
   // list can never be modified.
-  printer->Print(variables_,
-    "private com.google.protobuf.LazyStringList $name$_ = $empty_list$;\n");
+  printer->Print(
+      variables_,
+      "private com.google.protobuf.LazyStringList $name$_ = $empty_list$;\n");
 
-  printer->Print(variables_,
-    "private void ensure$capitalized_name$IsMutable() {\n"
-    "  if (!$get_mutable_bit_builder$) {\n"
-    "    $name$_ = new com.google.protobuf.LazyStringArrayList($name$_);\n"
-    "    $set_mutable_bit_builder$;\n"
-    "   }\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "private void ensure$capitalized_name$IsMutable() {\n"
+      "  if (!$get_mutable_bit_builder$) {\n"
+      "    $name$_ = new com.google.protobuf.LazyStringArrayList($name$_);\n"
+      "    $set_mutable_bit_builder$;\n"
+      "   }\n"
+      "}\n");
 
-    // Note:  We return an unmodifiable list because otherwise the caller
-    //   could hold on to the returned list and modify it after the message
-    //   has been built, thus mutating the message which is supposed to be
-    //   immutable.
+  // Note:  We return an unmodifiable list because otherwise the caller
+  //   could hold on to the returned list and modify it after the message
+  //   has been built, thus mutating the message which is supposed to be
+  //   immutable.
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public com.google.protobuf.ProtocolStringList\n"
-    "    ${$get$capitalized_name$List$}$() {\n"
-    "  return $name$_.getUnmodifiableView();\n"
-    "}\n");
+                 "$deprecation$public com.google.protobuf.ProtocolStringList\n"
+                 "    ${$get$capitalized_name$List$}$() {\n"
+                 "  return $name$_.getUnmodifiableView();\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
+                 "$deprecation$public java.lang.String "
+                 "${$get$capitalized_name$$}$(int index) {\n"
+                 "  return $name$_.get(index);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public java.lang.String "
-    "${$get$capitalized_name$$}$(int index) {\n"
-    "  return $name$_.get(index);\n"
-    "}\n");
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$(int index) {\n"
+                 "  return $name$_.getByteString(index);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$(int index) {\n"
-    "  return $name$_.getByteString(index);\n"
-    "}\n");
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    int index, java.lang.String value) {\n"
+                 "$null_check$"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.set(index, value);\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    int index, java.lang.String value) {\n"
-    "$null_check$"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.set(index, value);\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+                 "    java.lang.String value) {\n"
+                 "$null_check$"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.add(value);\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
-    "    java.lang.String value) {\n"
-    "$null_check$"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.add(value);\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
+                 "    java.lang.Iterable<java.lang.String> values) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
+                 "      values, $name$_);\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
-    "    java.lang.Iterable<java.lang.String> values) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
-    "      values, $name$_);\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  $name$_ = $empty_list$;\n"
-    "  $clear_mutable_bit_builder$;\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  $name$_ = $empty_list$;\n"
+      "  $clear_mutable_bit_builder$;\n"
+      "  $on_changed$\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$Bytes$}$(\n"
-    "    com.google.protobuf.ByteString value) {\n"
-    "$null_check$");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$add$capitalized_name$Bytes$}$(\n"
+      "    com.google.protobuf.ByteString value) {\n"
+      "$null_check$");
   printer->Annotate("{", "}", descriptor_);
   if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "  checkByteStringIsUtf8(value);\n");
+    printer->Print(variables_, "  checkByteStringIsUtf8(value);\n");
   }
   printer->Print(variables_,
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.add(value);\n"
-    "  $on_changed$\n"
-    "  return this;\n"
-    "}\n");
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.add(value);\n"
+                 "  $on_changed$\n"
+                 "  return this;\n"
+                 "}\n");
 }
 
 void RepeatedImmutableStringFieldGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+    GenerateFieldBuilderInitializationCode(io::Printer* printer) const {
   // noop for primitives
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = $empty_list$;\n");
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateBuilderClearCode(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateBuilderClearCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "$name$_ = $empty_list$;\n"
-    "$clear_mutable_bit_builder$;\n");
+                 "$name$_ = $empty_list$;\n"
+                 "$clear_mutable_bit_builder$;\n");
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateMergingCode(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateMergingCode(
+    io::Printer* printer) const {
   // The code below does two optimizations:
   //   1. If the other list is empty, there's nothing to do. This ensures we
   //      don't allocate a new array if we already have an immutable one.
   //   2. If the other list is non-empty and our current list is empty, we can
   //      reuse the other list which is guaranteed to be immutable.
   printer->Print(variables_,
-    "if (!other.$name$_.isEmpty()) {\n"
-    "  if ($name$_.isEmpty()) {\n"
-    "    $name$_ = other.$name$_;\n"
-    "    $clear_mutable_bit_builder$;\n"
-    "  } else {\n"
-    "    ensure$capitalized_name$IsMutable();\n"
-    "    $name$_.addAll(other.$name$_);\n"
-    "  }\n"
-    "  $on_changed$\n"
-    "}\n");
+                 "if (!other.$name$_.isEmpty()) {\n"
+                 "  if ($name$_.isEmpty()) {\n"
+                 "    $name$_ = other.$name$_;\n"
+                 "    $clear_mutable_bit_builder$;\n"
+                 "  } else {\n"
+                 "    ensure$capitalized_name$IsMutable();\n"
+                 "    $name$_.addAll(other.$name$_);\n"
+                 "  }\n"
+                 "  $on_changed$\n"
+                 "}\n");
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateBuildingCode(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateBuildingCode(
+    io::Printer* printer) const {
   // The code below ensures that the result has an immutable list. If our
   // list is immutable, we can just reuse it. If not, we make it immutable.
 
   printer->Print(variables_,
-    "if ($get_mutable_bit_builder$) {\n"
-    "  $name$_ = $name$_.getUnmodifiableView();\n"
-    "  $clear_mutable_bit_builder$;\n"
-    "}\n"
-    "result.$name$_ = $name$_;\n");
+                 "if ($get_mutable_bit_builder$) {\n"
+                 "  $name$_ = $name$_.getUnmodifiableView();\n"
+                 "  $clear_mutable_bit_builder$;\n"
+                 "}\n"
+                 "result.$name$_ = $name$_;\n");
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateParsingCode(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateParsingCode(
+    io::Printer* printer) const {
   if (CheckUtf8(descriptor_)) {
     printer->Print(variables_,
-    "java.lang.String s = input.readStringRequireUtf8();\n");
+                   "java.lang.String s = input.readStringRequireUtf8();\n");
   } else {
     printer->Print(variables_,
-    "com.google.protobuf.ByteString bs = input.readBytes();\n");
+                   "com.google.protobuf.ByteString bs = input.readBytes();\n");
   }
   printer->Print(variables_,
-    "if (!$get_mutable_bit_parser$) {\n"
-    "  $name$_ = new com.google.protobuf.LazyStringArrayList();\n"
-    "  $set_mutable_bit_parser$;\n"
-    "}\n");
+                 "if (!$get_mutable_bit_parser$) {\n"
+                 "  $name$_ = new com.google.protobuf.LazyStringArrayList();\n"
+                 "  $set_mutable_bit_parser$;\n"
+                 "}\n");
   if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "$name$_.add(s);\n");
+    printer->Print(variables_, "$name$_.add(s);\n");
   } else {
-    printer->Print(variables_,
-      "$name$_.add(bs);\n");
+    printer->Print(variables_, "$name$_.add(bs);\n");
   }
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateParsingDoneCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "if ($get_mutable_bit_parser$) {\n"
-    "  $name$_ = $name$_.getUnmodifiableView();\n"
-    "}\n");
+                 "if ($get_mutable_bit_parser$) {\n"
+                 "  $name$_ = $name$_.getUnmodifiableView();\n"
+                 "}\n");
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateSerializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "for (int i = 0; i < $name$_.size(); i++) {\n"
-    "  $writeString$(output, $number$, $name$_.getRaw(i));\n"
-    "}\n");
+                 "for (int i = 0; i < $name$_.size(); i++) {\n"
+                 "  $writeString$(output, $number$, $name$_.getRaw(i));\n"
+                 "}\n");
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
+void RepeatedImmutableStringFieldGenerator::GenerateSerializedSizeCode(
+    io::Printer* printer) const {
   printer->Print(variables_,
-    "{\n"
-    "  int dataSize = 0;\n");
+                 "{\n"
+                 "  int dataSize = 0;\n");
   printer->Indent();
 
   printer->Print(variables_,
-    "for (int i = 0; i < $name$_.size(); i++) {\n"
-    "  dataSize += computeStringSizeNoTag($name$_.getRaw(i));\n"
-    "}\n");
+                 "for (int i = 0; i < $name$_.size(); i++) {\n"
+                 "  dataSize += computeStringSizeNoTag($name$_.getRaw(i));\n"
+                 "}\n");
 
-  printer->Print(
-      "size += dataSize;\n");
+  printer->Print("size += dataSize;\n");
 
   printer->Print(variables_,
-    "size += $tag_size$ * get$capitalized_name$List().size();\n");
+                 "size += $tag_size$ * get$capitalized_name$List().size();\n");
 
   printer->Outdent();
   printer->Print("}\n");
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (!get$capitalized_name$List()\n"
-    "    .equals(other.get$capitalized_name$List())) return false;\n");
+void RepeatedImmutableStringFieldGenerator::GenerateEqualsCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if (!get$capitalized_name$List()\n"
+      "    .equals(other.get$capitalized_name$List())) return false;\n");
 }
 
-void RepeatedImmutableStringFieldGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (get$capitalized_name$Count() > 0) {\n"
-    "  hash = (37 * hash) + $constant_name$;\n"
-    "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
-    "}\n");
+void RepeatedImmutableStringFieldGenerator::GenerateHashCode(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "if (get$capitalized_name$Count() > 0) {\n"
+      "  hash = (37 * hash) + $constant_name$;\n"
+      "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
+      "}\n");
 }
 
 std::string RepeatedImmutableStringFieldGenerator::GetBoxedType() const {
diff --git a/src/google/protobuf/compiler/java/java_string_field_lite.cc b/src/google/protobuf/compiler/java/java_string_field_lite.cc
index c158872..5c94cb3 100644
--- a/src/google/protobuf/compiler/java/java_string_field_lite.cc
+++ b/src/google/protobuf/compiler/java/java_string_field_lite.cc
@@ -83,8 +83,8 @@
 
   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
   // by the proto compiler
-  (*variables)["deprecation"] = descriptor->options().deprecated()
-      ? "@java.lang.Deprecated " : "";
+  (*variables)["deprecation"] =
+      descriptor->options().deprecated() ? "@java.lang.Deprecated " : "";
   (*variables)["required"] = descriptor->is_required() ? "true" : "false";
 
   if (SupportFieldPresence(descriptor->file())) {
@@ -161,234 +161,164 @@
 
 // TODO(dweis): Consider dropping all of the *Bytes() methods. They really
 //     shouldn't be necessary or used on devices.
-void ImmutableStringFieldLiteGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void ImmutableStringFieldLiteGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
     printer->Print(variables_,
-      "$deprecation$boolean has$capitalized_name$();\n");
+                   "$deprecation$boolean has$capitalized_name$();\n");
   }
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.lang.String get$capitalized_name$();\n");
+                 "$deprecation$java.lang.String get$capitalized_name$();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$com.google.protobuf.ByteString\n"
-    "    get$capitalized_name$Bytes();\n");
+                 "$deprecation$com.google.protobuf.ByteString\n"
+                 "    get$capitalized_name$Bytes();\n");
 }
 
-void ImmutableStringFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private java.lang.String $name$_;\n");
+void ImmutableStringFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(variables_, "private java.lang.String $name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
 
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return $get_has_field_bit_message$;\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $get_has_field_bit_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
-    "  return $name$_;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
+      "  return $name$_;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
-    "  return com.google.protobuf.ByteString.copyFromUtf8($name$_);\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public com.google.protobuf.ByteString\n"
+      "    ${$get$capitalized_name$Bytes$}$() {\n"
+      "  return com.google.protobuf.ByteString.copyFromUtf8($name$_);\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$(\n"
-    "    java.lang.String value) {\n"
-    "$null_check$"
-    "  $set_has_field_bit_message$\n"
-    "  $name$_ = value;\n"
-    "}\n");
+                 "private void set$capitalized_name$(\n"
+                 "    java.lang.String value) {\n"
+                 "$null_check$"
+                 "  $set_has_field_bit_message$\n"
+                 "  $name$_ = value;\n"
+                 "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void clear$capitalized_name$() {\n"
-    "  $clear_has_field_bit_message$\n"
-    // The default value is not a simple literal so we want to avoid executing
-    // it multiple times.  Instead, get the default out of the default instance.
-    "  $name$_ = getDefaultInstance().get$capitalized_name$();\n"
-    "}\n");
+                 "private void clear$capitalized_name$() {\n"
+                 "  $clear_has_field_bit_message$\n"
+                 // The default value is not a simple literal so we want to
+                 // avoid executing it multiple times.  Instead, get the default
+                 // out of the default instance.
+                 "  $name$_ = getDefaultInstance().get$capitalized_name$();\n"
+                 "}\n");
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$Bytes(\n"
-    "    com.google.protobuf.ByteString value) {\n"
-    "$null_check$");
+                 "private void set$capitalized_name$Bytes(\n"
+                 "    com.google.protobuf.ByteString value) {\n"
+                 "$null_check$");
   if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "  checkByteStringIsUtf8(value);\n");
+    printer->Print(variables_, "  checkByteStringIsUtf8(value);\n");
   }
   printer->Print(variables_,
-    "  $set_has_field_bit_message$\n"
-    "  $name$_ = value.toStringUtf8();\n"
-    "}\n");
+                 "  $set_has_field_bit_message$\n"
+                 "  $name$_ = value.toStringUtf8();\n"
+                 "}\n");
 }
 
-void ImmutableStringFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void ImmutableStringFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return instance.has$capitalized_name$();\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return instance.has$capitalized_name$();\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
-    "  return instance.get$capitalized_name$();\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
+      "  return instance.get$capitalized_name$();\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
-    "  return instance.get$capitalized_name$Bytes();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$() {\n"
+                 "  return instance.get$capitalized_name$Bytes();\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    java.lang.String value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    java.lang.String value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  copyOnWrite();\n"
+      "  instance.clear$capitalized_name$();\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n"
-    "    com.google.protobuf.ByteString value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$Bytes(value);\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n"
+      "    com.google.protobuf.ByteString value) {\n"
+      "  copyOnWrite();\n"
+      "  instance.set$capitalized_name$Bytes(value);\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
-void ImmutableStringFieldLiteGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
-  // noop for strings
-}
-
-
-void ImmutableStringFieldLiteGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_ = $default$;\n");
-}
-
-void ImmutableStringFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
+void ImmutableStringFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
   if (SupportFieldPresence(descriptor_->file())) {
-    printer->Print(variables_,
-      "$name$_ = visitor.visitString(\n"
-      "    has$capitalized_name$(), $name$_,\n"
-      "    other.has$capitalized_name$(), other.$name$_);\n");
-  } else {
-    printer->Print(variables_,
-      "$name$_ = visitor.visitString(!$name$_.isEmpty(), $name$_,\n"
-      "    !other.$name$_.isEmpty(), other.$name$_);\n");
+    WriteIntToUtf16CharSequence(messageBitIndex_, output);
   }
+  printer->Print(variables_, "\"$name$_\",\n");
 }
 
-void ImmutableStringFieldLiteGenerator::
-GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const {
-  // noop for scalars
-}
-
-void ImmutableStringFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "java.lang.String s = input.readStringRequireUtf8();\n"
-      "$set_has_field_bit_message$\n"
-      "$name$_ = s;\n");
-  } else {
-    // Lite runtime should attempt to reduce allocations by attempting to
-    // construct the string directly from the input stream buffer. This avoids
-    // spurious intermediary ByteString allocations, cutting overall allocations
-    // in half.
-    printer->Print(variables_,
-      "java.lang.String s = input.readString();\n"
-      "$set_has_field_bit_message$\n"
-      "$name$_ = s;\n");
-  }
-}
-
-void ImmutableStringFieldLiteGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  // noop for strings
-}
-
-void ImmutableStringFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  // Lite runtime should reduce allocations by serializing the string directly.
-  // This avoids spurious intermediary ByteString allocations, cutting overall
-  // allocations in half.
-  printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  output.writeString($number$, get$capitalized_name$());\n"
-    "}\n");
-}
-
-void ImmutableStringFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  // Lite runtime should reduce allocations by computing on the string directly.
-  // This avoids spurious intermediary ByteString allocations, cutting overall
-  // allocations in half.
-  printer->Print(variables_,
-    "if ($is_field_present_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .computeStringSize($number$, get$capitalized_name$());\n"
-    "}\n");
-}
-
-void ImmutableStringFieldLiteGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "result = result && get$capitalized_name$()\n"
-    "    .equals(other.get$capitalized_name$());\n");
-}
-
-void ImmutableStringFieldLiteGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "hash = (37 * hash) + $constant_name$;\n");
-  printer->Print(variables_,
-    "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
+void ImmutableStringFieldLiteGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
+  printer->Print(variables_, "$name$_ = $default$;\n");
 }
 
 std::string ImmutableStringFieldLiteGenerator::GetBoxedType() const {
@@ -406,188 +336,151 @@
 }
 
 ImmutableStringOneofFieldLiteGenerator::
-~ImmutableStringOneofFieldLiteGenerator() {}
+    ~ImmutableStringOneofFieldLiteGenerator() {}
 
-void ImmutableStringOneofFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
+void ImmutableStringOneofFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
   PrintExtraFieldInfo(variables_, printer);
 
   if (SupportFieldPresence(descriptor_->file())) {
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-    "  return $has_oneof_case_message$;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  }
-
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
-    "  java.lang.String ref $default_init$;\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    ref = (java.lang.String) $oneof_name$_;\n"
-    "  }\n"
-    "  return ref;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
-    "  java.lang.String ref $default_init$;\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    ref = (java.lang.String) $oneof_name$_;\n"
-    "  }\n"
-    "  return com.google.protobuf.ByteString.copyFromUtf8(ref);\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void ${$set$capitalized_name$$}$(\n"
-    "    java.lang.String value) {\n"
-    "$null_check$"
-    "  $set_oneof_case_message$;\n"
-    "  $oneof_name$_ = value;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void ${$clear$capitalized_name$$}$() {\n"
-    "  if ($has_oneof_case_message$) {\n"
-    "    $clear_oneof_case_message$;\n"
-    "    $oneof_name$_ = null;\n"
-    "  }\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "private void ${$set$capitalized_name$Bytes$}$(\n"
-    "    com.google.protobuf.ByteString value) {\n"
-    "$null_check$");
-  printer->Annotate("{", "}", descriptor_);
-  if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "  checkByteStringIsUtf8(value);\n");
-  }
-  printer->Print(variables_,
-    "  $set_oneof_case_message$;\n"
-    "  $oneof_name$_ = value.toStringUtf8();\n"
-    "}\n");
-}
-
-
-void ImmutableStringOneofFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
-  if (SupportFieldPresence(descriptor_->file())) {
     WriteFieldDocComment(printer, descriptor_);
-    printer->Print(variables_,
-      "@java.lang.Override\n"
-      "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
-      "  return instance.has$capitalized_name$();\n"
-      "}\n");
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return $has_oneof_case_message$;\n"
+        "}\n");
     printer->Annotate("{", "}", descriptor_);
   }
 
   WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
+      "  java.lang.String ref $default_init$;\n"
+      "  if ($has_oneof_case_message$) {\n"
+      "    ref = (java.lang.String) $oneof_name$_;\n"
+      "  }\n"
+      "  return ref;\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
-    "  return instance.get$capitalized_name$();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$() {\n"
+                 "  java.lang.String ref $default_init$;\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    ref = (java.lang.String) $oneof_name$_;\n"
+                 "  }\n"
+                 "  return com.google.protobuf.ByteString.copyFromUtf8(ref);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$() {\n"
-    "  return instance.get$capitalized_name$Bytes();\n"
-    "}\n");
+                 "private void ${$set$capitalized_name$$}$(\n"
+                 "    java.lang.String value) {\n"
+                 "$null_check$"
+                 "  $set_oneof_case_message$;\n"
+                 "  $oneof_name$_ = value;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "private void ${$clear$capitalized_name$$}$() {\n"
+                 "  if ($has_oneof_case_message$) {\n"
+                 "    $clear_oneof_case_message$;\n"
+                 "    $oneof_name$_ = null;\n"
+                 "  }\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    java.lang.String value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
+                 "private void ${$set$capitalized_name$Bytes$}$(\n"
+                 "    com.google.protobuf.ByteString value) {\n"
+                 "$null_check$");
   printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n"
-    "    com.google.protobuf.ByteString value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$Bytes(value);\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-}
-
-void ImmutableStringOneofFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$oneof_name$_ = visitor.visitOneofString(\n"
-    "   $has_oneof_case_message$, $oneof_name$_, other.$oneof_name$_);\n");
-}
-
-void ImmutableStringOneofFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
   if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "java.lang.String s = input.readStringRequireUtf8();\n"
-      "$set_oneof_case_message$;\n"
-      "$oneof_name$_ = s;\n");
-  } else {
-    // Lite runtime should attempt to reduce allocations by attempting to
-    // construct the string directly from the input stream buffer. This avoids
-    // spurious intermediary ByteString allocations, cutting overall allocations
-    // in half.
-    printer->Print(variables_,
-      "java.lang.String s = input.readString();\n"
-      "$set_oneof_case_message$;\n"
-      "$oneof_name$_ = s;\n");
+    printer->Print(variables_, "  checkByteStringIsUtf8(value);\n");
   }
+  printer->Print(variables_,
+                 "  $set_oneof_case_message$;\n"
+                 "  $oneof_name$_ = value.toStringUtf8();\n"
+                 "}\n");
 }
 
-void ImmutableStringOneofFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  // Lite runtime should reduce allocations by serializing the string directly.
-  // This avoids spurious intermediary ByteString allocations, cutting overall
-  // allocations in half.
-  printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  output.writeString($number$, get$capitalized_name$());\n"
-    "}\n");
+void ImmutableStringOneofFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
+  WriteIntToUtf16CharSequence(descriptor_->containing_oneof()->index(), output);
 }
 
-void ImmutableStringOneofFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  // Lite runtime should reduce allocations by computing on the string directly.
-  // This avoids spurious intermediary ByteString allocations, cutting overall
-  // allocations in half.
+void ImmutableStringOneofFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
+  if (SupportFieldPresence(descriptor_->file())) {
+    WriteFieldDocComment(printer, descriptor_);
+    printer->Print(
+        variables_,
+        "@java.lang.Override\n"
+        "$deprecation$public boolean ${$has$capitalized_name$$}$() {\n"
+        "  return instance.has$capitalized_name$();\n"
+        "}\n");
+    printer->Annotate("{", "}", descriptor_);
+  }
+
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public java.lang.String ${$get$capitalized_name$$}$() {\n"
+      "  return instance.get$capitalized_name$();\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+
+  WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "if ($has_oneof_case_message$) {\n"
-    "  size += com.google.protobuf.CodedOutputStream\n"
-    "    .computeStringSize($number$, get$capitalized_name$());\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$() {\n"
+                 "  return instance.get$capitalized_name$Bytes();\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(variables_,
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    java.lang.String value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  copyOnWrite();\n"
+      "  instance.clear$capitalized_name$();\n"
+      "  return this;\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
+
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$set$capitalized_name$Bytes$}$(\n"
+      "    com.google.protobuf.ByteString value) {\n"
+      "  copyOnWrite();\n"
+      "  instance.set$capitalized_name$Bytes(value);\n"
+      "  return this;\n"
+      "}\n");
+  printer->Annotate("{", "}", descriptor_);
 }
 
 // ===================================================================
@@ -606,311 +499,227 @@
 }
 
 RepeatedImmutableStringFieldLiteGenerator::
-~RepeatedImmutableStringFieldLiteGenerator() {}
+    ~RepeatedImmutableStringFieldLiteGenerator() {}
 
 int RepeatedImmutableStringFieldLiteGenerator::GetNumBitsForMessage() const {
   return 0;
 }
 
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateInterfaceMembers(io::Printer* printer) const {
+void RepeatedImmutableStringFieldLiteGenerator::GenerateInterfaceMembers(
+    io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.util.List<java.lang.String>\n"
-    "    get$capitalized_name$List();\n");
+                 "$deprecation$java.util.List<java.lang.String>\n"
+                 "    get$capitalized_name$List();\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$int get$capitalized_name$Count();\n");
+                 "$deprecation$int get$capitalized_name$Count();\n");
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "$deprecation$java.lang.String get$capitalized_name$(int index);\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$java.lang.String get$capitalized_name$(int index);\n");
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$com.google.protobuf.ByteString\n"
-    "    get$capitalized_name$Bytes(int index);\n");
+                 "$deprecation$com.google.protobuf.ByteString\n"
+                 "    get$capitalized_name$Bytes(int index);\n");
 }
 
-
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateMembers(io::Printer* printer) const {
-  printer->Print(variables_,
-    "private com.google.protobuf.Internal.ProtobufList<java.lang.String> "
-    "$name$_;\n");
+void RepeatedImmutableStringFieldLiteGenerator::GenerateMembers(
+    io::Printer* printer) const {
+  printer->Print(
+      variables_,
+      "private com.google.protobuf.Internal.ProtobufList<java.lang.String> "
+      "$name$_;\n");
   PrintExtraFieldInfo(variables_, printer);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.util.List<java.lang.String> "
-    "${$get$capitalized_name$List$}$() {\n"
-    "  return $name$_;\n"  // note:  unmodifiable list
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public java.util.List<java.lang.String> "
+                 "${$get$capitalized_name$List$}$() {\n"
+                 "  return $name$_;\n"  // note:  unmodifiable list
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return $name$_.size();\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return $name$_.size();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public java.lang.String "
+                 "${$get$capitalized_name$$}$(int index) {\n"
+                 "  return $name$_.get(index);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.lang.String "
-    "${$get$capitalized_name$$}$(int index) {\n"
-    "  return $name$_.get(index);\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$(int index) {\n"
-    "  return com.google.protobuf.ByteString.copyFromUtf8(\n"
-    "      $name$_.get(index));\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$(int index) {\n"
+                 "  return com.google.protobuf.ByteString.copyFromUtf8(\n"
+                 "      $name$_.get(index));\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
 
-  printer->Print(variables_,
-    "private void ensure$capitalized_name$IsMutable() {\n"
-    "  if (!$is_mutable$) {\n"
-    "    $name$_ =\n"
-    "        com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
-    "   }\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "private void ensure$capitalized_name$IsMutable() {\n"
+      "  if (!$is_mutable$) {\n"
+      "    $name$_ =\n"
+      "        com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
+      "   }\n"
+      "}\n");
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void set$capitalized_name$(\n"
-    "    int index, java.lang.String value) {\n"
-    "$null_check$"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.set(index, value);\n"
-    "}\n");
+                 "private void set$capitalized_name$(\n"
+                 "    int index, java.lang.String value) {\n"
+                 "$null_check$"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.set(index, value);\n"
+                 "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void add$capitalized_name$(\n"
-    "    java.lang.String value) {\n"
-    "$null_check$"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.add(value);\n"
-    "}\n");
+                 "private void add$capitalized_name$(\n"
+                 "    java.lang.String value) {\n"
+                 "$null_check$"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.add(value);\n"
+                 "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void addAll$capitalized_name$(\n"
-    "    java.lang.Iterable<java.lang.String> values) {\n"
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  com.google.protobuf.AbstractMessageLite.addAll(\n"
-    "      values, $name$_);\n"
-    "}\n");
+                 "private void addAll$capitalized_name$(\n"
+                 "    java.lang.Iterable<java.lang.String> values) {\n"
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  com.google.protobuf.AbstractMessageLite.addAll(\n"
+                 "      values, $name$_);\n"
+                 "}\n");
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void clear$capitalized_name$() {\n"
-    "  $name$_ = $empty_list$;\n"
-    "}\n");
+                 "private void clear$capitalized_name$() {\n"
+                 "  $name$_ = $empty_list$;\n"
+                 "}\n");
 
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "private void add$capitalized_name$Bytes(\n"
-    "    com.google.protobuf.ByteString value) {\n"
-    "$null_check$");
+                 "private void add$capitalized_name$Bytes(\n"
+                 "    com.google.protobuf.ByteString value) {\n"
+                 "$null_check$");
   if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "  checkByteStringIsUtf8(value);\n");
+    printer->Print(variables_, "  checkByteStringIsUtf8(value);\n");
   }
   printer->Print(variables_,
-    "  ensure$capitalized_name$IsMutable();\n"
-    "  $name$_.add(value.toStringUtf8());\n"
-    "}\n");
+                 "  ensure$capitalized_name$IsMutable();\n"
+                 "  $name$_.add(value.toStringUtf8());\n"
+                 "}\n");
 }
 
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateBuilderMembers(io::Printer* printer) const {
+void RepeatedImmutableStringFieldLiteGenerator::GenerateBuilderMembers(
+    io::Printer* printer) const {
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.util.List<java.lang.String>\n"
-    "    ${$get$capitalized_name$List$}$() {\n"
-    "  return java.util.Collections.unmodifiableList(\n"
-    "      instance.get$capitalized_name$List());\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public java.util.List<java.lang.String>\n"
+                 "    ${$get$capitalized_name$List$}$() {\n"
+                 "  return java.util.Collections.unmodifiableList(\n"
+                 "      instance.get$capitalized_name$List());\n"
+                 "}\n");
+  printer->Annotate("{", "}", descriptor_);
+  WriteFieldDocComment(printer, descriptor_);
+  printer->Print(
+      variables_,
+      "@java.lang.Override\n"
+      "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
+      "  return instance.get$capitalized_name$Count();\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public int ${$get$capitalized_name$Count$}$() {\n"
-    "  return instance.get$capitalized_name$Count();\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public java.lang.String "
+                 "${$get$capitalized_name$$}$(int index) {\n"
+                 "  return instance.get$capitalized_name$(index);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public java.lang.String "
-    "${$get$capitalized_name$$}$(int index) {\n"
-    "  return instance.get$capitalized_name$(index);\n"
-    "}\n");
+                 "@java.lang.Override\n"
+                 "$deprecation$public com.google.protobuf.ByteString\n"
+                 "    ${$get$capitalized_name$Bytes$}$(int index) {\n"
+                 "  return instance.get$capitalized_name$Bytes(index);\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "@java.lang.Override\n"
-    "$deprecation$public com.google.protobuf.ByteString\n"
-    "    ${$get$capitalized_name$Bytes$}$(int index) {\n"
-    "  return instance.get$capitalized_name$Bytes(index);\n"
-    "}\n");
+                 "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
+                 "    int index, java.lang.String value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.set$capitalized_name$(index, value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$set$capitalized_name$$}$(\n"
-    "    int index, java.lang.String value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.set$capitalized_name$(index, value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
+                 "    java.lang.String value) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.add$capitalized_name$(value);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
   printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$$}$(\n"
-    "    java.lang.String value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.add$capitalized_name$(value);\n"
-    "  return this;\n"
-    "}\n");
+                 "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
+                 "    java.lang.Iterable<java.lang.String> values) {\n"
+                 "  copyOnWrite();\n"
+                 "  instance.addAll$capitalized_name$(values);\n"
+                 "  return this;\n"
+                 "}\n");
   printer->Annotate("{", "}", descriptor_);
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$addAll$capitalized_name$$}$(\n"
-    "    java.lang.Iterable<java.lang.String> values) {\n"
-    "  copyOnWrite();\n"
-    "  instance.addAll$capitalized_name$(values);\n"
-    "  return this;\n"
-    "}\n");
-  printer->Annotate("{", "}", descriptor_);
-  WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
-    "  copyOnWrite();\n"
-    "  instance.clear$capitalized_name$();\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$clear$capitalized_name$$}$() {\n"
+      "  copyOnWrite();\n"
+      "  instance.clear$capitalized_name$();\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 
   WriteFieldDocComment(printer, descriptor_);
-  printer->Print(variables_,
-    "$deprecation$public Builder ${$add$capitalized_name$Bytes$}$(\n"
-    "    com.google.protobuf.ByteString value) {\n"
-    "  copyOnWrite();\n"
-    "  instance.add$capitalized_name$Bytes(value);\n"
-    "  return this;\n"
-    "}\n");
+  printer->Print(
+      variables_,
+      "$deprecation$public Builder ${$add$capitalized_name$Bytes$}$(\n"
+      "    com.google.protobuf.ByteString value) {\n"
+      "  copyOnWrite();\n"
+      "  instance.add$capitalized_name$Bytes(value);\n"
+      "  return this;\n"
+      "}\n");
   printer->Annotate("{", "}", descriptor_);
 }
 
 void RepeatedImmutableStringFieldLiteGenerator::
-GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
+    GenerateFieldBuilderInitializationCode(io::Printer* printer) const {
   // noop for strings
 }
 
+void RepeatedImmutableStringFieldLiteGenerator::GenerateFieldInfo(
+    io::Printer* printer, std::vector<uint16>* output) const {
+  WriteIntToUtf16CharSequence(descriptor_->number(), output);
+  WriteIntToUtf16CharSequence(GetExperimentalJavaFieldType(descriptor_),
+                              output);
+  printer->Print(variables_, "\"$name$_\",\n");
+}
 
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateInitializationCode(io::Printer* printer) const {
+void RepeatedImmutableStringFieldLiteGenerator::GenerateInitializationCode(
+    io::Printer* printer) const {
   printer->Print(variables_, "$name$_ = $empty_list$;\n");
 }
 
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateVisitCode(io::Printer* printer) const {
-  printer->Print(variables_,
-      "$name$_= visitor.visitList($name$_, other.$name$_);\n");
-}
-
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "$name$_.makeImmutable();\n");
-}
-
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateParsingCode(io::Printer* printer) const {
-  if (CheckUtf8(descriptor_)) {
-    printer->Print(variables_,
-      "java.lang.String s = input.readStringRequireUtf8();\n");
-  } else {
-    // Lite runtime should attempt to reduce allocations by attempting to
-    // construct the string directly from the input stream buffer. This avoids
-    // spurious intermediary ByteString allocations, cutting overall allocations
-    // in half.
-    printer->Print(variables_,
-      "java.lang.String s = input.readString();\n");
-  }
-  printer->Print(variables_,
-    "if (!$is_mutable$) {\n"
-    "  $name$_ =\n"
-    "      com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n"
-    "}\n");
-  printer->Print(variables_,
-    "$name$_.add(s);\n");
-}
-
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateParsingDoneCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if ($is_mutable$) {\n"
-    "  $name$_.makeImmutable();\n"
-    "}\n");
-}
-
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateSerializationCode(io::Printer* printer) const {
-  // Lite runtime should reduce allocations by serializing the string directly.
-  // This avoids spurious intermediary ByteString allocations, cutting overall
-  // allocations in half.
-  printer->Print(variables_,
-    "for (int i = 0; i < $name$_.size(); i++) {\n"
-    "  output.writeString($number$, $name$_.get(i));\n"
-    "}\n");
-}
-
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateSerializedSizeCode(io::Printer* printer) const {
-  // Lite runtime should reduce allocations by computing on the string directly.
-  // This avoids spurious intermediary ByteString allocations, cutting overall
-  // allocations in half.
-  printer->Print(variables_,
-    "{\n"
-    "  int dataSize = 0;\n");
-  printer->Indent();
-
-  printer->Print(variables_,
-    "for (int i = 0; i < $name$_.size(); i++) {\n"
-    "  dataSize += com.google.protobuf.CodedOutputStream\n"
-    "    .computeStringSizeNoTag($name$_.get(i));\n"
-    "}\n");
-
-  printer->Print(
-      "size += dataSize;\n");
-
-
-  printer->Print(variables_,
-    "size += $tag_size$ * get$capitalized_name$List().size();\n");
-
-  printer->Outdent();
-  printer->Print("}\n");
-}
-
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateEqualsCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "result = result && get$capitalized_name$List()\n"
-    "    .equals(other.get$capitalized_name$List());\n");
-}
-
-void RepeatedImmutableStringFieldLiteGenerator::
-GenerateHashCode(io::Printer* printer) const {
-  printer->Print(variables_,
-    "if (get$capitalized_name$Count() > 0) {\n"
-    "  hash = (37 * hash) + $constant_name$;\n"
-    "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
-    "}\n");
-}
-
 std::string RepeatedImmutableStringFieldLiteGenerator::GetBoxedType() const {
   return "java.lang.String";
 }
diff --git a/src/google/protobuf/compiler/java/java_string_field_lite.h b/src/google/protobuf/compiler/java/java_string_field_lite.h
index 89d5c1a..960f468 100644
--- a/src/google/protobuf/compiler/java/java_string_field_lite.h
+++ b/src/google/protobuf/compiler/java/java_string_field_lite.h
@@ -70,16 +70,8 @@
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
   void GenerateInitializationCode(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateParsingDoneCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-  void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;
-  void GenerateEqualsCode(io::Printer* printer) const;
-  void GenerateHashCode(io::Printer* printer) const;
-
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
   std::string GetBoxedType() const;
 
@@ -104,11 +96,8 @@
  private:
   void GenerateMembers(io::Printer* printer) const;
   void GenerateBuilderMembers(io::Printer* printer) const;
-  void GenerateVisitCode(io::Printer* printer) const;
-  void GenerateParsingCode(io::Printer* printer) const;
-  void GenerateSerializationCode(io::Printer* printer) const;
-  void GenerateSerializedSizeCode(io::Printer* printer) const;
-
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ImmutableStringOneofFieldLiteGenerator);
 };
@@ -135,7 +124,8 @@
   void GenerateFieldBuilderInitializationCode(io::Printer* printer) const;
   void GenerateEqualsCode(io::Printer* printer) const;
   void GenerateHashCode(io::Printer* printer) const;
-
+  void GenerateFieldInfo(io::Printer* printer,
+                         std::vector<uint16>* output) const;
 
   std::string GetBoxedType() const;
 
diff --git a/src/google/protobuf/compiler/js/js_generator.cc b/src/google/protobuf/compiler/js/js_generator.cc
index e00637e..7b12dde 100644
--- a/src/google/protobuf/compiler/js/js_generator.cc
+++ b/src/google/protobuf/compiler/js/js_generator.cc
@@ -60,64 +60,18 @@
 // Sorted list of JavaScript keywords. These cannot be used as names. If they
 // appear, we prefix them with "pb_".
 const char* kKeyword[] = {
-  "abstract",
-  "boolean",
-  "break",
-  "byte",
-  "case",
-  "catch",
-  "char",
-  "class",
-  "const",
-  "continue",
-  "debugger",
-  "default",
-  "delete",
-  "do",
-  "double",
-  "else",
-  "enum",
-  "export",
-  "extends",
-  "false",
-  "final",
-  "finally",
-  "float",
-  "for",
-  "function",
-  "goto",
-  "if",
-  "implements",
-  "import",
-  "in",
-  "instanceof",
-  "int",
-  "interface",
-  "long",
-  "native",
-  "new",
-  "null",
-  "package",
-  "private",
-  "protected",
-  "public",
-  "return",
-  "short",
-  "static",
-  "super",
-  "switch",
-  "synchronized",
-  "this",
-  "throw",
-  "throws",
-  "transient",
-  "try",
-  "typeof",
-  "var",
-  "void",
-  "volatile",
-  "while",
-  "with",
+    "abstract",   "boolean",      "break",      "byte",    "case",
+    "catch",      "char",         "class",      "const",   "continue",
+    "debugger",   "default",      "delete",     "do",      "double",
+    "else",       "enum",         "export",     "extends", "false",
+    "final",      "finally",      "float",      "for",     "function",
+    "goto",       "if",           "implements", "import",  "in",
+    "instanceof", "int",          "interface",  "long",    "native",
+    "new",        "null",         "package",    "private", "protected",
+    "public",     "return",       "short",      "static",  "super",
+    "switch",     "synchronized", "this",       "throw",   "throws",
+    "transient",  "try",          "typeof",     "var",     "void",
+    "volatile",   "while",        "with",
 };
 
 static const int kNumKeyword = sizeof(kKeyword) / sizeof(char*);
@@ -429,8 +383,8 @@
                                  bool with_filename) {
   std::string snake_name = StripProto(GetSnakeFilename(file->name()));
   return options.output_dir + "/" + ToLower(GetNamespace(options, file)) +
-      (with_filename ? ("_" + snake_name + "_extensions") : "") +
-      options.GetFileNameExtension();
+         (with_filename ? ("_" + snake_name + "_extensions") : "") +
+         options.GetFileNameExtension();
 }
 // When we're generating one output file per SCC, this is the filename
 // that all messages in the SCC should go in.
@@ -468,7 +422,7 @@
           GetSnakeFilename(scc->GetRepresentative()->file()->name()));
       (*long_name_dict)[scc->GetRepresentative()] =
           StrCat(snake_name, "_long_sccs_",
-              static_cast<uint64>((*long_name_dict).size()));
+                       static_cast<uint64>((*long_name_dict).size()));
     }
     filename_base = (*long_name_dict)[scc->GetRepresentative()];
   }
@@ -482,11 +436,9 @@
 std::string GetEnumFileName(const GeneratorOptions& options,
                             const EnumDescriptor* desc, bool with_package) {
   return options.output_dir + "/" +
-         (with_package
-              ? ToLower(GetNamespace(options, desc->file()) + "_")
-              : "") +
-         ToLower(desc->name()) +
-         options.GetFileNameExtension();
+         (with_package ? ToLower(GetNamespace(options, desc->file()) + "_")
+                       : "") +
+         ToLower(desc->name()) + options.GetFileNameExtension();
 }
 
 // Returns the message/response ID, if set.
@@ -513,9 +465,7 @@
 
 
 // Do we ignore this message type?
-bool IgnoreMessage(const Descriptor* d) {
-  return d->options().map_entry();
-}
+bool IgnoreMessage(const Descriptor* d) { return d->options().map_entry(); }
 
 // Does JSPB ignore this entire oneof? True only if all fields are ignored.
 bool IgnoreOneof(const OneofDescriptor* oneof) {
@@ -532,13 +482,12 @@
                     bool is_map, bool drop_list) {
   std::string result;
   if (field->type() == FieldDescriptor::TYPE_GROUP) {
-    result = is_upper_camel ?
-        ToUpperCamel(ParseUpperCamel(field->message_type()->name())) :
-        ToLowerCamel(ParseUpperCamel(field->message_type()->name()));
+    result = is_upper_camel
+                 ? ToUpperCamel(ParseUpperCamel(field->message_type()->name()))
+                 : ToLowerCamel(ParseUpperCamel(field->message_type()->name()));
   } else {
-    result = is_upper_camel ?
-        ToUpperCamel(ParseLowerUnderscore(field->name())) :
-        ToLowerCamel(ParseLowerUnderscore(field->name()));
+    result = is_upper_camel ? ToUpperCamel(ParseLowerUnderscore(field->name()))
+                            : ToLowerCamel(ParseLowerUnderscore(field->name()));
   }
   if (is_map || field->is_map()) {
     // JSPB-style or proto3-style map.
@@ -670,13 +619,15 @@
 
   *length = expected;
   switch (expected) {
-    case 1: return bytes[0];
-    case 2: return ((bytes[0] & 0x1F) << 6)  |
-                   ((bytes[1] & 0x3F) << 0);
-    case 3: return ((bytes[0] & 0x0F) << 12) |
-                   ((bytes[1] & 0x3F) << 6)  |
-                   ((bytes[2] & 0x3F) << 0);
-    default: return 0;
+    case 1:
+      return bytes[0];
+    case 2:
+      return ((bytes[0] & 0x1F) << 6) | ((bytes[1] & 0x3F) << 0);
+    case 3:
+      return ((bytes[0] & 0x0F) << 12) | ((bytes[1] & 0x3F) << 6) |
+             ((bytes[2] & 0x3F) << 0);
+    default:
+      return 0;
   }
 }
 
@@ -703,18 +654,42 @@
     decoded = have_bytes;
 
     switch (codepoint) {
-      case '\'': *out += "\\x27"; break;
-      case '"': *out += "\\x22"; break;
-      case '<': *out += "\\x3c"; break;
-      case '=': *out += "\\x3d"; break;
-      case '>': *out += "\\x3e"; break;
-      case '&': *out += "\\x26"; break;
-      case '\b': *out += "\\b"; break;
-      case '\t': *out += "\\t"; break;
-      case '\n': *out += "\\n"; break;
-      case '\f': *out += "\\f"; break;
-      case '\r': *out += "\\r"; break;
-      case '\\': *out += "\\\\"; break;
+      case '\'':
+        *out += "\\x27";
+        break;
+      case '"':
+        *out += "\\x22";
+        break;
+      case '<':
+        *out += "\\x3c";
+        break;
+      case '=':
+        *out += "\\x3d";
+        break;
+      case '>':
+        *out += "\\x3e";
+        break;
+      case '&':
+        *out += "\\x26";
+        break;
+      case '\b':
+        *out += "\\b";
+        break;
+      case '\t':
+        *out += "\\t";
+        break;
+      case '\n':
+        *out += "\\n";
+        break;
+      case '\f':
+        *out += "\\f";
+        break;
+      case '\r':
+        *out += "\\r";
+        break;
+      case '\\':
+        *out += "\\\\";
+        break;
       default:
         // TODO(b/115551870): Once we're supporting codepoints outside the BMP,
         // use a single Unicode codepoint escape if the output language is
@@ -739,18 +714,17 @@
   std::string result;
 
   for (size_t i = 0; i < in.size(); i += 3) {
-    int value = (in[i] << 16) |
-        (((i + 1) < in.size()) ? (in[i + 1] << 8) : 0) |
-        (((i + 2) < in.size()) ? (in[i + 2] << 0) : 0);
+    int value = (in[i] << 16) | (((i + 1) < in.size()) ? (in[i + 1] << 8) : 0) |
+                (((i + 2) < in.size()) ? (in[i + 2] << 0) : 0);
     result += kAlphabet[(value >> 18) & 0x3f];
     result += kAlphabet[(value >> 12) & 0x3f];
     if ((i + 1) < in.size()) {
-      result += kAlphabet[(value >>  6) & 0x3f];
+      result += kAlphabet[(value >> 6) & 0x3f];
     } else {
       result += '=';
     }
     if ((i + 2) < in.size()) {
-      result += kAlphabet[(value >>  0) & 0x3f];
+      result += kAlphabet[(value >> 0) & 0x3f];
     } else {
       result += '=';
     }
@@ -1259,7 +1233,7 @@
 std::string JSOneofArray(const GeneratorOptions& options,
                          const FieldDescriptor* field) {
   return OneofFieldsArrayName(options, field->containing_type()) + "[" +
-      JSOneofIndex(field->containing_oneof()) + "]";
+         JSOneofIndex(field->containing_oneof()) + "]";
 }
 
 std::string RelativeTypeName(const FieldDescriptor* field) {
@@ -1326,10 +1300,8 @@
     } else {
       value_type = ProtoTypeName(options, value_field);
     }
-    return StringPrintf("map<%s, %s> %s = %d;",
-                        key_type.c_str(),
-                        value_type.c_str(),
-                        field->name().c_str(),
+    return StringPrintf("map<%s, %s> %s = %d;", key_type.c_str(),
+                        value_type.c_str(), field->name().c_str(),
                         field->number());
   } else {
     std::string qualifier =
@@ -1347,11 +1319,8 @@
       type = ProtoTypeName(options, field);
       name = field->name();
     }
-    return StringPrintf("%s %s %s = %d;",
-                        qualifier.c_str(),
-                        type.c_str(),
-                        name.c_str(),
-                        field->number());
+    return StringPrintf("%s %s %s = %d;", qualifier.c_str(), type.c_str(),
+                        name.c_str(), field->number());
   }
 }
 
@@ -1366,9 +1335,7 @@
 }
 
 bool ShouldGenerateExtension(const FieldDescriptor* field) {
-  return
-      field->is_extension() &&
-      !IgnoreField(field);
+  return field->is_extension() && !IgnoreField(field);
 }
 
 bool HasExtensions(const Descriptor* desc) {
@@ -1442,8 +1409,8 @@
 
   int pivot = -1;
   if (IsExtendable(desc) || (max_field_number >= kDefaultPivot)) {
-    pivot = ((max_field_number + 1) < kDefaultPivot) ?
-        (max_field_number + 1) : kDefaultPivot;
+    pivot = ((max_field_number + 1) < kDefaultPivot) ? (max_field_number + 1)
+                                                     : kDefaultPivot;
   }
 
   return StrCat(pivot);
@@ -1618,23 +1585,20 @@
   for (int i = 0; i < files_ordered.size(); i++) {
     for (int j = 0; j < files_ordered[i]->message_type_count(); j++) {
       const Descriptor* desc = files_ordered[i]->message_type(j);
-      if (added.insert(analyzer->GetSCC(desc)).second && !dedup.AddFile(
-          std::make_pair(
-            GetMessagesFileName(options, analyzer->GetSCC(desc), false),
-            GetMessagesFileName(options, analyzer->GetSCC(desc), true)),
-          analyzer->GetSCC(desc),
-          error)) {
+      if (added.insert(analyzer->GetSCC(desc)).second &&
+          !dedup.AddFile(
+              std::make_pair(
+                  GetMessagesFileName(options, analyzer->GetSCC(desc), false),
+                  GetMessagesFileName(options, analyzer->GetSCC(desc), true)),
+              analyzer->GetSCC(desc), error)) {
         return false;
       }
     }
     for (int j = 0; j < files_ordered[i]->enum_type_count(); j++) {
       const EnumDescriptor* desc = files_ordered[i]->enum_type(j);
-      if (!dedup.AddFile(
-          std::make_pair(
-            GetEnumFileName(options, desc, false),
-            GetEnumFileName(options, desc, true)),
-          desc,
-          error)) {
+      if (!dedup.AddFile(std::make_pair(GetEnumFileName(options, desc, false),
+                                        GetEnumFileName(options, desc, true)),
+                         desc, error)) {
         return false;
       }
     }
@@ -1650,10 +1614,10 @@
 
     if (has_extension) {
       if (!dedup.AddFile(
-          std::make_pair(
-              GetExtensionFileName(options, files_ordered[i], false),
-              GetExtensionFileName(options, files_ordered[i], true)),
-          files_ordered[i], error)) {
+              std::make_pair(
+                  GetExtensionFileName(options, files_ordered[i], false),
+                  GetExtensionFileName(options, files_ordered[i], true)),
+              files_ordered[i], error)) {
         return false;
       }
     }
@@ -1688,17 +1652,18 @@
 
 void Generator::GenerateHeader(const GeneratorOptions& options,
                                io::Printer* printer) const {
-  printer->Print("/**\n"
-                 " * @fileoverview\n"
-                 " * @enhanceable\n"
-                 " * @suppress {messageConventions} JS Compiler reports an "
-                 "error if a variable or\n"
-                 " *     field starts with 'MSG_' and isn't a translatable "
-                 "message.\n"
-                 " * @public\n"
-                 " */\n"
-                 "// GENERATED CODE -- DO NOT EDIT!\n"
-                 "\n");
+  printer->Print(
+      "/**\n"
+      " * @fileoverview\n"
+      " * @enhanceable\n"
+      " * @suppress {messageConventions} JS Compiler reports an "
+      "error if a variable or\n"
+      " *     field starts with 'MSG_' and isn't a translatable "
+      "message.\n"
+      " * @public\n"
+      " */\n"
+      "// GENERATED CODE -- DO NOT EDIT!\n"
+      "\n");
 }
 
 void Generator::FindProvidesForFile(const GeneratorOptions& options,
@@ -1736,12 +1701,10 @@
   provided->insert(name);
 
   for (int i = 0; i < desc->enum_type_count(); i++) {
-    FindProvidesForEnum(options, printer, desc->enum_type(i),
-                        provided);
+    FindProvidesForEnum(options, printer, desc->enum_type(i), provided);
   }
   for (int i = 0; i < desc->nested_type_count(); i++) {
-    FindProvidesForMessage(options, printer, desc->nested_type(i),
-                           provided);
+    FindProvidesForMessage(options, printer, desc->nested_type(i), provided);
   }
 }
 
@@ -1820,9 +1783,9 @@
   }
 
   GenerateRequiresImpl(options, printer, &required, &forwards, provided,
-      /* require_jspb = */ have_message,
-      /* require_extension = */ has_extension,
-      /* require_map = */ has_map);
+                       /* require_jspb = */ have_message,
+                       /* require_extension = */ has_extension,
+                       /* require_map = */ has_map);
 }
 
 void Generator::GenerateRequiresForLibrary(
@@ -1860,7 +1823,7 @@
         continue;
       }
       if (extension->containing_type()->full_name() !=
-        "google.protobuf.bridge.MessageSet") {
+          "google.protobuf.bridge.MessageSet") {
         required.insert(GetMessagePath(options, extension->containing_type()));
       }
       FindRequiresForField(options, extension, &required, &forwards);
@@ -1919,8 +1882,7 @@
     if (provided->find(*it) != provided->end()) {
       continue;
     }
-    printer->Print("goog.require('$name$');\n",
-                   "name", *it);
+    printer->Print("goog.require('$name$');\n", "name", *it);
   }
 
   printer->Print("\n");
@@ -1929,8 +1891,7 @@
     if (provided->find(*it) != provided->end()) {
       continue;
     }
-    printer->Print("goog.forwardDeclare('$name$');\n",
-                   "name", *it);
+    printer->Print("goog.forwardDeclare('$name$');\n", "name", *it);
   }
 }
 
@@ -2010,8 +1971,8 @@
                                         io::Printer* printer,
                                         const FileDescriptor* file) const {
   for (int i = 0; i < file->message_type_count(); i++) {
-    GenerateClassConstructorAndDeclareExtensionFieldInfo(
-        options, printer, file->message_type(i));
+    GenerateClassConstructorAndDeclareExtensionFieldInfo(options, printer,
+                                                         file->message_type(i));
   }
   for (int i = 0; i < file->message_type_count(); i++) {
     GenerateClass(options, printer, file->message_type(i));
@@ -2083,19 +2044,19 @@
       " * @constructor\n"
       " */\n"
       "$classprefix$$classname$ = function(opt_data) {\n",
-      "classprefix", GetMessagePathPrefix(options, desc),
-      "classname", desc->name());
+      "classprefix", GetMessagePathPrefix(options, desc), "classname",
+      desc->name());
   printer->Annotate("classname", desc);
   std::string message_id = GetMessageId(desc);
   printer->Print(
       "  jspb.Message.initialize(this, opt_data, $messageId$, $pivot$, "
       "$rptfields$, $oneoffields$);\n",
-      "messageId", !message_id.empty() ?
-                   ("'" + message_id + "'") :
-                   (IsResponse(desc) ? "''" : "0"),
-      "pivot", GetPivot(desc),
-      "rptfields", RepeatedFieldsArrayName(options, desc),
-      "oneoffields", OneofFieldsArrayName(options, desc));
+      "messageId",
+      !message_id.empty() ? ("'" + message_id + "'")
+                          : (IsResponse(desc) ? "''" : "0"),
+      "pivot", GetPivot(desc), "rptfields",
+      RepeatedFieldsArrayName(options, desc), "oneoffields",
+      OneofFieldsArrayName(options, desc));
   printer->Print(
       "};\n"
       "goog.inherits($classname$, jspb.Message);\n"
@@ -2112,8 +2073,7 @@
 }
 
 void Generator::GenerateClassConstructorAndDeclareExtensionFieldInfo(
-    const GeneratorOptions& options,
-    io::Printer* printer,
+    const GeneratorOptions& options, io::Printer* printer,
     const Descriptor* desc) const {
   if (!NamespaceOnly(desc)) {
     GenerateClassConstructor(options, printer, desc);
@@ -2141,9 +2101,9 @@
         " */\n"
         "$classname$$rptfieldarray$ = $rptfields$;\n"
         "\n",
-        "classname", GetMessagePath(options, desc),
-        "rptfieldarray", kRepeatedFieldArrayName,
-        "rptfields", RepeatedFieldNumberList(options, desc));
+        "classname", GetMessagePath(options, desc), "rptfieldarray",
+        kRepeatedFieldArrayName, "rptfields",
+        RepeatedFieldNumberList(options, desc));
   }
 
   if (HasOneofFields(desc)) {
@@ -2162,9 +2122,8 @@
         " */\n"
         "$classname$$oneofgrouparray$ = $oneofgroups$;\n"
         "\n",
-        "classname", GetMessagePath(options, desc),
-        "oneofgrouparray", kOneofGroupArrayName,
-        "oneofgroups", OneofGroupList(desc));
+        "classname", GetMessagePath(options, desc), "oneofgrouparray",
+        kOneofGroupArrayName, "oneofgroups", OneofGroupList(desc));
 
     for (int i = 0; i < desc->oneof_decl_count(); i++) {
       if (IgnoreOneof(desc->oneof_decl(i))) {
@@ -2186,8 +2145,7 @@
 }
 
 void Generator::GenerateOneofCaseDefinition(
-    const GeneratorOptions& options,
-    io::Printer* printer,
+    const GeneratorOptions& options, io::Printer* printer,
     const OneofDescriptor* oneof) const {
   printer->Print(
       "/**\n"
@@ -2195,9 +2153,8 @@
       " */\n"
       "$classname$.$oneof$Case = {\n"
       "  $upcase$_NOT_SET: 0",
-      "classname", GetMessagePath(options, oneof->containing_type()),
-      "oneof", JSOneofName(oneof),
-      "upcase", ToEnumCase(oneof->name()));
+      "classname", GetMessagePath(options, oneof->containing_type()), "oneof",
+      JSOneofName(oneof), "upcase", ToEnumCase(oneof->name()));
 
   for (int i = 0; i < oneof->field_count(); i++) {
     if (IgnoreField(oneof->field(i))) {
@@ -2207,8 +2164,8 @@
     printer->Print(
         ",\n"
         "  $upcase$: $number$",
-        "upcase", ToEnumCase(oneof->field(i)->name()),
-        "number", JSFieldIndex(oneof->field(i)));
+        "upcase", ToEnumCase(oneof->field(i)->name()), "number",
+        JSFieldIndex(oneof->field(i)));
     printer->Annotate("upcase", oneof->field(i));
   }
 
@@ -2224,9 +2181,8 @@
       "computeOneofCase(this, $class$.oneofGroups_[$oneofindex$]));\n"
       "};\n"
       "\n",
-      "class", GetMessagePath(options, oneof->containing_type()),
-      "oneof", JSOneofName(oneof),
-      "oneofindex", JSOneofIndex(oneof));
+      "class", GetMessagePath(options, oneof->containing_type()), "oneof",
+      JSOneofName(oneof), "oneofindex", JSOneofIndex(oneof));
 }
 
 void Generator::GenerateClassToObject(const GeneratorOptions& options,
@@ -2315,7 +2271,7 @@
 }
 
 void Generator::GenerateFieldValueExpression(io::Printer* printer,
-                                             const char *obj_reference,
+                                             const char* obj_reference,
                                              const FieldDescriptor* field,
                                              bool use_default) const {
   const bool is_float_or_double =
@@ -2348,29 +2304,25 @@
   // - getRepeatedFloatingPointField
   if (is_float_or_double && !field->is_repeated() && !use_default) {
     printer->Print(
-      "jspb.Message.getOptionalFloatingPointField($obj$, "
-      "$index$$default$)",
-      "obj", obj_reference,
-      "index", JSFieldIndex(field),
-      "default", default_arg);
+        "jspb.Message.getOptionalFloatingPointField($obj$, "
+        "$index$$default$)",
+        "obj", obj_reference, "index", JSFieldIndex(field), "default",
+        default_arg);
   } else {
     printer->Print(
-      "jspb.Message.get$cardinality$$type$Field$with_default$($obj$, "
-      "$index$$default$)",
-      "cardinality", cardinality,
-      "type", type,
-      "with_default", with_default,
-      "obj", obj_reference,
-      "index", JSFieldIndex(field),
-      "default", default_arg);
+        "jspb.Message.get$cardinality$$type$Field$with_default$($obj$, "
+        "$index$$default$)",
+        "cardinality", cardinality, "type", type, "with_default", with_default,
+        "obj", obj_reference, "index", JSFieldIndex(field), "default",
+        default_arg);
   }
 }
 
 void Generator::GenerateClassFieldToObject(const GeneratorOptions& options,
                                            io::Printer* printer,
                                            const FieldDescriptor* field) const {
-  printer->Print("$fieldname$: ",
-                 "fieldname", JSObjectFieldName(options, field));
+  printer->Print("$fieldname$: ", "fieldname",
+                 JSObjectFieldName(options, field));
 
   if (field->is_map()) {
     const FieldDescriptor* value_field = MapFieldValue(field);
@@ -2391,21 +2343,23 @@
     // Message field.
     if (field->is_repeated()) {
       {
-        printer->Print("jspb.Message.toObjectList(msg.get$getter$(),\n"
-                       "    $type$.toObject, includeInstance)",
-                       "getter", JSGetterName(options, field),
-                       "type", SubmessageTypeRef(options, field));
+        printer->Print(
+            "jspb.Message.toObjectList(msg.get$getter$(),\n"
+            "    $type$.toObject, includeInstance)",
+            "getter", JSGetterName(options, field), "type",
+            SubmessageTypeRef(options, field));
       }
     } else {
-      printer->Print("(f = msg.get$getter$()) && "
-                     "$type$.toObject(includeInstance, f)",
-                     "getter", JSGetterName(options, field),
-                     "type", SubmessageTypeRef(options, field));
+      printer->Print(
+          "(f = msg.get$getter$()) && "
+          "$type$.toObject(includeInstance, f)",
+          "getter", JSGetterName(options, field), "type",
+          SubmessageTypeRef(options, field));
     }
   } else if (field->type() == FieldDescriptor::TYPE_BYTES) {
     // For bytes fields we want to always return the B64 data.
-    printer->Print("msg.get$getter$()",
-                   "getter", JSGetterName(options, field, BYTES_B64));
+    printer->Print("msg.get$getter$()", "getter",
+                   JSGetterName(options, field, BYTES_B64));
   } else {
     bool use_default = field->has_default_value();
 
@@ -2450,15 +2404,14 @@
       " * @record\n"
       " */\n"
       "$typeName$ = function() {};\n\n",
-      "messageName", desc->name(),
-      "typeName", type_name);
+      "messageName", desc->name(), "typeName", type_name);
 
   for (int i = 0; i < desc->field_count(); i++) {
     printer->Print(
         "/** @type {$fieldType$|undefined} */\n"
         "$typeName$.prototype.$fieldName$;\n\n",
-        "typeName", type_name,
-        "fieldName", JSObjectFieldName(options, desc->field(i)),
+        "typeName", type_name, "fieldName",
+        JSObjectFieldName(options, desc->field(i)),
         // TODO(b/121097361): Add type checking for field values.
         "fieldType", "?");
   }
@@ -2467,8 +2420,7 @@
 void Generator::GenerateClassFromObject(const GeneratorOptions& options,
                                         io::Printer* printer,
                                         const Descriptor* desc) const {
-  printer->Print(
-      "if (jspb.Message.GENERATE_FROM_OBJECT) {\n\n");
+  printer->Print("if (jspb.Message.GENERATE_FROM_OBJECT) {\n\n");
 
   GenerateObjectTypedef(options, printer, desc);
 
@@ -2497,8 +2449,7 @@
 }
 
 void Generator::GenerateClassFieldFromObject(
-    const GeneratorOptions& options,
-    io::Printer* printer,
+    const GeneratorOptions& options, io::Printer* printer,
     const FieldDescriptor* field) const {
   if (field->is_map()) {
     const FieldDescriptor* value_field = MapFieldValue(field);
@@ -2509,9 +2460,9 @@
           "  obj.$name$ && jspb.Message.setWrapperField(\n"
           "      msg, $index$, jspb.Map.fromObject(obj.$name$, $fieldclass$, "
           "$fieldclass$.fromObject));\n",
-          "name", JSObjectFieldName(options, field),
-          "index", JSFieldIndex(field),
-          "fieldclass", GetMessagePath(options, value_field->message_type()));
+          "name", JSObjectFieldName(options, field), "index",
+          JSFieldIndex(field), "fieldclass",
+          GetMessagePath(options, value_field->message_type()));
     } else {
       // `msg` is a newly-constructed message object that has not yet built any
       // map containers wrapping underlying arrays, so we can simply directly
@@ -2519,8 +2470,8 @@
       printer->Print(
           "  obj.$name$ && "
           "jspb.Message.setField(msg, $index$, obj.$name$);\n",
-          "name", JSObjectFieldName(options, field),
-          "index", JSFieldIndex(field));
+          "name", JSObjectFieldName(options, field), "index",
+          JSFieldIndex(field));
     }
   } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
     // Message field (singular or repeated)
@@ -2531,25 +2482,24 @@
             "jspb.Message.setRepeatedWrapperField(\n"
             "      msg, $index$, obj.$name$.map(\n"
             "          $fieldclass$.fromObject));\n",
-            "name", JSObjectFieldName(options, field),
-            "index", JSFieldIndex(field),
-            "fieldclass", SubmessageTypeRef(options, field));
+            "name", JSObjectFieldName(options, field), "index",
+            JSFieldIndex(field), "fieldclass",
+            SubmessageTypeRef(options, field));
       }
     } else {
       printer->Print(
           "  obj.$name$ && jspb.Message.setWrapperField(\n"
           "      msg, $index$, $fieldclass$.fromObject(obj.$name$));\n",
-          "name", JSObjectFieldName(options, field),
-          "index", JSFieldIndex(field),
-          "fieldclass", SubmessageTypeRef(options, field));
+          "name", JSObjectFieldName(options, field), "index",
+          JSFieldIndex(field), "fieldclass", SubmessageTypeRef(options, field));
     }
   } else {
     // Simple (primitive) field.
     printer->Print(
         "  obj.$name$ != null && jspb.Message.setField(msg, $index$, "
         "obj.$name$);\n",
-        "name", JSObjectFieldName(options, field),
-        "index", JSFieldIndex(field));
+        "name", JSObjectFieldName(options, field), "index",
+        JSFieldIndex(field));
   }
 }
 
@@ -2576,10 +2526,8 @@
   }
 }
 
-void GenerateBytesWrapper(const GeneratorOptions& options,
-                          io::Printer* printer,
-                          const FieldDescriptor* field,
-                          BytesMode bytes_mode) {
+void GenerateBytesWrapper(const GeneratorOptions& options, io::Printer* printer,
+                          const FieldDescriptor* field, BytesMode bytes_mode) {
   std::string type =
       JSFieldTypeAnnotation(options, field,
                             /* is_setter_argument = */ false,
@@ -2598,14 +2546,13 @@
       "};\n"
       "\n"
       "\n",
-      "fielddef", FieldDefinition(options, field),
-      "comment", FieldComments(field, bytes_mode),
-      "type", type,
-      "class", GetMessagePath(options, field->containing_type()),
-      "name", JSGetterName(options, field, bytes_mode),
-      "list", field->is_repeated() ? "List" : "",
-      "suffix", JSByteGetterSuffix(bytes_mode),
-      "defname", JSGetterName(options, field, BYTES_DEFAULT));
+      "fielddef", FieldDefinition(options, field), "comment",
+      FieldComments(field, bytes_mode), "type", type, "class",
+      GetMessagePath(options, field->containing_type()), "name",
+      JSGetterName(options, field, bytes_mode), "list",
+      field->is_repeated() ? "List" : "", "suffix",
+      JSByteGetterSuffix(bytes_mode), "defname",
+      JSGetterName(options, field, BYTES_DEFAULT));
 }
 
 void Generator::GenerateClassField(const GeneratorOptions& options,
@@ -2633,15 +2580,13 @@
         " * empty, instead returning `undefined`\n"
         " * @return {!jspb.Map<$keytype$,$valuetype$>}\n"
         " */\n",
-        "fielddef", FieldDefinition(options, field),
-        "keytype", key_type,
+        "fielddef", FieldDefinition(options, field), "keytype", key_type,
         "valuetype", value_type);
     printer->Print(
         "$class$.prototype.$gettername$ = function(opt_noLazyCreate) {\n"
         "  return /** @type {!jspb.Map<$keytype$,$valuetype$>} */ (\n",
         "class", GetMessagePath(options, field->containing_type()),
-        "gettername", "get" + JSGetterName(options, field),
-        "keytype", key_type,
+        "gettername", "get" + JSGetterName(options, field), "keytype", key_type,
         "valuetype", value_type);
     printer->Annotate("gettername", field);
     printer->Print(
@@ -2654,12 +2599,12 @@
           "      $messageType$",
           "messageType", GetMessagePath(options, value_field->message_type()));
     } else {
-      printer->Print(",\n"
+      printer->Print(
+          ",\n"
           "      null");
     }
 
-    printer->Print(
-        "));\n");
+    printer->Print("));\n");
 
     printer->Print(
         "};\n"
@@ -2675,12 +2620,12 @@
         "$comment$"
         " * @return {$type$}\n"
         " */\n",
-        "fielddef", FieldDefinition(options, field),
-        "comment", FieldComments(field, BYTES_DEFAULT),
-        "type", JSFieldTypeAnnotation(options, field,
-                                      /* is_setter_argument = */ false,
-                                      /* force_present = */ false,
-                                      /* singular_if_not_packed = */ false));
+        "fielddef", FieldDefinition(options, field), "comment",
+        FieldComments(field, BYTES_DEFAULT), "type",
+        JSFieldTypeAnnotation(options, field,
+                              /* is_setter_argument = */ false,
+                              /* force_present = */ false,
+                              /* singular_if_not_packed = */ false));
     printer->Print(
         "$class$.prototype.$gettername$ = function() {\n"
         "  return /** @type{$type$} */ (\n"
@@ -2690,16 +2635,15 @@
         "\n"
         "\n",
         "class", GetMessagePath(options, field->containing_type()),
-        "gettername", "get" + JSGetterName(options, field),
-        "type", JSFieldTypeAnnotation(options, field,
-                                      /* is_setter_argument = */ false,
-                                      /* force_present = */ false,
-                                      /* singular_if_not_packed = */ false),
-        "rpt", (field->is_repeated() ? "Repeated" : ""),
-        "index", JSFieldIndex(field),
-        "wrapperclass", SubmessageTypeRef(options, field),
-        "required", (field->label() == FieldDescriptor::LABEL_REQUIRED ?
-                     ", 1" : ""));
+        "gettername", "get" + JSGetterName(options, field), "type",
+        JSFieldTypeAnnotation(options, field,
+                              /* is_setter_argument = */ false,
+                              /* force_present = */ false,
+                              /* singular_if_not_packed = */ false),
+        "rpt", (field->is_repeated() ? "Repeated" : ""), "index",
+        JSFieldIndex(field), "wrapperclass", SubmessageTypeRef(options, field),
+        "required",
+        (field->label() == FieldDescriptor::LABEL_REQUIRED ? ", 1" : ""));
     printer->Annotate("gettername", field);
     printer->Print(
         "/** @param {$optionaltype$} value$returndoc$ */\n"
@@ -2710,11 +2654,11 @@
                               /* is_setter_argument = */ true,
                               /* force_present = */ false,
                               /* singular_if_not_packed = */ false),
-        "returndoc", JSReturnDoc(options, field),
-        "class", GetMessagePath(options, field->containing_type()),
-        "settername", "set" + JSGetterName(options, field),
-        "oneoftag", (field->containing_oneof() ? "Oneof" : ""),
-        "repeatedtag", (field->is_repeated() ? "Repeated" : ""));
+        "returndoc", JSReturnDoc(options, field), "class",
+        GetMessagePath(options, field->containing_type()), "settername",
+        "set" + JSGetterName(options, field), "oneoftag",
+        (field->containing_oneof() ? "Oneof" : ""), "repeatedtag",
+        (field->is_repeated() ? "Repeated" : ""));
     printer->Annotate("settername", field);
 
     printer->Print(
@@ -2722,9 +2666,9 @@
         "};\n"
         "\n"
         "\n",
-        "index", JSFieldIndex(field),
-        "oneofgroup", (field->containing_oneof() ?
-                       (", " + JSOneofArray(options, field)) : ""),
+        "index", JSFieldIndex(field), "oneofgroup",
+        (field->containing_oneof() ? (", " + JSOneofArray(options, field))
+                                   : ""),
         "returnvalue", JSReturnClause(field));
 
     if (field->is_repeated()) {
@@ -2741,8 +2685,9 @@
     // at this point we "lie" to non-binary users and tell the return
     // type is always base64 string, pending a LSC to migrate to typed getters.
     BytesMode bytes_mode =
-        field->type() == FieldDescriptor::TYPE_BYTES && !options.binary ?
-            BYTES_B64 : BYTES_DEFAULT;
+        field->type() == FieldDescriptor::TYPE_BYTES && !options.binary
+            ? BYTES_B64
+            : BYTES_DEFAULT;
     std::string typed_annotation =
         JSFieldTypeAnnotation(options, field,
                               /* is_setter_argument = */ false,
@@ -2761,24 +2706,20 @@
           "$comment$"
           " * @return {$type$}\n"
           " */\n",
-          "fielddef", FieldDefinition(options, field),
-          "comment", FieldComments(field, bytes_mode),
-          "type", typed_annotation);
+          "fielddef", FieldDefinition(options, field), "comment",
+          FieldComments(field, bytes_mode), "type", typed_annotation);
     }
 
-    printer->Print(
-        "$class$.prototype.$gettername$ = function() {\n",
-        "class", GetMessagePath(options, field->containing_type()),
-        "gettername", "get" + JSGetterName(options, field));
+    printer->Print("$class$.prototype.$gettername$ = function() {\n", "class",
+                   GetMessagePath(options, field->containing_type()),
+                   "gettername", "get" + JSGetterName(options, field));
     printer->Annotate("gettername", field);
 
     if (untyped) {
-      printer->Print(
-          "  return ");
+      printer->Print("  return ");
     } else {
-      printer->Print(
-          "  return /** @type {$type$} */ (",
-          "type", typed_annotation);
+      printer->Print("  return /** @type {$type$} */ (", "type",
+                     typed_annotation);
     }
 
     bool use_default = !ReturnsNullWhenUnset(options, field);
@@ -2824,11 +2765,10 @@
     } else {
       printer->Print(
           "/** @param {$optionaltype$} value$returndoc$ */\n", "optionaltype",
-          JSFieldTypeAnnotation(
-              options, field,
-              /* is_setter_argument = */ true,
-              /* force_present = */ false,
-              /* singular_if_not_packed = */ false),
+          JSFieldTypeAnnotation(options, field,
+                                /* is_setter_argument = */ true,
+                                /* force_present = */ false,
+                                /* singular_if_not_packed = */ false),
           "returndoc", JSReturnDoc(options, field));
     }
 
@@ -2881,7 +2821,6 @@
           "returndoc", JSReturnDoc(options, field));
     }
 
-
     if (field->is_repeated()) {
       GenerateRepeatedPrimitiveHelperMethods(options, printer, field, untyped);
     }
@@ -2974,9 +2913,8 @@
         "};\n"
         "\n"
         "\n",
-        "class", GetMessagePath(options, field->containing_type()),
-        "hasername", "has" + JSGetterName(options, field),
-        "index", JSFieldIndex(field));
+        "class", GetMessagePath(options, field->containing_type()), "hasername",
+        "has" + JSGetterName(options, field), "index", JSFieldIndex(field));
     printer->Annotate("hasername", field);
   }
 }
@@ -3133,15 +3071,13 @@
         "    var field = reader.getFieldNumber();\n"
         "    switch (field) {\n");
 
-
     for (int i = 0; i < desc->field_count(); i++) {
       if (!IgnoreField(desc->field(i))) {
         GenerateClassDeserializeBinaryField(options, printer, desc->field(i));
       }
     }
 
-    printer->Print(
-        "    default:\n");
+    printer->Print("    default:\n");
     if (IsExtendable(desc)) {
       printer->Print(
           "      jspb.Message.readBinaryExtension(msg, reader,\n"
@@ -3168,8 +3104,7 @@
 }
 
 void Generator::GenerateClassDeserializeBinaryField(
-    const GeneratorOptions& options,
-    io::Printer* printer,
+    const GeneratorOptions& options, io::Printer* printer,
     const FieldDescriptor* field) const {
   printer->Print("    case $num$:\n", "num", StrCat(field->number()));
 
@@ -3181,20 +3116,20 @@
         "      reader.readMessage(value, function(message, reader) {\n",
         "name", JSGetterName(options, field));
 
-    printer->Print("        jspb.Map.deserializeBinary(message, reader, "
-                   "$keyReaderFn$, $valueReaderFn$",
-          "keyReaderFn", JSBinaryReaderMethodName(options, key_field),
-          "valueReaderFn", JSBinaryReaderMethodName(options, value_field));
+    printer->Print(
+        "        jspb.Map.deserializeBinary(message, reader, "
+        "$keyReaderFn$, $valueReaderFn$",
+        "keyReaderFn", JSBinaryReaderMethodName(options, key_field),
+        "valueReaderFn", JSBinaryReaderMethodName(options, value_field));
 
     if (value_field->type() == FieldDescriptor::TYPE_MESSAGE) {
       printer->Print(", $messageType$.deserializeBinaryFromReader",
-          "messageType", GetMessagePath(options, value_field->message_type()));
+                     "messageType",
+                     GetMessagePath(options, value_field->message_type()));
     } else {
       printer->Print(", null");
     }
-    printer->Print(", $defaultKey$",
-          "defaultKey", JSFieldDefault(key_field)
-    );
+    printer->Print(", $defaultKey$", "defaultKey", JSFieldDefault(key_field));
     printer->Print(");\n");
     printer->Print("         });\n");
   } else {
@@ -3213,9 +3148,9 @@
       printer->Print(
           "      var value = /** @type {$fieldtype$} */ "
           "(reader.read$reader$());\n",
-          "fieldtype", JSFieldTypeAnnotation(options, field, false, true,
-                                             /* singular_if_not_packed */ true,
-                                             BYTES_U8),
+          "fieldtype",
+          JSFieldTypeAnnotation(options, field, false, true,
+                                /* singular_if_not_packed */ true, BYTES_U8),
           "reader",
           JSBinaryReadWriteMethodName(field, /* is_writer = */ false));
     }
@@ -3228,9 +3163,8 @@
       // Singular fields, and packed repeated fields, receive a |value| either
       // as the field's value or as the array of all the field's values; set
       // this as the field's value directly.
-      printer->Print(
-          "      msg.set$name$(value);\n",
-          "name", JSGetterName(options, field));
+      printer->Print("      msg.set$name$(value);\n", "name",
+                     JSGetterName(options, field));
     }
   }
 
@@ -3274,8 +3208,8 @@
     printer->Print(
         "  jspb.Message.serializeBinaryExtensions(message, writer,\n"
         "    $extobj$Binary, $class$.prototype.getExtension);\n",
-        "extobj", JSExtensionsObjectName(options, desc->file(), desc),
-        "class", GetMessagePath(options, desc));
+        "extobj", JSExtensionsObjectName(options, desc->file(), desc), "class",
+        GetMessagePath(options, desc));
   }
 
   printer->Print(
@@ -3285,8 +3219,7 @@
 }
 
 void Generator::GenerateClassSerializeBinaryField(
-    const GeneratorOptions& options,
-    io::Printer* printer,
+    const GeneratorOptions& options, io::Printer* printer,
     const FieldDescriptor* field) const {
   if (HasFieldPresence(options, field) &&
       field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
@@ -3299,12 +3232,11 @@
     printer->Print(
         "  f = /** @type {$type$} */ "
         "(jspb.Message.getField(message, $index$));\n",
-        "index", JSFieldIndex(field),
-        "type", typed_annotation);
+        "index", JSFieldIndex(field), "type", typed_annotation);
   } else {
     printer->Print(
-        "  f = message.get$name$($nolazy$);\n",
-        "name", JSGetterName(options, field, BYTES_U8),
+        "  f = message.get$name$($nolazy$);\n", "name",
+        JSGetterName(options, field, BYTES_U8),
         // No lazy creation for maps containers -- fastpath the empty case.
         "nolazy", field->is_map() ? "true" : "");
   }
@@ -3312,15 +3244,12 @@
   // Print an `if (condition)` statement that evaluates to true if the field
   // goes on the wire.
   if (field->is_map()) {
-    printer->Print(
-        "  if (f && f.getLength() > 0) {\n");
+    printer->Print("  if (f && f.getLength() > 0) {\n");
   } else if (field->is_repeated()) {
-    printer->Print(
-        "  if (f.length > 0) {\n");
+    printer->Print("  if (f.length > 0) {\n");
   } else {
     if (HasFieldPresence(options, field)) {
-      printer->Print(
-          "  if (f != null) {\n");
+      printer->Print("  if (f != null) {\n");
     } else {
       // No field presence: serialize onto the wire only if value is
       // non-default.  Defaults are documented here:
@@ -3345,16 +3274,13 @@
         case FieldDescriptor::CPPTYPE_ENUM:
         case FieldDescriptor::CPPTYPE_FLOAT:
         case FieldDescriptor::CPPTYPE_DOUBLE:
-          printer->Print(
-              "  if (f !== 0.0) {\n");
+          printer->Print("  if (f !== 0.0) {\n");
           break;
         case FieldDescriptor::CPPTYPE_BOOL:
-          printer->Print(
-              "  if (f) {\n");
+          printer->Print("  if (f) {\n");
           break;
         case FieldDescriptor::CPPTYPE_STRING:
-          printer->Print(
-              "  if (f.length > 0) {\n");
+          printer->Print("  if (f.length > 0) {\n");
           break;
         default:
           assert(false);
@@ -3375,8 +3301,8 @@
         JSBinaryWriterMethodName(options, value_field));
 
     if (value_field->type() == FieldDescriptor::TYPE_MESSAGE) {
-      printer->Print(", $messageType$.serializeBinaryToWriter",
-          "messageType", GetMessagePath(options, value_field->message_type()));
+      printer->Print(", $messageType$.serializeBinaryToWriter", "messageType",
+                     GetMessagePath(options, value_field->message_type()));
     }
 
     printer->Print(");\n");
@@ -3393,18 +3319,16 @@
       printer->Print(
           ",\n"
           "      $submsg$.serializeBinaryToWriter\n",
-        "submsg", SubmessageTypeRef(options, field));
+          "submsg", SubmessageTypeRef(options, field));
     } else {
       printer->Print("\n");
     }
 
-    printer->Print(
-        "    );\n");
+    printer->Print("    );\n");
   }
 
   // Close the `if`.
-  printer->Print(
-      "  }\n");
+  printer->Print("  }\n");
 }
 
 void Generator::GenerateEnum(const GeneratorOptions& options,
@@ -3415,8 +3339,8 @@
       " * @enum {number}\n"
       " */\n"
       "$enumprefix$$name$ = {\n",
-      "enumprefix", GetEnumPathPrefix(options, enumdesc),
-      "name", enumdesc->name());
+      "enumprefix", GetEnumPathPrefix(options, enumdesc), "name",
+      enumdesc->name());
   printer->Annotate("name", enumdesc);
 
   for (int i = 0; i < enumdesc->value_count(); i++) {
@@ -3450,14 +3374,12 @@
       " * @type {!jspb.ExtensionFieldInfo<$extensionType$>}\n"
       " */\n"
       "$class$.$name$ = new jspb.ExtensionFieldInfo(\n",
-      "nameInComment", extension_object_name,
-      "name", extension_object_name,
-      "class", extension_scope,
-      "extensionType", JSFieldTypeAnnotation(
-          options, field,
-          /* is_setter_argument = */ false,
-          /* force_present = */ true,
-          /* singular_if_not_packed = */ false));
+      "nameInComment", extension_object_name, "name", extension_object_name,
+      "class", extension_scope, "extensionType",
+      JSFieldTypeAnnotation(options, field,
+                            /* is_setter_argument = */ false,
+                            /* force_present = */ true,
+                            /* singular_if_not_packed = */ false));
   printer->Annotate("name", field);
   printer->Print(
       "    $index$,\n"
@@ -3619,8 +3541,7 @@
 }
 
 void Generator::GenerateFilesInDepOrder(
-    const GeneratorOptions& options,
-    io::Printer* printer,
+    const GeneratorOptions& options, io::Printer* printer,
     const std::vector<const FileDescriptor*>& files) const {
   // Build a std::set over all files so that the DFS can detect when it recurses
   // into a dep not specified in the user's command line.
@@ -3633,10 +3554,8 @@
 }
 
 void Generator::GenerateFileAndDeps(
-    const GeneratorOptions& options,
-    io::Printer* printer,
-    const FileDescriptor* root,
-    std::set<const FileDescriptor*>* all_files,
+    const GeneratorOptions& options, io::Printer* printer,
+    const FileDescriptor* root, std::set<const FileDescriptor*>* all_files,
     std::set<const FileDescriptor*>* generated) const {
   // Skip if already generated.
   if (generated->find(root) != generated->end()) {
@@ -3659,7 +3578,7 @@
 }
 
 bool Generator::GenerateFile(const FileDescriptor* file,
-                             const GeneratorOptions &options,
+                             const GeneratorOptions& options,
                              GeneratorContext* context,
                              bool use_short_name) const {
   std::string filename =
@@ -3672,10 +3591,8 @@
   GeneratedCodeInfo annotations;
   io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
       &annotations);
-  io::Printer printer(
-      output.get(), '$', options.annotate_code ?
-                         &annotation_collector : nullptr);
-
+  io::Printer printer(output.get(), '$',
+                      options.annotate_code ? &annotation_collector : nullptr);
 
   GenerateFile(options, &printer, file);
 
@@ -3753,8 +3670,8 @@
   // if provided is empty, do not export anything
   if (options.import_style == GeneratorOptions::kImportCommonJs &&
       !provided.empty()) {
-    printer->Print("goog.object.extend(exports, $package$);\n",
-                   "package", GetNamespace(options, file));
+    printer->Print("goog.object.extend(exports, $package$);\n", "package",
+                   GetNamespace(options, file));
   } else if (options.import_style == GeneratorOptions::kImportCommonJsStrict) {
     printer->Print("goog.object.extend(exports, proto);\n", "package",
                    GetNamespace(options, file));
@@ -3823,8 +3740,8 @@
     std::set<const Descriptor*> have_printed;
     SCCAnalyzer<DepsGenerator> analyzer;
     std::map<const void*, std::string> allowed_map;
-    if (!GenerateJspbAllowedMap(
-        options, files, &allowed_map, &analyzer, error)) {
+    if (!GenerateJspbAllowedMap(options, files, &allowed_map, &analyzer,
+                                error)) {
       return false;
     }
 
@@ -3852,7 +3769,12 @@
         std::unique_ptr<io::ZeroCopyOutputStream> output(
             context->Open(filename));
         GOOGLE_CHECK(output.get());
-        io::Printer printer(output.get(), '$');
+        GeneratedCodeInfo annotations;
+        io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
+            &annotations);
+        io::Printer printer(
+            output.get(), '$',
+            options.annotate_code ? &annotation_collector : nullptr);
 
         GenerateHeader(options, &printer);
 
@@ -3885,6 +3807,9 @@
         if (printer.failed()) {
           return false;
         }
+        if (options.annotate_code) {
+          EmbedCodeAnnotations(annotations, &printer);
+        }
       }
       for (int j = 0; j < file->enum_type_count(); j++) {
         const EnumDescriptor* enumdesc = file->enum_type(j);
@@ -3897,7 +3822,12 @@
         std::unique_ptr<io::ZeroCopyOutputStream> output(
             context->Open(filename));
         GOOGLE_CHECK(output.get());
-        io::Printer printer(output.get(), '$');
+        GeneratedCodeInfo annotations;
+        io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
+            &annotations);
+        io::Printer printer(
+            output.get(), '$',
+            options.annotate_code ? &annotation_collector : nullptr);
 
         GenerateHeader(options, &printer);
 
@@ -3911,6 +3841,9 @@
         if (printer.failed()) {
           return false;
         }
+        if (options.annotate_code) {
+          EmbedCodeAnnotations(annotations, &printer);
+        }
       }
       // File-level extensions (message-level extensions are generated under
       // the enclosing message).
@@ -3921,7 +3854,12 @@
         std::unique_ptr<io::ZeroCopyOutputStream> output(
             context->Open(filename));
         GOOGLE_CHECK(output.get());
-        io::Printer printer(output.get(), '$');
+        GeneratedCodeInfo annotations;
+        io::AnnotationProtoCollector<GeneratedCodeInfo> annotation_collector(
+            &annotations);
+        io::Printer printer(
+            output.get(), '$',
+            options.annotate_code ? &annotation_collector : nullptr);
 
         GenerateHeader(options, &printer);
 
@@ -3944,14 +3882,16 @@
             GenerateExtension(options, &printer, files[i]->extension(j));
           }
         }
+        if (options.annotate_code) {
+          EmbedCodeAnnotations(annotations, &printer);
+        }
       }
     }
     if (!generated) {
       std::string filename = options.output_dir + "/" +
                              "empty_no_content_void_file" +
                              options.GetFileNameExtension();
-      std::unique_ptr<io::ZeroCopyOutputStream> output(
-          context->Open(filename));
+      std::unique_ptr<io::ZeroCopyOutputStream> output(context->Open(filename));
     }
   } else /* options.output_mode() == kOneOutputFilePerInputFile */ {
     // Generate one output file per input (.proto) file.
diff --git a/src/google/protobuf/compiler/js/js_generator.h b/src/google/protobuf/compiler/js/js_generator.h
index e99622f..b1c1878 100644
--- a/src/google/protobuf/compiler/js/js_generator.h
+++ b/src/google/protobuf/compiler/js/js_generator.h
@@ -33,8 +33,8 @@
 #ifndef GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__
 #define GOOGLE_PROTOBUF_COMPILER_JS_GENERATOR_H__
 
-#include <string>
 #include <set>
+#include <string>
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
@@ -52,7 +52,9 @@
 class OneofDescriptor;
 class FileDescriptor;
 
-namespace io { class Printer; }
+namespace io {
+class Printer;
+}
 
 namespace compiler {
 namespace js {
@@ -123,8 +125,11 @@
   std::string extension;
   // Create a separate output file for each input file?
   bool one_output_file_per_input_file;
-  // If true, we should build .meta files that contain annotations for
-  // generated code. See GeneratedCodeInfo in descriptor.proto.
+  // If true, we should append annotations as commen on the last line for
+  // generated .js file. Annotations used by tools like https://kythe.io
+  // to provide cross-references between .js and .proto files. Annotations
+  // are enced as base64 proto of GeneratedCodeInfo message (see
+  // descriptor.proto).
   bool annotate_code;
 };
 
@@ -215,12 +220,9 @@
   // Generate all things in a proto file into one file.
   // If use_short_name is true, the generated file's name will only be short
   // name that without directory, otherwise filename equals file->name()
-  bool GenerateFile(const FileDescriptor* file,
-                    const GeneratorOptions &options,
-                    GeneratorContext* context,
-                    bool use_short_name) const;
-  void GenerateFile(const GeneratorOptions& options,
-                    io::Printer* printer,
+  bool GenerateFile(const FileDescriptor* file, const GeneratorOptions& options,
+                    GeneratorContext* context, bool use_short_name) const;
+  void GenerateFile(const GeneratorOptions& options, io::Printer* printer,
                     const FileDescriptor* file) const;
 
   // Generate definitions for all message classes and enums in all files,
@@ -230,8 +232,7 @@
       const std::vector<const FileDescriptor*>& file) const;
   // Helper for above.
   void GenerateFileAndDeps(const GeneratorOptions& options,
-                           io::Printer* printer,
-                           const FileDescriptor* root,
+                           io::Printer* printer, const FileDescriptor* root,
                            std::set<const FileDescriptor*>* all_files,
                            std::set<const FileDescriptor*>* generated) const;
 
@@ -246,8 +247,7 @@
                                     bool use_default) const;
 
   // Generate definition for one class.
-  void GenerateClass(const GeneratorOptions& options,
-                     io::Printer* printer,
+  void GenerateClass(const GeneratorOptions& options, io::Printer* printer,
                      const Descriptor* desc) const;
   void GenerateClassConstructor(const GeneratorOptions& options,
                                 io::Printer* printer,
@@ -256,11 +256,9 @@
                               io::Printer* printer,
                               const Descriptor* desc) const;
   void GenerateClassConstructorAndDeclareExtensionFieldInfo(
-      const GeneratorOptions& options,
-      io::Printer* printer,
+      const GeneratorOptions& options, io::Printer* printer,
       const Descriptor* desc) const;
-  void GenerateClassXid(const GeneratorOptions& options,
-                        io::Printer* printer,
+  void GenerateClassXid(const GeneratorOptions& options, io::Printer* printer,
                         const Descriptor* desc) const;
   void GenerateOneofCaseDefinition(const GeneratorOptions& options,
                                    io::Printer* printer,
@@ -280,17 +278,14 @@
   void GenerateClassFieldFromObject(const GeneratorOptions& options,
                                     io::Printer* printer,
                                     const FieldDescriptor* field) const;
-  void GenerateClassClone(const GeneratorOptions& options,
-                          io::Printer* printer,
+  void GenerateClassClone(const GeneratorOptions& options, io::Printer* printer,
                           const Descriptor* desc) const;
   void GenerateClassRegistration(const GeneratorOptions& options,
                                  io::Printer* printer,
                                  const Descriptor* desc) const;
   void GenerateClassFields(const GeneratorOptions& options,
-                           io::Printer* printer,
-                           const Descriptor* desc) const;
-  void GenerateClassField(const GeneratorOptions& options,
-                          io::Printer* printer,
+                           io::Printer* printer, const Descriptor* desc) const;
+  void GenerateClassField(const GeneratorOptions& options, io::Printer* printer,
                           const FieldDescriptor* desc) const;
   void GenerateClassExtensionFieldInfo(const GeneratorOptions& options,
                                        io::Printer* printer,
@@ -312,13 +307,11 @@
                                          const FieldDescriptor* field) const;
 
   // Generate definition for one enum.
-  void GenerateEnum(const GeneratorOptions& options,
-                    io::Printer* printer,
+  void GenerateEnum(const GeneratorOptions& options, io::Printer* printer,
                     const EnumDescriptor* enumdesc) const;
 
   // Generate an extension definition.
-  void GenerateExtension(const GeneratorOptions& options,
-                         io::Printer* printer,
+  void GenerateExtension(const GeneratorOptions& options, io::Printer* printer,
                          const FieldDescriptor* field) const;
 
   // Generate addFoo() method for repeated primitive fields.
diff --git a/src/google/protobuf/compiler/mock_code_generator.cc b/src/google/protobuf/compiler/mock_code_generator.cc
index 46326e2..0776064 100644
--- a/src/google/protobuf/compiler/mock_code_generator.cc
+++ b/src/google/protobuf/compiler/mock_code_generator.cc
@@ -114,16 +114,16 @@
   }
 
   EXPECT_EQ(lines.size(), 3 + insertion_list.size() * 2);
-  EXPECT_EQ(GetOutputFileContent(name, parameter, file,
-                                 first_parsed_file_name, first_message_name),
+  EXPECT_EQ(GetOutputFileContent(name, parameter, file, first_parsed_file_name,
+                                 first_message_name),
             lines[0]);
 
   EXPECT_EQ(kFirstInsertionPoint, lines[1 + insertion_list.size()]);
   EXPECT_EQ(kSecondInsertionPoint, lines[2 + insertion_list.size() * 2]);
 
   for (size_t i = 0; i < insertion_list.size(); i++) {
-    EXPECT_EQ(GetOutputFileContent(insertion_list[i], "first_insert",
-                                   file, file, first_message_name),
+    EXPECT_EQ(GetOutputFileContent(insertion_list[i], "first_insert", file,
+                                   file, first_message_name),
               lines[1 + i]);
     // Second insertion point is indented, so the inserted text should
     // automatically be indented too.
@@ -200,8 +200,8 @@
       } else if (command == "HasJsonName") {
         FieldDescriptorProto field_descriptor_proto;
         file->message_type(i)->field(0)->CopyTo(&field_descriptor_proto);
-        std::cerr << "Saw json_name: "
-                  << field_descriptor_proto.has_json_name() << std::endl;
+        std::cerr << "Saw json_name: " << field_descriptor_proto.has_json_name()
+                  << std::endl;
         abort();
       } else if (command == "Annotate") {
         annotate = true;
@@ -210,8 +210,8 @@
         context->GetCompilerVersion(&compiler_version);
         std::cerr << "Saw compiler_version: "
                   << compiler_version.major() * 1000000 +
-                     compiler_version.minor() * 1000 +
-                     compiler_version.patch()
+                         compiler_version.minor() * 1000 +
+                         compiler_version.patch()
                   << " " << compiler_version.suffix() << std::endl;
         abort();
       } else {
@@ -230,8 +230,8 @@
         std::unique_ptr<io::ZeroCopyOutputStream> output(context->OpenForInsert(
             GetOutputFileName(insert_into[i], file), kFirstInsertionPointName));
         io::Printer printer(output.get(), '$');
-        printer.PrintRaw(GetOutputFileContent(name_, "first_insert",
-                                              file, context));
+        printer.PrintRaw(
+            GetOutputFileContent(name_, "first_insert", file, context));
         if (printer.failed()) {
           *error = "MockCodeGenerator detected write error.";
           return false;
@@ -243,8 +243,8 @@
             context->OpenForInsert(GetOutputFileName(insert_into[i], file),
                                    kSecondInsertionPointName));
         io::Printer printer(output.get(), '$');
-        printer.PrintRaw(GetOutputFileContent(name_, "second_insert",
-                                              file, context));
+        printer.PrintRaw(
+            GetOutputFileContent(name_, "second_insert", file, context));
         if (printer.failed()) {
           *error = "MockCodeGenerator detected write error.";
           return false;
@@ -310,19 +310,17 @@
   std::vector<const FileDescriptor*> all_files;
   context->ListParsedFiles(&all_files);
   return GetOutputFileContent(
-      generator_name, parameter, file->name(),
-      CommaSeparatedList(all_files),
-      file->message_type_count() > 0 ?
-          file->message_type(0)->name() : "(none)");
+      generator_name, parameter, file->name(), CommaSeparatedList(all_files),
+      file->message_type_count() > 0 ? file->message_type(0)->name()
+                                     : "(none)");
 }
 
 std::string MockCodeGenerator::GetOutputFileContent(
     const std::string& generator_name, const std::string& parameter,
     const std::string& file, const std::string& parsed_file_list,
     const std::string& first_message_name) {
-  return strings::Substitute("$0: $1, $2, $3, $4\n",
-      generator_name, parameter, file,
-      first_message_name, parsed_file_list);
+  return strings::Substitute("$0: $1, $2, $3, $4\n", generator_name, parameter,
+                             file, first_message_name, parsed_file_list);
 }
 
 }  // namespace compiler
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
index 3d0b0d2..bcf4d39 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
@@ -47,7 +47,7 @@
 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/printer.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/stubs/io_win32.h>
+#include <google/protobuf/io/io_win32.h>
 #include <google/protobuf/stubs/port.h>
 #include <google/protobuf/stubs/strutil.h>
 
@@ -63,7 +63,7 @@
 // in this port namespace to avoid ambiguous definition.
 namespace posix {
 #ifdef _WIN32
-using ::google::protobuf::internal::win32::open;
+using ::google::protobuf::io::win32::open;
 #else
 using ::open;
 #endif
diff --git a/src/google/protobuf/compiler/parser.cc b/src/google/protobuf/compiler/parser.cc
index 9264710..c96fc17 100644
--- a/src/google/protobuf/compiler/parser.cc
+++ b/src/google/protobuf/compiler/parser.cc
@@ -65,23 +65,23 @@
 TypeNameMap MakeTypeNameTable() {
   TypeNameMap result;
 
-  result["double"  ] = FieldDescriptorProto::TYPE_DOUBLE;
-  result["float"   ] = FieldDescriptorProto::TYPE_FLOAT;
-  result["uint64"  ] = FieldDescriptorProto::TYPE_UINT64;
-  result["fixed64" ] = FieldDescriptorProto::TYPE_FIXED64;
-  result["fixed32" ] = FieldDescriptorProto::TYPE_FIXED32;
-  result["bool"    ] = FieldDescriptorProto::TYPE_BOOL;
-  result["string"  ] = FieldDescriptorProto::TYPE_STRING;
-  result["group"   ] = FieldDescriptorProto::TYPE_GROUP;
+  result["double"] = FieldDescriptorProto::TYPE_DOUBLE;
+  result["float"] = FieldDescriptorProto::TYPE_FLOAT;
+  result["uint64"] = FieldDescriptorProto::TYPE_UINT64;
+  result["fixed64"] = FieldDescriptorProto::TYPE_FIXED64;
+  result["fixed32"] = FieldDescriptorProto::TYPE_FIXED32;
+  result["bool"] = FieldDescriptorProto::TYPE_BOOL;
+  result["string"] = FieldDescriptorProto::TYPE_STRING;
+  result["group"] = FieldDescriptorProto::TYPE_GROUP;
 
-  result["bytes"   ] = FieldDescriptorProto::TYPE_BYTES;
-  result["uint32"  ] = FieldDescriptorProto::TYPE_UINT32;
+  result["bytes"] = FieldDescriptorProto::TYPE_BYTES;
+  result["uint32"] = FieldDescriptorProto::TYPE_UINT32;
   result["sfixed32"] = FieldDescriptorProto::TYPE_SFIXED32;
   result["sfixed64"] = FieldDescriptorProto::TYPE_SFIXED64;
-  result["int32"   ] = FieldDescriptorProto::TYPE_INT32;
-  result["int64"   ] = FieldDescriptorProto::TYPE_INT64;
-  result["sint32"  ] = FieldDescriptorProto::TYPE_SINT32;
-  result["sint64"  ] = FieldDescriptorProto::TYPE_SINT64;
+  result["int32"] = FieldDescriptorProto::TYPE_INT32;
+  result["int64"] = FieldDescriptorProto::TYPE_INT64;
+  result["sint32"] = FieldDescriptorProto::TYPE_SINT32;
+  result["sint64"] = FieldDescriptorProto::TYPE_SINT64;
 
   return result;
 }
@@ -119,21 +119,23 @@
 // Makes code slightly more readable.  The meaning of "DO(foo)" is
 // "Execute foo and fail if it fails.", where failure is indicated by
 // returning false.
-#define DO(STATEMENT) if (STATEMENT) {} else return false
+#define DO(STATEMENT) \
+  if (STATEMENT) {    \
+  } else              \
+    return false
 
 // ===================================================================
 
 Parser::Parser()
-  : input_(NULL),
-    error_collector_(NULL),
-    source_location_table_(NULL),
-    had_errors_(false),
-    require_syntax_identifier_(false),
-    stop_after_syntax_identifier_(false) {
+    : input_(NULL),
+      error_collector_(NULL),
+      source_location_table_(NULL),
+      had_errors_(false),
+      require_syntax_identifier_(false),
+      stop_after_syntax_identifier_(false) {
 }
 
-Parser::~Parser() {
-}
+Parser::~Parser() {}
 
 // ===================================================================
 
@@ -145,9 +147,7 @@
   return input_->current().type == token_type;
 }
 
-inline bool Parser::AtEnd() {
-  return LookingAtType(io::Tokenizer::TYPE_END);
-}
+inline bool Parser::AtEnd() { return LookingAtType(io::Tokenizer::TYPE_END); }
 
 bool Parser::TryConsume(const char* text) {
   if (LookingAt(text)) {
@@ -190,8 +190,8 @@
 bool Parser::ConsumeInteger(int* output, const char* error) {
   if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
     uint64 value = 0;
-    if (!io::Tokenizer::ParseInteger(input_->current().text,
-                                     kint32max, &value)) {
+    if (!io::Tokenizer::ParseInteger(input_->current().text, kint32max,
+                                     &value)) {
       AddError("Integer out of range.");
       // We still return true because we did, in fact, parse an integer.
     }
@@ -243,8 +243,8 @@
   } else if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) {
     // Also accept integers.
     uint64 value = 0;
-    if (!io::Tokenizer::ParseInteger(input_->current().text,
-                                     kuint64max, &value)) {
+    if (!io::Tokenizer::ParseInteger(input_->current().text, kuint64max,
+                                     &value)) {
       AddError("Integer out of range.");
       // We still return true because we did, in fact, parse a number.
     }
@@ -281,8 +281,8 @@
   }
 }
 
-bool Parser::TryConsumeEndOfDeclaration(
-    const char* text, const LocationRecorder* location) {
+bool Parser::TryConsumeEndOfDeclaration(const char* text,
+                                        const LocationRecorder* location) {
   if (LookingAt(text)) {
     std::string leading, trailing;
     std::vector<std::string> detached;
@@ -312,8 +312,8 @@
   }
 }
 
-bool Parser::ConsumeEndOfDeclaration(
-    const char* text, const LocationRecorder* location) {
+bool Parser::ConsumeEndOfDeclaration(const char* text,
+                                     const LocationRecorder* location) {
   if (TryConsumeEndOfDeclaration(text, location)) {
     return true;
   } else {
@@ -408,7 +408,8 @@
   location_->add_span(token.end_column);
 }
 
-void Parser::LocationRecorder::RecordLegacyLocation(const Message* descriptor,
+void Parser::LocationRecorder::RecordLegacyLocation(
+    const Message* descriptor,
     DescriptorPool::ErrorCollector::ErrorLocation location) {
   if (parser_->source_location_table_ != NULL) {
     parser_->source_location_table_->Add(
@@ -416,6 +417,14 @@
   }
 }
 
+void Parser::LocationRecorder::RecordLegacyImportLocation(
+    const Message* descriptor, const string& name) {
+  if (parser_->source_location_table_ != nullptr) {
+    parser_->source_location_table_->AddImport(
+        descriptor, name, location_->span(0), location_->span(1));
+  }
+}
+
 int Parser::LocationRecorder::CurrentPathSize() const {
   return location_->path_size();
 }
@@ -433,8 +442,7 @@
     location_->mutable_trailing_comments()->swap(*trailing);
   }
   for (int i = 0; i < detached_comments->size(); ++i) {
-    location_->add_leading_detached_comments()->swap(
-        (*detached_comments)[i]);
+    location_->add_leading_detached_comments()->swap((*detached_comments)[i]);
   }
   detached_comments->clear();
 }
@@ -551,6 +559,8 @@
 
   {
     LocationRecorder root_location(this);
+    root_location.RecordLegacyLocation(file,
+                                       DescriptorPool::ErrorCollector::OTHER);
 
     if (require_syntax_identifier_ || LookingAt("syntax")) {
       if (!ParseSyntaxIdentifier(root_location)) {
@@ -561,8 +571,8 @@
       // Store the syntax into the file.
       if (file != NULL) file->set_syntax(syntax_identifier_);
     } else if (!stop_after_syntax_identifier_) {
-      GOOGLE_LOG(WARNING) << "No syntax specified for the proto file: "
-                   << file->name() << ". Please use 'syntax = \"proto2\";' "
+      GOOGLE_LOG(WARNING) << "No syntax specified for the proto file: " << file->name()
+                   << ". Please use 'syntax = \"proto2\";' "
                    << "or 'syntax = \"proto3\";' to specify a syntax "
                    << "version. (Defaulted to proto2 syntax.)";
       syntax_identifier_ = "proto2";
@@ -610,8 +620,9 @@
   if (syntax != "proto2" && syntax != "proto3" &&
       !stop_after_syntax_identifier_) {
     AddError(syntax_token.line, syntax_token.column,
-      "Unrecognized syntax identifier \"" + syntax + "\".  This parser "
-      "only recognizes \"proto2\" and \"proto3\".");
+             "Unrecognized syntax identifier \"" + syntax +
+                 "\".  This parser "
+                 "only recognizes \"proto2\" and \"proto3\".");
     return false;
   }
 
@@ -625,34 +636,34 @@
     return true;
   } else if (LookingAt("message")) {
     LocationRecorder location(root_location,
-      FileDescriptorProto::kMessageTypeFieldNumber, file->message_type_size());
+                              FileDescriptorProto::kMessageTypeFieldNumber,
+                              file->message_type_size());
     return ParseMessageDefinition(file->add_message_type(), location, file);
   } else if (LookingAt("enum")) {
     LocationRecorder location(root_location,
-      FileDescriptorProto::kEnumTypeFieldNumber, file->enum_type_size());
+                              FileDescriptorProto::kEnumTypeFieldNumber,
+                              file->enum_type_size());
     return ParseEnumDefinition(file->add_enum_type(), location, file);
   } else if (LookingAt("service")) {
     LocationRecorder location(root_location,
-      FileDescriptorProto::kServiceFieldNumber, file->service_size());
+                              FileDescriptorProto::kServiceFieldNumber,
+                              file->service_size());
     return ParseServiceDefinition(file->add_service(), location, file);
   } else if (LookingAt("extend")) {
     LocationRecorder location(root_location,
-        FileDescriptorProto::kExtensionFieldNumber);
-    return ParseExtend(file->mutable_extension(),
-                       file->mutable_message_type(),
-                       root_location,
-                       FileDescriptorProto::kMessageTypeFieldNumber,
-                       location, file);
+                              FileDescriptorProto::kExtensionFieldNumber);
+    return ParseExtend(
+        file->mutable_extension(), file->mutable_message_type(), root_location,
+        FileDescriptorProto::kMessageTypeFieldNumber, location, file);
   } else if (LookingAt("import")) {
     return ParseImport(file->mutable_dependency(),
                        file->mutable_public_dependency(),
-                       file->mutable_weak_dependency(),
-                       root_location, file);
+                       file->mutable_weak_dependency(), root_location, file);
   } else if (LookingAt("package")) {
     return ParsePackage(file, root_location, file);
   } else if (LookingAt("option")) {
     LocationRecorder location(root_location,
-        FileDescriptorProto::kOptionsFieldNumber);
+                              FileDescriptorProto::kOptionsFieldNumber);
     return ParseOption(file->mutable_options(), location, file,
                        OPTION_STATEMENT);
   } else {
@@ -665,15 +676,14 @@
 // Messages
 
 bool Parser::ParseMessageDefinition(
-    DescriptorProto* message,
-    const LocationRecorder& message_location,
+    DescriptorProto* message, const LocationRecorder& message_location,
     const FileDescriptorProto* containing_file) {
   DO(Consume("message"));
   {
     LocationRecorder location(message_location,
                               DescriptorProto::kNameFieldNumber);
-    location.RecordLegacyLocation(
-        message, DescriptorPool::ErrorCollector::NAME);
+    location.RecordLegacyLocation(message,
+                                  DescriptorPool::ErrorCollector::NAME);
     DO(ConsumeIdentifier(message->mutable_name(), "Expected message name."));
   }
   DO(ParseMessageBlock(message, message_location, containing_file));
@@ -702,9 +712,8 @@
 // tag number can only be determined after all options have been parsed.
 void AdjustExtensionRangesWithMaxEndNumber(DescriptorProto* message) {
   const bool is_message_set = IsMessageSetWireFormatMessage(*message);
-  const int max_extension_number = is_message_set ?
-      kint32max :
-      FieldDescriptor::kMaxNumber + 1;
+  const int max_extension_number =
+      is_message_set ? kint32max : FieldDescriptor::kMaxNumber + 1;
   for (int i = 0; i < message->extension_range_size(); ++i) {
     if (message->extension_range(i).end() == kMaxRangeSentinel) {
       message->mutable_extension_range(i)->set_end(max_extension_number);
@@ -717,9 +726,8 @@
 // tag number can only be determined after all options have been parsed.
 void AdjustReservedRangesWithMaxEndNumber(DescriptorProto* message) {
   const bool is_message_set = IsMessageSetWireFormatMessage(*message);
-  const int max_field_number = is_message_set ?
-      kint32max :
-      FieldDescriptor::kMaxNumber + 1;
+  const int max_field_number =
+      is_message_set ? kint32max : FieldDescriptor::kMaxNumber + 1;
   for (int i = 0; i < message->reserved_range_size(); ++i) {
     if (message->reserved_range(i).end() == kMaxRangeSentinel) {
       message->mutable_reserved_range(i)->set_end(max_field_number);
@@ -784,34 +792,28 @@
     LocationRecorder location(message_location,
                               DescriptorProto::kExtensionFieldNumber);
     return ParseExtend(message->mutable_extension(),
-                       message->mutable_nested_type(),
-                       message_location,
-                       DescriptorProto::kNestedTypeFieldNumber,
-                       location, containing_file);
+                       message->mutable_nested_type(), message_location,
+                       DescriptorProto::kNestedTypeFieldNumber, location,
+                       containing_file);
   } else if (LookingAt("option")) {
     LocationRecorder location(message_location,
                               DescriptorProto::kOptionsFieldNumber);
-    return ParseOption(message->mutable_options(), location,
-                       containing_file, OPTION_STATEMENT);
+    return ParseOption(message->mutable_options(), location, containing_file,
+                       OPTION_STATEMENT);
   } else if (LookingAt("oneof")) {
     int oneof_index = message->oneof_decl_size();
-    LocationRecorder oneof_location(message_location,
-                                    DescriptorProto::kOneofDeclFieldNumber,
-                                    oneof_index);
+    LocationRecorder oneof_location(
+        message_location, DescriptorProto::kOneofDeclFieldNumber, oneof_index);
 
-    return ParseOneof(message->add_oneof_decl(), message,
-                      oneof_index, oneof_location, message_location,
-                      containing_file);
+    return ParseOneof(message->add_oneof_decl(), message, oneof_index,
+                      oneof_location, message_location, containing_file);
   } else {
     LocationRecorder location(message_location,
                               DescriptorProto::kFieldFieldNumber,
                               message->field_size());
-    return ParseMessageField(message->add_field(),
-                             message->mutable_nested_type(),
-                             message_location,
-                             DescriptorProto::kNestedTypeFieldNumber,
-                             location,
-                             containing_file);
+    return ParseMessageField(
+        message->add_field(), message->mutable_nested_type(), message_location,
+        DescriptorProto::kNestedTypeFieldNumber, location, containing_file);
   }
 }
 
@@ -839,13 +841,11 @@
 
   return ParseMessageFieldNoLabel(field, messages, parent_location,
                                   location_field_number_for_nested_type,
-                                  field_location,
-                                  containing_file);
+                                  field_location, containing_file);
 }
 
 bool Parser::ParseMessageFieldNoLabel(
-    FieldDescriptorProto* field,
-    RepeatedPtrField<DescriptorProto>* messages,
+    FieldDescriptorProto* field, RepeatedPtrField<DescriptorProto>* messages,
     const LocationRecorder& parent_location,
     int location_field_number_for_nested_type,
     const LocationRecorder& field_location,
@@ -936,8 +936,8 @@
   {
     LocationRecorder location(field_location,
                               FieldDescriptorProto::kNumberFieldNumber);
-    location.RecordLegacyLocation(
-        field, DescriptorPool::ErrorCollector::NUMBER);
+    location.RecordLegacyLocation(field,
+                                  DescriptorPool::ErrorCollector::NUMBER);
     int number;
     DO(ConsumeInteger(&number, "Expected field number."));
     field->set_number(number);
@@ -964,8 +964,8 @@
                                 DescriptorProto::kNameFieldNumber);
       location.StartAt(name_token);
       location.EndAt(name_token);
-      location.RecordLegacyLocation(
-          group, DescriptorPool::ErrorCollector::NAME);
+      location.RecordLegacyLocation(group,
+                                    DescriptorPool::ErrorCollector::NAME);
     }
 
     // The field's type_name also comes from the name.  Confusing!
@@ -981,7 +981,7 @@
     // not use groups; it should use nested messages.
     if (group->name()[0] < 'A' || 'Z' < group->name()[0]) {
       AddError(name_token.line, name_token.column,
-        "Group names must start with a capital letter.");
+               "Group names must start with a capital letter.");
     }
     LowerString(field->mutable_name());
 
@@ -1057,12 +1057,12 @@
         option.name(0).name_part() == "enforce_utf8" &&
         !option.name(0).is_extension()) {
       if (key_field->type() == FieldDescriptorProto::TYPE_STRING) {
-        key_field->mutable_options()->add_uninterpreted_option()
-            ->CopyFrom(option);
+        key_field->mutable_options()->add_uninterpreted_option()->CopyFrom(
+            option);
       }
       if (value_field->type() == FieldDescriptorProto::TYPE_STRING) {
-        value_field->mutable_options()->add_uninterpreted_option()
-            ->CopyFrom(option);
+        value_field->mutable_options()->add_uninterpreted_option()->CopyFrom(
+            option);
       }
     }
   }
@@ -1088,8 +1088,8 @@
       // Like default value, this "json_name" is not an actual option.
       DO(ParseJsonName(field, field_location, containing_file));
     } else {
-      DO(ParseOption(field->mutable_options(), location,
-                     containing_file, OPTION_ASSIGNMENT));
+      DO(ParseOption(field->mutable_options(), location, containing_file,
+                     OPTION_ASSIGNMENT));
     }
   } while (TryConsume(","));
 
@@ -1098,8 +1098,7 @@
 }
 
 bool Parser::ParseDefaultAssignment(
-    FieldDescriptorProto* field,
-    const LocationRecorder& field_location,
+    FieldDescriptorProto* field, const LocationRecorder& field_location,
     const FileDescriptorProto* containing_file) {
   if (field->has_default_value()) {
     AddError("Already set option \"default\".");
@@ -1111,8 +1110,8 @@
 
   LocationRecorder location(field_location,
                             FieldDescriptorProto::kDefaultValueFieldNumber);
-  location.RecordLegacyLocation(
-      field, DescriptorPool::ErrorCollector::DEFAULT_VALUE);
+  location.RecordLegacyLocation(field,
+                                DescriptorPool::ErrorCollector::DEFAULT_VALUE);
   std::string* default_value = field->mutable_default_value();
 
   if (!field->has_type()) {
@@ -1211,7 +1210,8 @@
       // Note: When file opton java_string_check_utf8 is true, if a
       // non-string representation (eg byte[]) is later supported, it must
       // be checked for UTF-8-ness.
-      DO(ConsumeString(default_value, "Expected string for field default "
+      DO(ConsumeString(default_value,
+                       "Expected string for field default "
                        "value."));
       break;
 
@@ -1221,8 +1221,9 @@
       break;
 
     case FieldDescriptorProto::TYPE_ENUM:
-      DO(ConsumeIdentifier(default_value, "Expected enum identifier for field "
-                                          "default value."));
+      DO(ConsumeIdentifier(default_value,
+                           "Expected enum identifier for field "
+                           "default value."));
       break;
 
     case FieldDescriptorProto::TYPE_MESSAGE:
@@ -1234,34 +1235,37 @@
   return true;
 }
 
-bool Parser::ParseJsonName(
-    FieldDescriptorProto* field,
-    const LocationRecorder& field_location,
-    const FileDescriptorProto* containing_file) {
+bool Parser::ParseJsonName(FieldDescriptorProto* field,
+                           const LocationRecorder& field_location,
+                           const FileDescriptorProto* containing_file) {
   if (field->has_json_name()) {
     AddError("Already set option \"json_name\".");
     field->clear_json_name();
   }
 
+  LocationRecorder location(field_location,
+                            FieldDescriptorProto::kJsonNameFieldNumber);
+  location.RecordLegacyLocation(field,
+                                DescriptorPool::ErrorCollector::OPTION_NAME);
+
   DO(Consume("json_name"));
   DO(Consume("="));
 
-  LocationRecorder location(field_location,
-                            FieldDescriptorProto::kJsonNameFieldNumber);
-  location.RecordLegacyLocation(
+  LocationRecorder value_location(location);
+  value_location.RecordLegacyLocation(
       field, DescriptorPool::ErrorCollector::OPTION_VALUE);
+
   DO(ConsumeString(field->mutable_json_name(),
                    "Expected string for JSON name."));
   return true;
 }
 
-
 bool Parser::ParseOptionNamePart(UninterpretedOption* uninterpreted_option,
                                  const LocationRecorder& part_location,
                                  const FileDescriptorProto* containing_file) {
   UninterpretedOption::NamePart* name = uninterpreted_option->add_name();
   std::string identifier;  // We parse identifiers into this string.
-  if (LookingAt("(")) {  // This is an extension.
+  if (LookingAt("(")) {    // This is an extension.
     DO(Consume("("));
 
     {
@@ -1325,8 +1329,8 @@
                          const FileDescriptorProto* containing_file,
                          OptionStyle style) {
   // Create an entry in the uninterpreted_option field.
-  const FieldDescriptor* uninterpreted_option_field = options->GetDescriptor()->
-      FindFieldByName("uninterpreted_option");
+  const FieldDescriptor* uninterpreted_option_field =
+      options->GetDescriptor()->FindFieldByName("uninterpreted_option");
   GOOGLE_CHECK(uninterpreted_option_field != NULL)
       << "No field named \"uninterpreted_option\" in the Options proto.";
 
@@ -1340,9 +1344,9 @@
     DO(Consume("option"));
   }
 
-  UninterpretedOption* uninterpreted_option = down_cast<UninterpretedOption*>(
-      options->GetReflection()->AddMessage(options,
-                                           uninterpreted_option_field));
+  UninterpretedOption* uninterpreted_option =
+      down_cast<UninterpretedOption*>(options->GetReflection()->AddMessage(
+          options, uninterpreted_option_field));
 
   // Parse dot-separated name.
   {
@@ -1473,8 +1477,8 @@
                               message->extension_range_size());
 
     DescriptorProto::ExtensionRange* range = message->add_extension_range();
-    location.RecordLegacyLocation(
-        range, DescriptorPool::ErrorCollector::NUMBER);
+    location.RecordLegacyLocation(range,
+                                  DescriptorPool::ErrorCollector::NUMBER);
 
     int start, end;
     io::Tokenizer::Token start_token;
@@ -1539,8 +1543,8 @@
     // Then copy the extension range options to all of the other ranges we've
     // parsed.
     for (int i = old_range_size + 1; i < message->extension_range_size(); i++) {
-      message->mutable_extension_range(i)->mutable_options()
-          ->CopyFrom(*options);
+      message->mutable_extension_range(i)->mutable_options()->CopyFrom(
+          *options);
     }
     // and copy source locations to the other ranges, too
     for (int i = old_range_size; i < message->extension_range_size(); i++) {
@@ -1604,9 +1608,8 @@
       LocationRecorder start_location(
           location, DescriptorProto::ReservedRange::kStartFieldNumber);
       start_token = input_->current();
-      DO(ConsumeInteger(&start, (first ?
-                                 "Expected field name or number range." :
-                                 "Expected field number range.")));
+      DO(ConsumeInteger(&start, (first ? "Expected field name or number range."
+                                       : "Expected field number range.")));
     }
 
     if (TryConsume("to")) {
@@ -1683,9 +1686,9 @@
       LocationRecorder start_location(
           location, EnumDescriptorProto::EnumReservedRange::kStartFieldNumber);
       start_token = input_->current();
-      DO(ConsumeSignedInteger(&start, (first ?
-                                 "Expected enum value or number range." :
-                                 "Expected enum number range.")));
+      DO(ConsumeSignedInteger(&start,
+                              (first ? "Expected enum value or number range."
+                                     : "Expected enum number range.")));
     }
 
     if (TryConsume("to")) {
@@ -1761,8 +1764,7 @@
     field->set_extendee(extendee);
 
     if (!ParseMessageField(field, messages, parent_location,
-                           location_field_number_for_nested_type,
-                           location,
+                           location_field_number_for_nested_type, location,
                            containing_file)) {
       // This statement failed to parse.  Skip it, but keep looping to parse
       // other statements.
@@ -1774,8 +1776,7 @@
 }
 
 bool Parser::ParseOneof(OneofDescriptorProto* oneof_decl,
-                        DescriptorProto* containing_type,
-                        int oneof_index,
+                        DescriptorProto* containing_type, int oneof_index,
                         const LocationRecorder& oneof_location,
                         const LocationRecorder& containing_type_location,
                         const FileDescriptorProto* containing_file) {
@@ -1807,11 +1808,11 @@
 
     // Print a nice error if the user accidentally tries to place a label
     // on an individual member of a oneof.
-    if (LookingAt("required") ||
-        LookingAt("optional") ||
+    if (LookingAt("required") || LookingAt("optional") ||
         LookingAt("repeated")) {
-      AddError("Fields in oneofs must not have labels (required / optional "
-               "/ repeated).");
+      AddError(
+          "Fields in oneofs must not have labels (required / optional "
+          "/ repeated).");
       // We can continue parsing here because we understand what the user
       // meant.  The error report will still make parsing fail overall.
       input_->Next();
@@ -1825,12 +1826,10 @@
     field->set_label(FieldDescriptorProto::LABEL_OPTIONAL);
     field->set_oneof_index(oneof_index);
 
-    if (!ParseMessageFieldNoLabel(field,
-                                  containing_type->mutable_nested_type(),
+    if (!ParseMessageFieldNoLabel(field, containing_type->mutable_nested_type(),
                                   containing_type_location,
                                   DescriptorProto::kNestedTypeFieldNumber,
-                                  field_location,
-                                  containing_file)) {
+                                  field_location, containing_file)) {
       // This statement failed to parse.  Skip it, but keep looping to parse
       // other statements.
       SkipStatement();
@@ -1851,8 +1850,8 @@
   {
     LocationRecorder location(enum_location,
                               EnumDescriptorProto::kNameFieldNumber);
-    location.RecordLegacyLocation(
-        enum_type, DescriptorPool::ErrorCollector::NAME);
+    location.RecordLegacyLocation(enum_type,
+                                  DescriptorPool::ErrorCollector::NAME);
     DO(ConsumeIdentifier(enum_type->mutable_name(), "Expected enum name."));
   }
 
@@ -1893,13 +1892,14 @@
   } else if (LookingAt("option")) {
     LocationRecorder location(enum_location,
                               EnumDescriptorProto::kOptionsFieldNumber);
-    return ParseOption(enum_type->mutable_options(), location,
-                       containing_file, OPTION_STATEMENT);
+    return ParseOption(enum_type->mutable_options(), location, containing_file,
+                       OPTION_STATEMENT);
   } else if (LookingAt("reserved")) {
     return ParseReserved(enum_type, enum_location);
   } else {
     LocationRecorder location(enum_location,
-        EnumDescriptorProto::kValueFieldNumber, enum_type->value_size());
+                              EnumDescriptorProto::kValueFieldNumber,
+                              enum_type->value_size());
     return ParseEnumConstant(enum_type->add_value(), location, containing_file);
   }
 }
@@ -1911,8 +1911,8 @@
   {
     LocationRecorder location(enum_value_location,
                               EnumValueDescriptorProto::kNameFieldNumber);
-    location.RecordLegacyLocation(
-        enum_value, DescriptorPool::ErrorCollector::NAME);
+    location.RecordLegacyLocation(enum_value,
+                                  DescriptorPool::ErrorCollector::NAME);
     DO(ConsumeIdentifier(enum_value->mutable_name(),
                          "Expected enum constant name."));
   }
@@ -1921,10 +1921,10 @@
 
   // Parse value.
   {
-    LocationRecorder location(
-        enum_value_location, EnumValueDescriptorProto::kNumberFieldNumber);
-    location.RecordLegacyLocation(
-        enum_value, DescriptorPool::ErrorCollector::NUMBER);
+    LocationRecorder location(enum_value_location,
+                              EnumValueDescriptorProto::kNumberFieldNumber);
+    location.RecordLegacyLocation(enum_value,
+                                  DescriptorPool::ErrorCollector::NUMBER);
 
     int number;
     DO(ConsumeSignedInteger(&number, "Expected integer."));
@@ -1945,14 +1945,14 @@
     const FileDescriptorProto* containing_file) {
   if (!LookingAt("[")) return true;
 
-  LocationRecorder location(
-      enum_value_location, EnumValueDescriptorProto::kOptionsFieldNumber);
+  LocationRecorder location(enum_value_location,
+                            EnumValueDescriptorProto::kOptionsFieldNumber);
 
   DO(Consume("["));
 
   do {
-    DO(ParseOption(value->mutable_options(), location,
-                   containing_file, OPTION_ASSIGNMENT));
+    DO(ParseOption(value->mutable_options(), location, containing_file,
+                   OPTION_ASSIGNMENT));
   } while (TryConsume(","));
 
   DO(Consume("]"));
@@ -1963,16 +1963,15 @@
 // Services
 
 bool Parser::ParseServiceDefinition(
-    ServiceDescriptorProto* service,
-    const LocationRecorder& service_location,
+    ServiceDescriptorProto* service, const LocationRecorder& service_location,
     const FileDescriptorProto* containing_file) {
   DO(Consume("service"));
 
   {
     LocationRecorder location(service_location,
                               ServiceDescriptorProto::kNameFieldNumber);
-    location.RecordLegacyLocation(
-        service, DescriptorPool::ErrorCollector::NAME);
+    location.RecordLegacyLocation(service,
+                                  DescriptorPool::ErrorCollector::NAME);
     DO(ConsumeIdentifier(service->mutable_name(), "Expected service name."));
   }
 
@@ -2008,13 +2007,14 @@
     // empty statement; ignore
     return true;
   } else if (LookingAt("option")) {
-    LocationRecorder location(
-        service_location, ServiceDescriptorProto::kOptionsFieldNumber);
-    return ParseOption(service->mutable_options(), location,
-                       containing_file, OPTION_STATEMENT);
+    LocationRecorder location(service_location,
+                              ServiceDescriptorProto::kOptionsFieldNumber);
+    return ParseOption(service->mutable_options(), location, containing_file,
+                       OPTION_STATEMENT);
   } else {
     LocationRecorder location(service_location,
-        ServiceDescriptorProto::kMethodFieldNumber, service->method_size());
+                              ServiceDescriptorProto::kMethodFieldNumber,
+                              service->method_size());
     return ParseServiceMethod(service->add_method(), location, containing_file);
   }
 }
@@ -2027,8 +2027,7 @@
   {
     LocationRecorder location(method_location,
                               MethodDescriptorProto::kNameFieldNumber);
-    location.RecordLegacyLocation(
-        method, DescriptorPool::ErrorCollector::NAME);
+    location.RecordLegacyLocation(method, DescriptorPool::ErrorCollector::NAME);
     DO(ConsumeIdentifier(method->mutable_name(), "Expected method name."));
   }
 
@@ -2038,16 +2037,16 @@
     if (LookingAt("stream")) {
       LocationRecorder location(
           method_location, MethodDescriptorProto::kClientStreamingFieldNumber);
-      location.RecordLegacyLocation(
-          method, DescriptorPool::ErrorCollector::OTHER);
+      location.RecordLegacyLocation(method,
+                                    DescriptorPool::ErrorCollector::OTHER);
       method->set_client_streaming(true);
       DO(Consume("stream"));
 
     }
     LocationRecorder location(method_location,
                               MethodDescriptorProto::kInputTypeFieldNumber);
-    location.RecordLegacyLocation(
-        method, DescriptorPool::ErrorCollector::INPUT_TYPE);
+    location.RecordLegacyLocation(method,
+                                  DescriptorPool::ErrorCollector::INPUT_TYPE);
     DO(ParseUserDefinedType(method->mutable_input_type()));
   }
   DO(Consume(")"));
@@ -2059,16 +2058,16 @@
     if (LookingAt("stream")) {
       LocationRecorder location(
           method_location, MethodDescriptorProto::kServerStreamingFieldNumber);
-      location.RecordLegacyLocation(
-          method, DescriptorPool::ErrorCollector::OTHER);
+      location.RecordLegacyLocation(method,
+                                    DescriptorPool::ErrorCollector::OTHER);
       DO(Consume("stream"));
       method->set_server_streaming(true);
 
     }
     LocationRecorder location(method_location,
                               MethodDescriptorProto::kOutputTypeFieldNumber);
-    location.RecordLegacyLocation(
-        method, DescriptorPool::ErrorCollector::OUTPUT_TYPE);
+    location.RecordLegacyLocation(method,
+                                  DescriptorPool::ErrorCollector::OUTPUT_TYPE);
     DO(ParseUserDefinedType(method->mutable_output_type()));
   }
   DO(Consume(")"));
@@ -2101,10 +2100,9 @@
     if (TryConsumeEndOfDeclaration(";", NULL)) {
       // empty statement; ignore
     } else {
-      LocationRecorder location(parent_location,
-                                optionsFieldNumber);
-      if (!ParseOption(mutable_options, location,
-                       containing_file, OPTION_STATEMENT)) {
+      LocationRecorder location(parent_location, optionsFieldNumber);
+      if (!ParseOption(mutable_options, location, containing_file,
+                       OPTION_STATEMENT)) {
         // This statement failed to parse.  Skip it, but keep looping to
         // parse other statements.
         SkipStatement();
@@ -2231,12 +2229,17 @@
     LocationRecorder weak_location(
         root_location, FileDescriptorProto::kWeakDependencyFieldNumber,
         weak_dependency->size());
+    weak_location.RecordLegacyImportLocation(containing_file, "weak");
     DO(Consume("weak"));
     *weak_dependency->Add() = dependency->size();
   }
 
-  DO(ConsumeString(dependency->Add(),
+  string import_file;
+  DO(ConsumeString(&import_file,
                    "Expected a string naming the file to import."));
+  *dependency->Add() = import_file;
+  location.RecordLegacyImportLocation(containing_file, import_file);
+
   DO(ConsumeEndOfDeclaration(";", &location));
 
   return true;
@@ -2249,16 +2252,32 @@
 
 bool SourceLocationTable::Find(
     const Message* descriptor,
-    DescriptorPool::ErrorCollector::ErrorLocation location,
-    int* line, int* column) const {
+    DescriptorPool::ErrorCollector::ErrorLocation location, int* line,
+    int* column) const {
   const std::pair<int, int>* result =
       FindOrNull(location_map_, std::make_pair(descriptor, location));
   if (result == NULL) {
-    *line   = -1;
+    *line = -1;
     *column = 0;
     return false;
   } else {
-    *line   = result->first;
+    *line = result->first;
+    *column = result->second;
+    return true;
+  }
+}
+
+bool SourceLocationTable::FindImport(const Message* descriptor,
+                                     const string& name, int* line,
+                                     int* column) const {
+  const std::pair<int, int>* result =
+      FindOrNull(import_location_map_, std::make_pair(descriptor, name));
+  if (result == nullptr) {
+    *line = -1;
+    *column = 0;
+    return false;
+  } else {
+    *line = result->first;
     *column = result->second;
     return true;
   }
@@ -2266,16 +2285,20 @@
 
 void SourceLocationTable::Add(
     const Message* descriptor,
-    DescriptorPool::ErrorCollector::ErrorLocation location,
-    int line, int column) {
+    DescriptorPool::ErrorCollector::ErrorLocation location, int line,
+    int column) {
   location_map_[std::make_pair(descriptor, location)] =
       std::make_pair(line, column);
 }
 
-void SourceLocationTable::Clear() {
-  location_map_.clear();
+void SourceLocationTable::AddImport(const Message* descriptor,
+                                    const string& name, int line, int column) {
+  import_location_map_[std::make_pair(descriptor, name)] =
+      std::make_pair(line, column);
 }
 
+void SourceLocationTable::Clear() { location_map_.clear(); }
+
 }  // namespace compiler
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/compiler/parser.h b/src/google/protobuf/compiler/parser.h
index a5cb7a8..6ec19a1 100644
--- a/src/google/protobuf/compiler/parser.h
+++ b/src/google/protobuf/compiler/parser.h
@@ -188,13 +188,13 @@
   //   have been passed around by const reference, for no particularly good
   //   reason.  We should probably go through and change them all to mutable
   //   pointer to make this more intuitive.
-  bool TryConsumeEndOfDeclaration(
-      const char* text, const LocationRecorder* location);
-  bool TryConsumeEndOfDeclarationFinishScope(
-      const char* text, const LocationRecorder* location);
+  bool TryConsumeEndOfDeclaration(const char* text,
+                                  const LocationRecorder* location);
+  bool TryConsumeEndOfDeclarationFinishScope(const char* text,
+                                             const LocationRecorder* location);
 
-  bool ConsumeEndOfDeclaration(
-      const char* text, const LocationRecorder* location);
+  bool ConsumeEndOfDeclaration(const char* text,
+                               const LocationRecorder* location);
 
   // -----------------------------------------------------------------
   // Error logging helpers
@@ -254,8 +254,11 @@
     // was passed to RecordSourceLocationsTo(), if any.  SourceLocationTable
     // is an older way of keeping track of source locations which is still
     // used in some places.
-    void RecordLegacyLocation(const Message* descriptor,
+    void RecordLegacyLocation(
+        const Message* descriptor,
         DescriptorPool::ErrorCollector::ErrorLocation location);
+    void RecordLegacyImportLocation(const Message* descriptor,
+                                    const string& name);
 
     // Returns the number of path components in the recorder's current location.
     int CurrentPathSize() const;
@@ -402,8 +405,7 @@
   // oneof_decl->label() since it will have had to parse the label before it
   // knew it was parsing a oneof.
   bool ParseOneof(OneofDescriptorProto* oneof_decl,
-                  DescriptorProto* containing_type,
-                  int oneof_index,
+                  DescriptorProto* containing_type, int oneof_index,
                   const LocationRecorder& oneof_location,
                   const LocationRecorder& containing_type_location,
                   const FileDescriptorProto* containing_file);
@@ -467,8 +469,7 @@
   // Parse a single option name/value pair, e.g. "ctype = CORD".  The name
   // identifies a field of the given Message, and the value of that field
   // is set to the parsed value.
-  bool ParseOption(Message* options,
-                   const LocationRecorder& options_location,
+  bool ParseOption(Message* options, const LocationRecorder& options_location,
                    const FileDescriptorProto* containing_file,
                    OptionStyle style);
 
@@ -560,22 +561,29 @@
   // location" in the ErrorCollector interface).  Returns true if found, false
   // otherwise.
   bool Find(const Message* descriptor,
-            DescriptorPool::ErrorCollector::ErrorLocation location,
-            int* line, int* column) const;
+            DescriptorPool::ErrorCollector::ErrorLocation location, int* line,
+            int* column) const;
+  bool FindImport(const Message* descriptor, const string& name, int* line,
+                  int* column) const;
 
   // Adds a location to the table.
   void Add(const Message* descriptor,
-           DescriptorPool::ErrorCollector::ErrorLocation location,
-           int line, int column);
+           DescriptorPool::ErrorCollector::ErrorLocation location, int line,
+           int column);
+  void AddImport(const Message* descriptor, const string& name, int line,
+                 int column);
 
   // Clears the contents of the table.
   void Clear();
 
  private:
   typedef std::map<
-    std::pair<const Message*, DescriptorPool::ErrorCollector::ErrorLocation>,
-    std::pair<int, int> > LocationMap;
+      std::pair<const Message*, DescriptorPool::ErrorCollector::ErrorLocation>,
+      std::pair<int, int> >
+      LocationMap;
   LocationMap location_map_;
+  std::map<std::pair<const Message*, string>, std::pair<int, int> >
+      import_location_map_;
 };
 
 }  // namespace compiler
diff --git a/src/google/protobuf/compiler/parser_unittest.cc b/src/google/protobuf/compiler/parser_unittest.cc
index 98280f8..cf7a85c 100644
--- a/src/google/protobuf/compiler/parser_unittest.cc
+++ b/src/google/protobuf/compiler/parser_unittest.cc
@@ -32,10 +32,10 @@
 //  Based on original Protocol Buffers design by
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
-#include <memory>
-#include <vector>
 #include <algorithm>
 #include <map>
+#include <memory>
+#include <vector>
 
 #include <google/protobuf/compiler/parser.h>
 
@@ -69,8 +69,7 @@
 
   // implements ErrorCollector ---------------------------------------
   void AddError(int line, int column, const std::string& message) {
-    strings::SubstituteAndAppend(&text_, "$0:$1: $2\n",
-                                 line, column, message);
+    strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", line, column, message);
   }
 };
 
@@ -78,8 +77,8 @@
  public:
   MockValidationErrorCollector(const SourceLocationTable& source_locations,
                                io::ErrorCollector* wrapped_collector)
-    : source_locations_(source_locations),
-      wrapped_collector_(wrapped_collector) {}
+      : source_locations_(source_locations),
+        wrapped_collector_(wrapped_collector) {}
   ~MockValidationErrorCollector() {}
 
   // implements ErrorCollector ---------------------------------------
@@ -87,7 +86,11 @@
                 const Message* descriptor, ErrorLocation location,
                 const std::string& message) {
     int line, column;
-    source_locations_.Find(descriptor, location, &line, &column);
+    if (location == DescriptorPool::ErrorCollector::IMPORT) {
+      source_locations_.FindImport(descriptor, element_name, &line, &column);
+    } else {
+      source_locations_.Find(descriptor, location, &line, &column);
+    }
     wrapped_collector_->AddError(line, column, message);
   }
 
@@ -98,8 +101,7 @@
 
 class ParserTest : public testing::Test {
  protected:
-  ParserTest()
-    : require_syntax_identifier_(false) {}
+  ParserTest() : require_syntax_identifier_(false) {}
 
   // Set up the parser to parse the given text.
   void SetupParser(const char* text) {
@@ -164,10 +166,10 @@
     EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);
     ASSERT_EQ("", error_collector_.text_);
 
-    MockValidationErrorCollector validation_error_collector(
-      source_locations, &error_collector_);
+    MockValidationErrorCollector validation_error_collector(source_locations,
+                                                            &error_collector_);
     EXPECT_TRUE(pool_.BuildFileCollectingErrors(
-      file, &validation_error_collector) == NULL);
+                    file, &validation_error_collector) == NULL);
     EXPECT_EQ(expected_errors, error_collector_.text_);
   }
 
@@ -184,9 +186,9 @@
 
 TEST_F(ParserTest, StopAfterSyntaxIdentifier) {
   SetupParser(
-    "// blah\n"
-    "syntax = \"foobar\";\n"
-    "this line will not be parsed\n");
+      "// blah\n"
+      "syntax = \"foobar\";\n"
+      "this line will not be parsed\n");
   parser_->SetStopAfterSyntaxIdentifier(true);
   EXPECT_TRUE(parser_->Parse(input_.get(), NULL));
   EXPECT_EQ("", error_collector_.text_);
@@ -195,8 +197,8 @@
 
 TEST_F(ParserTest, StopAfterOmittedSyntaxIdentifier) {
   SetupParser(
-    "// blah\n"
-    "this line will not be parsed\n");
+      "// blah\n"
+      "this line will not be parsed\n");
   parser_->SetStopAfterSyntaxIdentifier(true);
   EXPECT_TRUE(parser_->Parse(input_.get(), NULL));
   EXPECT_EQ("", error_collector_.text_);
@@ -205,8 +207,8 @@
 
 TEST_F(ParserTest, StopAfterSyntaxIdentifierWithErrors) {
   SetupParser(
-    "// blah\n"
-    "syntax = error;\n");
+      "// blah\n"
+      "syntax = error;\n");
   parser_->SetStopAfterSyntaxIdentifier(true);
   EXPECT_FALSE(parser_->Parse(input_.get(), NULL));
   EXPECT_EQ("1:9: Expected syntax identifier.\n", error_collector_.text_);
@@ -217,8 +219,8 @@
   FileDescriptorProto file;
   CaptureTestStderr();
   EXPECT_TRUE(parser_->Parse(input_.get(), &file));
-  EXPECT_TRUE(
-      GetCapturedTestStderr().find("No syntax specified") != string::npos);
+  EXPECT_TRUE(GetCapturedTestStderr().find("No syntax specified") !=
+              string::npos);
 }
 
 // ===================================================================
@@ -226,22 +228,25 @@
 typedef ParserTest ParseMessageTest;
 
 TEST_F(ParseMessageTest, IgnoreBOM) {
-  char input[] = "   message TestMessage {\n"
+  char input[] =
+      "   message TestMessage {\n"
       "  required int32 foo = 1;\n"
       "}\n";
   // Set UTF-8 BOM.
   input[0] = (char)0xEF;
   input[1] = (char)0xBB;
   input[2] = (char)0xBF;
-  ExpectParsesTo(input,
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
-    "}");
+  ExpectParsesTo(
+      input,
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, BOMError) {
-  char input[] = "   message TestMessage {\n"
+  char input[] =
+      "   message TestMessage {\n"
       "  required int32 foo = 1;\n"
       "}\n";
   input[0] = (char)0xEF;
@@ -253,590 +258,634 @@
 
 TEST_F(ParseMessageTest, SimpleMessage) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  required int32 foo = 1;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  required int32 foo = 1;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, ImplicitSyntaxIdentifier) {
   require_syntax_identifier_ = false;
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  required int32 foo = 1;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  required int32 foo = 1;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
+      "}");
   EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier());
 }
 
 TEST_F(ParseMessageTest, ExplicitSyntaxIdentifier) {
   ExpectParsesTo(
-    "syntax = \"proto2\";\n"
-    "message TestMessage {\n"
-    "  required int32 foo = 1;\n"
-    "}\n",
+      "syntax = \"proto2\";\n"
+      "message TestMessage {\n"
+      "  required int32 foo = 1;\n"
+      "}\n",
 
-    "syntax: 'proto2' "
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
-    "}");
+      "syntax: 'proto2' "
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
+      "}");
   EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier());
 }
 
 TEST_F(ParseMessageTest, ExplicitRequiredSyntaxIdentifier) {
   require_syntax_identifier_ = true;
   ExpectParsesTo(
-    "syntax = \"proto2\";\n"
-    "message TestMessage {\n"
-    "  required int32 foo = 1;\n"
-    "}\n",
+      "syntax = \"proto2\";\n"
+      "message TestMessage {\n"
+      "  required int32 foo = 1;\n"
+      "}\n",
 
-    "syntax: 'proto2' "
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
-    "}");
+      "syntax: 'proto2' "
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
+      "}");
   EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier());
 }
 
 TEST_F(ParseMessageTest, SimpleFields) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  required int32 foo = 15;\n"
-    "  optional int32 bar = 34;\n"
-    "  repeated int32 baz = 3;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  required int32 foo = 15;\n"
+      "  optional int32 bar = 34;\n"
+      "  repeated int32 baz = 3;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:15 }"
-    "  field { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:34 }"
-    "  field { name:\"baz\" label:LABEL_REPEATED type:TYPE_INT32 number:3  }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:15 }"
+      "  field { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:34 }"
+      "  field { name:\"baz\" label:LABEL_REPEATED type:TYPE_INT32 number:3  }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, PrimitiveFieldTypes) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  required int32    foo = 1;\n"
-    "  required int64    foo = 1;\n"
-    "  required uint32   foo = 1;\n"
-    "  required uint64   foo = 1;\n"
-    "  required sint32   foo = 1;\n"
-    "  required sint64   foo = 1;\n"
-    "  required fixed32  foo = 1;\n"
-    "  required fixed64  foo = 1;\n"
-    "  required sfixed32 foo = 1;\n"
-    "  required sfixed64 foo = 1;\n"
-    "  required float    foo = 1;\n"
-    "  required double   foo = 1;\n"
-    "  required string   foo = 1;\n"
-    "  required bytes    foo = 1;\n"
-    "  required bool     foo = 1;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  required int32    foo = 1;\n"
+      "  required int64    foo = 1;\n"
+      "  required uint32   foo = 1;\n"
+      "  required uint64   foo = 1;\n"
+      "  required sint32   foo = 1;\n"
+      "  required sint64   foo = 1;\n"
+      "  required fixed32  foo = 1;\n"
+      "  required fixed64  foo = 1;\n"
+      "  required sfixed32 foo = 1;\n"
+      "  required sfixed64 foo = 1;\n"
+      "  required float    foo = 1;\n"
+      "  required double   foo = 1;\n"
+      "  required string   foo = 1;\n"
+      "  required bytes    foo = 1;\n"
+      "  required bool     foo = 1;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32    number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT64    number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT32   number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT64   number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT32   number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT64   number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED32  number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED64  number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED32 number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED64 number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FLOAT    number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_DOUBLE   number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_STRING   number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BYTES    number:1 }"
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BOOL     number:1 }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32    number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT64    number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT32   number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT64   number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT32   number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT64   number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED32  number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED64  number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED32 number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED64 number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FLOAT    number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_DOUBLE   number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_STRING   number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BYTES    number:1 "
+      "}"
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BOOL     number:1 "
+      "}"
+      "}");
 }
 
 TEST_F(ParseMessageTest, FieldDefaults) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  required int32  foo = 1 [default=  1  ];\n"
-    "  required int32  foo = 1 [default= -2  ];\n"
-    "  required int64  foo = 1 [default=  3  ];\n"
-    "  required int64  foo = 1 [default= -4  ];\n"
-    "  required uint32 foo = 1 [default=  5  ];\n"
-    "  required uint64 foo = 1 [default=  6  ];\n"
-    "  required float  foo = 1 [default=  7.5];\n"
-    "  required float  foo = 1 [default= -8.5];\n"
-    "  required float  foo = 1 [default=  9  ];\n"
-    "  required double foo = 1 [default= 10.5];\n"
-    "  required double foo = 1 [default=-11.5];\n"
-    "  required double foo = 1 [default= 12  ];\n"
-    "  required double foo = 1 [default= inf ];\n"
-    "  required double foo = 1 [default=-inf ];\n"
-    "  required double foo = 1 [default= nan ];\n"
-    "  required string foo = 1 [default='13\\001'];\n"
-    "  required string foo = 1 [default='a' \"b\" \n \"c\"];\n"
-    "  required bytes  foo = 1 [default='14\\002'];\n"
-    "  required bytes  foo = 1 [default='a' \"b\" \n 'c'];\n"
-    "  required bool   foo = 1 [default=true ];\n"
-    "  required Foo    foo = 1 [default=FOO  ];\n"
+      "message TestMessage {\n"
+      "  required int32  foo = 1 [default=  1  ];\n"
+      "  required int32  foo = 1 [default= -2  ];\n"
+      "  required int64  foo = 1 [default=  3  ];\n"
+      "  required int64  foo = 1 [default= -4  ];\n"
+      "  required uint32 foo = 1 [default=  5  ];\n"
+      "  required uint64 foo = 1 [default=  6  ];\n"
+      "  required float  foo = 1 [default=  7.5];\n"
+      "  required float  foo = 1 [default= -8.5];\n"
+      "  required float  foo = 1 [default=  9  ];\n"
+      "  required double foo = 1 [default= 10.5];\n"
+      "  required double foo = 1 [default=-11.5];\n"
+      "  required double foo = 1 [default= 12  ];\n"
+      "  required double foo = 1 [default= inf ];\n"
+      "  required double foo = 1 [default=-inf ];\n"
+      "  required double foo = 1 [default= nan ];\n"
+      "  required string foo = 1 [default='13\\001'];\n"
+      "  required string foo = 1 [default='a' \"b\" \n \"c\"];\n"
+      "  required bytes  foo = 1 [default='14\\002'];\n"
+      "  required bytes  foo = 1 [default='a' \"b\" \n 'c'];\n"
+      "  required bool   foo = 1 [default=true ];\n"
+      "  required Foo    foo = 1 [default=FOO  ];\n"
 
-    "  required int32  foo = 1 [default= 0x7FFFFFFF];\n"
-    "  required int32  foo = 1 [default=-0x80000000];\n"
-    "  required uint32 foo = 1 [default= 0xFFFFFFFF];\n"
-    "  required int64  foo = 1 [default= 0x7FFFFFFFFFFFFFFF];\n"
-    "  required int64  foo = 1 [default=-0x8000000000000000];\n"
-    "  required uint64 foo = 1 [default= 0xFFFFFFFFFFFFFFFF];\n"
-    "  required double foo = 1 [default= 0xabcd];\n"
-    "}\n",
+      "  required int32  foo = 1 [default= 0x7FFFFFFF];\n"
+      "  required int32  foo = 1 [default=-0x80000000];\n"
+      "  required uint32 foo = 1 [default= 0xFFFFFFFF];\n"
+      "  required int64  foo = 1 [default= 0x7FFFFFFFFFFFFFFF];\n"
+      "  required int64  foo = 1 [default=-0x8000000000000000];\n"
+      "  required uint64 foo = 1 [default= 0xFFFFFFFFFFFFFFFF];\n"
+      "  required double foo = 1 [default= 0xabcd];\n"
+      "}\n",
 
 #define ETC "name:\"foo\" label:LABEL_REQUIRED number:1"
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { type:TYPE_INT32   default_value:\"1\"         " ETC " }"
-    "  field { type:TYPE_INT32   default_value:\"-2\"        " ETC " }"
-    "  field { type:TYPE_INT64   default_value:\"3\"         " ETC " }"
-    "  field { type:TYPE_INT64   default_value:\"-4\"        " ETC " }"
-    "  field { type:TYPE_UINT32  default_value:\"5\"         " ETC " }"
-    "  field { type:TYPE_UINT64  default_value:\"6\"         " ETC " }"
-    "  field { type:TYPE_FLOAT   default_value:\"7.5\"       " ETC " }"
-    "  field { type:TYPE_FLOAT   default_value:\"-8.5\"      " ETC " }"
-    "  field { type:TYPE_FLOAT   default_value:\"9\"         " ETC " }"
-    "  field { type:TYPE_DOUBLE  default_value:\"10.5\"      " ETC " }"
-    "  field { type:TYPE_DOUBLE  default_value:\"-11.5\"     " ETC " }"
-    "  field { type:TYPE_DOUBLE  default_value:\"12\"        " ETC " }"
-    "  field { type:TYPE_DOUBLE  default_value:\"inf\"       " ETC " }"
-    "  field { type:TYPE_DOUBLE  default_value:\"-inf\"      " ETC " }"
-    "  field { type:TYPE_DOUBLE  default_value:\"nan\"       " ETC " }"
-    "  field { type:TYPE_STRING  default_value:\"13\\001\"   " ETC " }"
-    "  field { type:TYPE_STRING  default_value:\"abc\"       " ETC " }"
-    "  field { type:TYPE_BYTES   default_value:\"14\\\\002\" " ETC " }"
-    "  field { type:TYPE_BYTES   default_value:\"abc\"       " ETC " }"
-    "  field { type:TYPE_BOOL    default_value:\"true\"      " ETC " }"
-    "  field { type_name:\"Foo\" default_value:\"FOO\"       " ETC " }"
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { type:TYPE_INT32   default_value:\"1\"         " ETC
+      " }"
+      "  field { type:TYPE_INT32   default_value:\"-2\"        " ETC
+      " }"
+      "  field { type:TYPE_INT64   default_value:\"3\"         " ETC
+      " }"
+      "  field { type:TYPE_INT64   default_value:\"-4\"        " ETC
+      " }"
+      "  field { type:TYPE_UINT32  default_value:\"5\"         " ETC
+      " }"
+      "  field { type:TYPE_UINT64  default_value:\"6\"         " ETC
+      " }"
+      "  field { type:TYPE_FLOAT   default_value:\"7.5\"       " ETC
+      " }"
+      "  field { type:TYPE_FLOAT   default_value:\"-8.5\"      " ETC
+      " }"
+      "  field { type:TYPE_FLOAT   default_value:\"9\"         " ETC
+      " }"
+      "  field { type:TYPE_DOUBLE  default_value:\"10.5\"      " ETC
+      " }"
+      "  field { type:TYPE_DOUBLE  default_value:\"-11.5\"     " ETC
+      " }"
+      "  field { type:TYPE_DOUBLE  default_value:\"12\"        " ETC
+      " }"
+      "  field { type:TYPE_DOUBLE  default_value:\"inf\"       " ETC
+      " }"
+      "  field { type:TYPE_DOUBLE  default_value:\"-inf\"      " ETC
+      " }"
+      "  field { type:TYPE_DOUBLE  default_value:\"nan\"       " ETC
+      " }"
+      "  field { type:TYPE_STRING  default_value:\"13\\001\"   " ETC
+      " }"
+      "  field { type:TYPE_STRING  default_value:\"abc\"       " ETC
+      " }"
+      "  field { type:TYPE_BYTES   default_value:\"14\\\\002\" " ETC
+      " }"
+      "  field { type:TYPE_BYTES   default_value:\"abc\"       " ETC
+      " }"
+      "  field { type:TYPE_BOOL    default_value:\"true\"      " ETC
+      " }"
+      "  field { type_name:\"Foo\" default_value:\"FOO\"       " ETC
+      " }"
 
-    "  field {"
-    "    type:TYPE_INT32   default_value:\"2147483647\"           " ETC
-    "  }"
-    "  field {"
-    "    type:TYPE_INT32   default_value:\"-2147483648\"          " ETC
-    "  }"
-    "  field {"
-    "    type:TYPE_UINT32  default_value:\"4294967295\"           " ETC
-    "  }"
-    "  field {"
-    "    type:TYPE_INT64   default_value:\"9223372036854775807\"  " ETC
-    "  }"
-    "  field {"
-    "    type:TYPE_INT64   default_value:\"-9223372036854775808\" " ETC
-    "  }"
-    "  field {"
-    "    type:TYPE_UINT64  default_value:\"18446744073709551615\" " ETC
-    "  }"
-    "  field {"
-    "    type:TYPE_DOUBLE  default_value:\"43981\"                " ETC
-    "  }"
-    "}");
+      "  field {"
+      "    type:TYPE_INT32   default_value:\"2147483647\"           " ETC
+      "  }"
+      "  field {"
+      "    type:TYPE_INT32   default_value:\"-2147483648\"          " ETC
+      "  }"
+      "  field {"
+      "    type:TYPE_UINT32  default_value:\"4294967295\"           " ETC
+      "  }"
+      "  field {"
+      "    type:TYPE_INT64   default_value:\"9223372036854775807\"  " ETC
+      "  }"
+      "  field {"
+      "    type:TYPE_INT64   default_value:\"-9223372036854775808\" " ETC
+      "  }"
+      "  field {"
+      "    type:TYPE_UINT64  default_value:\"18446744073709551615\" " ETC
+      "  }"
+      "  field {"
+      "    type:TYPE_DOUBLE  default_value:\"43981\"                " ETC
+      "  }"
+      "}");
 #undef ETC
 }
 
 TEST_F(ParseMessageTest, FieldJsonName) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  optional string foo = 1 [json_name = \"@type\"];\n"
-    "}\n",
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field {\n"
-    "    name: \"foo\" label: LABEL_OPTIONAL type: TYPE_STRING number: 1"
-    "    json_name: \"@type\"\n"
-    "  }\n"
-    "}\n");
+      "message TestMessage {\n"
+      "  optional string foo = 1 [json_name = \"@type\"];\n"
+      "}\n",
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field {\n"
+      "    name: \"foo\" label: LABEL_OPTIONAL type: TYPE_STRING number: 1"
+      "    json_name: \"@type\"\n"
+      "  }\n"
+      "}\n");
 }
 
 TEST_F(ParseMessageTest, FieldOptions) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  optional string foo = 1\n"
-    "      [ctype=CORD, (foo)=7, foo.(.bar.baz).qux.quux.(corge)=-33, \n"
-    "       (quux)=\"x\040y\", (baz.qux)=hey];\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  optional string foo = 1\n"
+      "      [ctype=CORD, (foo)=7, foo.(.bar.baz).qux.quux.(corge)=-33, \n"
+      "       (quux)=\"x\040y\", (baz.qux)=hey];\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name: \"foo\" label: LABEL_OPTIONAL type: TYPE_STRING number: 1"
-    "          options { uninterpreted_option: { name { name_part: \"ctype\" "
-    "                                                   is_extension: false } "
-    "                                            identifier_value: \"CORD\"  }"
-    "                    uninterpreted_option: { name { name_part: \"foo\" "
-    "                                                   is_extension: true } "
-    "                                            positive_int_value: 7  }"
-    "                    uninterpreted_option: { name { name_part: \"foo\" "
-    "                                                   is_extension: false } "
-    "                                            name { name_part: \".bar.baz\""
-    "                                                   is_extension: true } "
-    "                                            name { name_part: \"qux\" "
-    "                                                   is_extension: false } "
-    "                                            name { name_part: \"quux\" "
-    "                                                   is_extension: false } "
-    "                                            name { name_part: \"corge\" "
-    "                                                   is_extension: true } "
-    "                                            negative_int_value: -33 }"
-    "                    uninterpreted_option: { name { name_part: \"quux\" "
-    "                                                   is_extension: true } "
-    "                                            string_value: \"x y\" }"
-    "                    uninterpreted_option: { name { name_part: \"baz.qux\" "
-    "                                                   is_extension: true } "
-    "                                            identifier_value: \"hey\" }"
-    "          }"
-    "  }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name: \"foo\" label: LABEL_OPTIONAL type: TYPE_STRING number: "
+      "1"
+      "          options { uninterpreted_option: { name { name_part: \"ctype\" "
+      "                                                   is_extension: false "
+      "} "
+      "                                            identifier_value: \"CORD\"  "
+      "}"
+      "                    uninterpreted_option: { name { name_part: \"foo\" "
+      "                                                   is_extension: true } "
+      "                                            positive_int_value: 7  }"
+      "                    uninterpreted_option: { name { name_part: \"foo\" "
+      "                                                   is_extension: false "
+      "} "
+      "                                            name { name_part: "
+      "\".bar.baz\""
+      "                                                   is_extension: true } "
+      "                                            name { name_part: \"qux\" "
+      "                                                   is_extension: false "
+      "} "
+      "                                            name { name_part: \"quux\" "
+      "                                                   is_extension: false "
+      "} "
+      "                                            name { name_part: \"corge\" "
+      "                                                   is_extension: true } "
+      "                                            negative_int_value: -33 }"
+      "                    uninterpreted_option: { name { name_part: \"quux\" "
+      "                                                   is_extension: true } "
+      "                                            string_value: \"x y\" }"
+      "                    uninterpreted_option: { name { name_part: "
+      "\"baz.qux\" "
+      "                                                   is_extension: true } "
+      "                                            identifier_value: \"hey\" }"
+      "          }"
+      "  }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, Oneof) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  oneof foo {\n"
-    "    int32 a = 1;\n"
-    "    string b = 2;\n"
-    "    TestMessage c = 3;\n"
-    "    group D = 4 { optional int32 i = 5; }\n"
-    "  }\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  oneof foo {\n"
+      "    int32 a = 1;\n"
+      "    string b = 2;\n"
+      "    TestMessage c = 3;\n"
+      "    group D = 4 { optional int32 i = 5; }\n"
+      "  }\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"a\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 "
-    "          oneof_index:0 }"
-    "  field { name:\"b\" label:LABEL_OPTIONAL type:TYPE_STRING number:2 "
-    "          oneof_index:0 }"
-    "  field { name:\"c\" label:LABEL_OPTIONAL type_name:\"TestMessage\" "
-    "          number:3 oneof_index:0 }"
-    "  field { name:\"d\" label:LABEL_OPTIONAL type:TYPE_GROUP "
-    "          type_name:\"D\" number:4 oneof_index:0 }"
-    "  oneof_decl {"
-    "    name: \"foo\""
-    "  }"
-    "  nested_type {"
-    "    name: \"D\""
-    "    field { name:\"i\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 }"
-    "  }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"a\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 "
+      "          oneof_index:0 }"
+      "  field { name:\"b\" label:LABEL_OPTIONAL type:TYPE_STRING number:2 "
+      "          oneof_index:0 }"
+      "  field { name:\"c\" label:LABEL_OPTIONAL type_name:\"TestMessage\" "
+      "          number:3 oneof_index:0 }"
+      "  field { name:\"d\" label:LABEL_OPTIONAL type:TYPE_GROUP "
+      "          type_name:\"D\" number:4 oneof_index:0 }"
+      "  oneof_decl {"
+      "    name: \"foo\""
+      "  }"
+      "  nested_type {"
+      "    name: \"D\""
+      "    field { name:\"i\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 }"
+      "  }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, MultipleOneofs) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  oneof foo {\n"
-    "    int32 a = 1;\n"
-    "    string b = 2;\n"
-    "  }\n"
-    "  oneof bar {\n"
-    "    int32 c = 3;\n"
-    "    string d = 4;\n"
-    "  }\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  oneof foo {\n"
+      "    int32 a = 1;\n"
+      "    string b = 2;\n"
+      "  }\n"
+      "  oneof bar {\n"
+      "    int32 c = 3;\n"
+      "    string d = 4;\n"
+      "  }\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"a\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 "
-    "          oneof_index:0 }"
-    "  field { name:\"b\" label:LABEL_OPTIONAL type:TYPE_STRING number:2 "
-    "          oneof_index:0 }"
-    "  field { name:\"c\" label:LABEL_OPTIONAL type:TYPE_INT32 number:3 "
-    "          oneof_index:1 }"
-    "  field { name:\"d\" label:LABEL_OPTIONAL type:TYPE_STRING number:4 "
-    "          oneof_index:1 }"
-    "  oneof_decl {"
-    "    name: \"foo\""
-    "  }"
-    "  oneof_decl {"
-    "    name: \"bar\""
-    "  }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"a\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 "
+      "          oneof_index:0 }"
+      "  field { name:\"b\" label:LABEL_OPTIONAL type:TYPE_STRING number:2 "
+      "          oneof_index:0 }"
+      "  field { name:\"c\" label:LABEL_OPTIONAL type:TYPE_INT32 number:3 "
+      "          oneof_index:1 }"
+      "  field { name:\"d\" label:LABEL_OPTIONAL type:TYPE_STRING number:4 "
+      "          oneof_index:1 }"
+      "  oneof_decl {"
+      "    name: \"foo\""
+      "  }"
+      "  oneof_decl {"
+      "    name: \"bar\""
+      "  }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, Maps) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  map<int32, string> primitive_type_map = 1;\n"
-    "  map<KeyType, ValueType> composite_type_map = 2;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  map<int32, string> primitive_type_map = 1;\n"
+      "  map<KeyType, ValueType> composite_type_map = 2;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  nested_type {"
-    "    name: \"PrimitiveTypeMapEntry\""
-    "    field { "
-    "       name: \"key\" number: 1 label:LABEL_OPTIONAL"
-    "       type:TYPE_INT32"
-    "    }"
-    "    field { "
-    "       name: \"value\" number: 2 label:LABEL_OPTIONAL"
-    "       type:TYPE_STRING"
-    "    }"
-    "    options { map_entry: true }"
-    "  }"
-    "  nested_type {"
-    "    name: \"CompositeTypeMapEntry\""
-    "    field { "
-    "       name: \"key\" number: 1 label:LABEL_OPTIONAL"
-    "       type_name: \"KeyType\""
-    "    }"
-    "    field { "
-    "       name: \"value\" number: 2 label:LABEL_OPTIONAL"
-    "       type_name: \"ValueType\""
-    "    }"
-    "    options { map_entry: true }"
-    "  }"
-    "  field {"
-    "    name: \"primitive_type_map\""
-    "    label: LABEL_REPEATED"
-    "    type_name: \"PrimitiveTypeMapEntry\""
-    "    number: 1"
-    "  }"
-    "  field {"
-    "    name: \"composite_type_map\""
-    "    label: LABEL_REPEATED"
-    "    type_name: \"CompositeTypeMapEntry\""
-    "    number: 2"
-    "  }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  nested_type {"
+      "    name: \"PrimitiveTypeMapEntry\""
+      "    field { "
+      "       name: \"key\" number: 1 label:LABEL_OPTIONAL"
+      "       type:TYPE_INT32"
+      "    }"
+      "    field { "
+      "       name: \"value\" number: 2 label:LABEL_OPTIONAL"
+      "       type:TYPE_STRING"
+      "    }"
+      "    options { map_entry: true }"
+      "  }"
+      "  nested_type {"
+      "    name: \"CompositeTypeMapEntry\""
+      "    field { "
+      "       name: \"key\" number: 1 label:LABEL_OPTIONAL"
+      "       type_name: \"KeyType\""
+      "    }"
+      "    field { "
+      "       name: \"value\" number: 2 label:LABEL_OPTIONAL"
+      "       type_name: \"ValueType\""
+      "    }"
+      "    options { map_entry: true }"
+      "  }"
+      "  field {"
+      "    name: \"primitive_type_map\""
+      "    label: LABEL_REPEATED"
+      "    type_name: \"PrimitiveTypeMapEntry\""
+      "    number: 1"
+      "  }"
+      "  field {"
+      "    name: \"composite_type_map\""
+      "    label: LABEL_REPEATED"
+      "    type_name: \"CompositeTypeMapEntry\""
+      "    number: 2"
+      "  }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, Group) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  optional group TestGroup = 1 {};\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  optional group TestGroup = 1 {};\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  nested_type { name: \"TestGroup\" }"
-    "  field { name:\"testgroup\" label:LABEL_OPTIONAL number:1"
-    "          type:TYPE_GROUP type_name: \"TestGroup\" }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  nested_type { name: \"TestGroup\" }"
+      "  field { name:\"testgroup\" label:LABEL_OPTIONAL number:1"
+      "          type:TYPE_GROUP type_name: \"TestGroup\" }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, NestedMessage) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  message Nested {}\n"
-    "  optional Nested test_nested = 1;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  message Nested {}\n"
+      "  optional Nested test_nested = 1;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  nested_type { name: \"Nested\" }"
-    "  field { name:\"test_nested\" label:LABEL_OPTIONAL number:1"
-    "          type_name: \"Nested\" }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  nested_type { name: \"Nested\" }"
+      "  field { name:\"test_nested\" label:LABEL_OPTIONAL number:1"
+      "          type_name: \"Nested\" }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, NestedEnum) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  enum NestedEnum {}\n"
-    "  optional NestedEnum test_enum = 1;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  enum NestedEnum {}\n"
+      "  optional NestedEnum test_enum = 1;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  enum_type { name: \"NestedEnum\" }"
-    "  field { name:\"test_enum\" label:LABEL_OPTIONAL number:1"
-    "          type_name: \"NestedEnum\" }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  enum_type { name: \"NestedEnum\" }"
+      "  field { name:\"test_enum\" label:LABEL_OPTIONAL number:1"
+      "          type_name: \"NestedEnum\" }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, ReservedRange) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  required int32 foo = 1;\n"
-    "  reserved 2, 15, 9 to 11, 3, 20 to max;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  required int32 foo = 1;\n"
+      "  reserved 2, 15, 9 to 11, 3, 20 to max;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
-    "  reserved_range { start:2   end:3         }"
-    "  reserved_range { start:15  end:16        }"
-    "  reserved_range { start:9   end:12        }"
-    "  reserved_range { start:3   end:4         }"
-    "  reserved_range { start:20  end:536870912 }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }"
+      "  reserved_range { start:2   end:3         }"
+      "  reserved_range { start:15  end:16        }"
+      "  reserved_range { start:9   end:12        }"
+      "  reserved_range { start:3   end:4         }"
+      "  reserved_range { start:20  end:536870912 }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, ReservedRangeOnMessageSet) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  option message_set_wire_format = true;\n"
-    "  reserved 20 to max;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  option message_set_wire_format = true;\n"
+      "  reserved 20 to max;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  options {"
-    "    uninterpreted_option {"
-    "      name {"
-    "        name_part: \"message_set_wire_format\""
-    "        is_extension: false"
-    "      }"
-    "      identifier_value: \"true\""
-    "    }"
-    "  }"
-    "  reserved_range { start:20  end:2147483647 }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  options {"
+      "    uninterpreted_option {"
+      "      name {"
+      "        name_part: \"message_set_wire_format\""
+      "        is_extension: false"
+      "      }"
+      "      identifier_value: \"true\""
+      "    }"
+      "  }"
+      "  reserved_range { start:20  end:2147483647 }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, ReservedNames) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  reserved \"foo\", \"bar\";\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  reserved \"foo\", \"bar\";\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  reserved_name: \"foo\""
-    "  reserved_name: \"bar\""
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  reserved_name: \"foo\""
+      "  reserved_name: \"bar\""
+      "}");
 }
 
 TEST_F(ParseMessageTest, ExtensionRange) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  extensions 10 to 19;\n"
-    "  extensions 30 to max;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  extensions 10 to 19;\n"
+      "  extensions 30 to max;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  extension_range { start:10 end:20        }"
-    "  extension_range { start:30 end:536870912 }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  extension_range { start:10 end:20        }"
+      "  extension_range { start:30 end:536870912 }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, ExtensionRangeWithOptions) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  extensions 10 to 19 [(i) = 5];\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  extensions 10 to 19 [(i) = 5];\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  extension_range {"
-    "    start:10"
-    "    end:20"
-    "    options {"
-    "      uninterpreted_option {"
-    "        name {"
-    "          name_part: \"i\""
-    "          is_extension: true"
-    "        }"
-    "        positive_int_value: 5"
-    "      }"
-    "    }"
-    "  }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  extension_range {"
+      "    start:10"
+      "    end:20"
+      "    options {"
+      "      uninterpreted_option {"
+      "        name {"
+      "          name_part: \"i\""
+      "          is_extension: true"
+      "        }"
+      "        positive_int_value: 5"
+      "      }"
+      "    }"
+      "  }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, CompoundExtensionRange) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  extensions 2, 15, 9 to 11, 100 to max, 3;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  extensions 2, 15, 9 to 11, 100 to max, 3;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  extension_range { start:2   end:3         }"
-    "  extension_range { start:15  end:16        }"
-    "  extension_range { start:9   end:12        }"
-    "  extension_range { start:100 end:536870912 }"
-    "  extension_range { start:3   end:4         }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  extension_range { start:2   end:3         }"
+      "  extension_range { start:15  end:16        }"
+      "  extension_range { start:9   end:12        }"
+      "  extension_range { start:100 end:536870912 }"
+      "  extension_range { start:3   end:4         }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, CompoundExtensionRangeWithOptions) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  extensions 2, 15, 9 to 11, 100 to max, 3 [(i) = 5];\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  extensions 2, 15, 9 to 11, 100 to max, 3 [(i) = 5];\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  extension_range {"
-    "    start:2"
-    "    end:3"
-    "    options {"
-    "      uninterpreted_option {"
-    "        name {"
-    "          name_part: \"i\""
-    "          is_extension: true"
-    "        }"
-    "        positive_int_value: 5"
-    "      }"
-    "    }"
-    "  }"
-    "  extension_range {"
-    "    start:15"
-    "    end:16"
-    "    options {"
-    "      uninterpreted_option {"
-    "        name {"
-    "          name_part: \"i\""
-    "          is_extension: true"
-    "        }"
-    "        positive_int_value: 5"
-    "      }"
-    "    }"
-    "  }"
-    "  extension_range {"
-    "    start:9"
-    "    end:12"
-    "    options {"
-    "      uninterpreted_option {"
-    "        name {"
-    "          name_part: \"i\""
-    "          is_extension: true"
-    "        }"
-    "        positive_int_value: 5"
-    "      }"
-    "    }"
-    "  }"
-    "  extension_range {"
-    "    start:100"
-    "    end:536870912"
-    "    options {"
-    "      uninterpreted_option {"
-    "        name {"
-    "          name_part: \"i\""
-    "          is_extension: true"
-    "        }"
-    "        positive_int_value: 5"
-    "      }"
-    "    }"
-    "  }"
-    "  extension_range {"
-    "    start:3"
-    "    end:4"
-    "    options {"
-    "      uninterpreted_option {"
-    "        name {"
-    "          name_part: \"i\""
-    "          is_extension: true"
-    "        }"
-    "        positive_int_value: 5"
-    "      }"
-    "    }"
-    "  }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  extension_range {"
+      "    start:2"
+      "    end:3"
+      "    options {"
+      "      uninterpreted_option {"
+      "        name {"
+      "          name_part: \"i\""
+      "          is_extension: true"
+      "        }"
+      "        positive_int_value: 5"
+      "      }"
+      "    }"
+      "  }"
+      "  extension_range {"
+      "    start:15"
+      "    end:16"
+      "    options {"
+      "      uninterpreted_option {"
+      "        name {"
+      "          name_part: \"i\""
+      "          is_extension: true"
+      "        }"
+      "        positive_int_value: 5"
+      "      }"
+      "    }"
+      "  }"
+      "  extension_range {"
+      "    start:9"
+      "    end:12"
+      "    options {"
+      "      uninterpreted_option {"
+      "        name {"
+      "          name_part: \"i\""
+      "          is_extension: true"
+      "        }"
+      "        positive_int_value: 5"
+      "      }"
+      "    }"
+      "  }"
+      "  extension_range {"
+      "    start:100"
+      "    end:536870912"
+      "    options {"
+      "      uninterpreted_option {"
+      "        name {"
+      "          name_part: \"i\""
+      "          is_extension: true"
+      "        }"
+      "        positive_int_value: 5"
+      "      }"
+      "    }"
+      "  }"
+      "  extension_range {"
+      "    start:3"
+      "    end:4"
+      "    options {"
+      "      uninterpreted_option {"
+      "        name {"
+      "          name_part: \"i\""
+      "          is_extension: true"
+      "        }"
+      "        positive_int_value: 5"
+      "      }"
+      "    }"
+      "  }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, LargerMaxForMessageSetWireFormatMessages) {
@@ -844,77 +893,79 @@
   // extension numbers, as the numbers are not encoded as int32 field values
   // rather than tags.
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  extensions 4 to max;\n"
-    "  option message_set_wire_format = true;\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  extensions 4 to max;\n"
+      "  option message_set_wire_format = true;\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "    extension_range { start:4 end: 0x7fffffff }"
-    "  options {\n"
-    "    uninterpreted_option { \n"
-    "      name {\n"
-    "        name_part: \"message_set_wire_format\"\n"
-    "        is_extension: false\n"
-    "      }\n"
-    "      identifier_value: \"true\"\n"
-    "    }\n"
-    "  }\n"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "    extension_range { start:4 end: 0x7fffffff }"
+      "  options {\n"
+      "    uninterpreted_option { \n"
+      "      name {\n"
+      "        name_part: \"message_set_wire_format\"\n"
+      "        is_extension: false\n"
+      "      }\n"
+      "      identifier_value: \"true\"\n"
+      "    }\n"
+      "  }\n"
+      "}");
 }
 
 TEST_F(ParseMessageTest, Extensions) {
   ExpectParsesTo(
-    "extend Extendee1 { optional int32 foo = 12; }\n"
-    "extend Extendee2 { repeated TestMessage bar = 22; }\n",
+      "extend Extendee1 { optional int32 foo = 12; }\n"
+      "extend Extendee2 { repeated TestMessage bar = 22; }\n",
 
-    "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12"
-    "            extendee: \"Extendee1\" } "
-    "extension { name:\"bar\" label:LABEL_REPEATED number:22"
-    "            type_name:\"TestMessage\" extendee: \"Extendee2\" }");
+      "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12"
+      "            extendee: \"Extendee1\" } "
+      "extension { name:\"bar\" label:LABEL_REPEATED number:22"
+      "            type_name:\"TestMessage\" extendee: \"Extendee2\" }");
 }
 
 TEST_F(ParseMessageTest, ExtensionsInMessageScope) {
   ExpectParsesTo(
-    "message TestMessage {\n"
-    "  extend Extendee1 { optional int32 foo = 12; }\n"
-    "  extend Extendee2 { repeated TestMessage bar = 22; }\n"
-    "}\n",
+      "message TestMessage {\n"
+      "  extend Extendee1 { optional int32 foo = 12; }\n"
+      "  extend Extendee2 { repeated TestMessage bar = 22; }\n"
+      "}\n",
 
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12"
-    "              extendee: \"Extendee1\" }"
-    "  extension { name:\"bar\" label:LABEL_REPEATED number:22"
-    "              type_name:\"TestMessage\" extendee: \"Extendee2\" }"
-    "}");
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "number:12"
+      "              extendee: \"Extendee1\" }"
+      "  extension { name:\"bar\" label:LABEL_REPEATED number:22"
+      "              type_name:\"TestMessage\" extendee: \"Extendee2\" }"
+      "}");
 }
 
 TEST_F(ParseMessageTest, MultipleExtensionsOneExtendee) {
   ExpectParsesTo(
-    "extend Extendee1 {\n"
-    "  optional int32 foo = 12;\n"
-    "  repeated TestMessage bar = 22;\n"
-    "}\n",
+      "extend Extendee1 {\n"
+      "  optional int32 foo = 12;\n"
+      "  repeated TestMessage bar = 22;\n"
+      "}\n",
 
-    "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12"
-    "            extendee: \"Extendee1\" } "
-    "extension { name:\"bar\" label:LABEL_REPEATED number:22"
-    "            type_name:\"TestMessage\" extendee: \"Extendee1\" }");
+      "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12"
+      "            extendee: \"Extendee1\" } "
+      "extension { name:\"bar\" label:LABEL_REPEATED number:22"
+      "            type_name:\"TestMessage\" extendee: \"Extendee1\" }");
 }
 
 TEST_F(ParseMessageTest, OptionalLabelProto3) {
   ExpectParsesTo(
-    "syntax = \"proto3\";\n"
-    "message TestMessage {\n"
-    "  int32 foo = 1;\n"
-    "}\n",
+      "syntax = \"proto3\";\n"
+      "message TestMessage {\n"
+      "  int32 foo = 1;\n"
+      "}\n",
 
-    "syntax: \"proto3\" "
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 } }");
+      "syntax: \"proto3\" "
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 } "
+      "}");
 }
 
 // ===================================================================
@@ -923,108 +974,109 @@
 
 TEST_F(ParseEnumTest, SimpleEnum) {
   ExpectParsesTo(
-    "enum TestEnum {\n"
-    "  FOO = 0;\n"
-    "}\n",
+      "enum TestEnum {\n"
+      "  FOO = 0;\n"
+      "}\n",
 
-    "enum_type {"
-    "  name: \"TestEnum\""
-    "  value { name:\"FOO\" number:0 }"
-    "}");
+      "enum_type {"
+      "  name: \"TestEnum\""
+      "  value { name:\"FOO\" number:0 }"
+      "}");
 }
 
 TEST_F(ParseEnumTest, Values) {
   ExpectParsesTo(
-    "enum TestEnum {\n"
-    "  FOO = 13;\n"
-    "  BAR = -10;\n"
-    "  BAZ = 500;\n"
-    "  HEX_MAX = 0x7FFFFFFF;\n"
-    "  HEX_MIN = -0x80000000;\n"
-    "  INT_MAX = 2147483647;\n"
-    "  INT_MIN = -2147483648;\n"
-    "}\n",
+      "enum TestEnum {\n"
+      "  FOO = 13;\n"
+      "  BAR = -10;\n"
+      "  BAZ = 500;\n"
+      "  HEX_MAX = 0x7FFFFFFF;\n"
+      "  HEX_MIN = -0x80000000;\n"
+      "  INT_MAX = 2147483647;\n"
+      "  INT_MIN = -2147483648;\n"
+      "}\n",
 
-    "enum_type {"
-    "  name: \"TestEnum\""
-    "  value { name:\"FOO\" number:13 }"
-    "  value { name:\"BAR\" number:-10 }"
-    "  value { name:\"BAZ\" number:500 }"
-    "  value { name:\"HEX_MAX\" number:2147483647 }"
-    "  value { name:\"HEX_MIN\" number:-2147483648 }"
-    "  value { name:\"INT_MAX\" number:2147483647 }"
-    "  value { name:\"INT_MIN\" number:-2147483648 }"
-    "}");
+      "enum_type {"
+      "  name: \"TestEnum\""
+      "  value { name:\"FOO\" number:13 }"
+      "  value { name:\"BAR\" number:-10 }"
+      "  value { name:\"BAZ\" number:500 }"
+      "  value { name:\"HEX_MAX\" number:2147483647 }"
+      "  value { name:\"HEX_MIN\" number:-2147483648 }"
+      "  value { name:\"INT_MAX\" number:2147483647 }"
+      "  value { name:\"INT_MIN\" number:-2147483648 }"
+      "}");
 }
 
 TEST_F(ParseEnumTest, ValueOptions) {
   ExpectParsesTo(
-    "enum TestEnum {\n"
-    "  FOO = 13;\n"
-    "  BAR = -10 [ (something.text) = 'abc' ];\n"
-    "  BAZ = 500 [ (something.text) = 'def', other = 1 ];\n"
-    "}\n",
+      "enum TestEnum {\n"
+      "  FOO = 13;\n"
+      "  BAR = -10 [ (something.text) = 'abc' ];\n"
+      "  BAZ = 500 [ (something.text) = 'def', other = 1 ];\n"
+      "}\n",
 
-    "enum_type {"
-    "  name: \"TestEnum\""
-    "  value { name: \"FOO\" number: 13 }"
-    "  value { name: \"BAR\" number: -10 "
-    "    options { "
-    "      uninterpreted_option { "
-    "        name { name_part: \"something.text\" is_extension: true } "
-    "        string_value: \"abc\" "
-    "      } "
-    "    } "
-    "  } "
-    "  value { name: \"BAZ\" number: 500 "
-    "    options { "
-    "      uninterpreted_option { "
-    "        name { name_part: \"something.text\" is_extension: true } "
-    "        string_value: \"def\" "
-    "      } "
-    "      uninterpreted_option { "
-    "        name { name_part: \"other\" is_extension: false } "
-    "        positive_int_value: 1 "
-    "      } "
-    "    } "
-    "  } "
-    "}");
+      "enum_type {"
+      "  name: \"TestEnum\""
+      "  value { name: \"FOO\" number: 13 }"
+      "  value { name: \"BAR\" number: -10 "
+      "    options { "
+      "      uninterpreted_option { "
+      "        name { name_part: \"something.text\" is_extension: true } "
+      "        string_value: \"abc\" "
+      "      } "
+      "    } "
+      "  } "
+      "  value { name: \"BAZ\" number: 500 "
+      "    options { "
+      "      uninterpreted_option { "
+      "        name { name_part: \"something.text\" is_extension: true } "
+      "        string_value: \"def\" "
+      "      } "
+      "      uninterpreted_option { "
+      "        name { name_part: \"other\" is_extension: false } "
+      "        positive_int_value: 1 "
+      "      } "
+      "    } "
+      "  } "
+      "}");
 }
 
 TEST_F(ParseEnumTest, ReservedRange) {
   ExpectParsesTo(
-    "enum TestEnum {\n"
-    "  FOO = 0;\n"
-    "  reserved -2147483648, -6 to -4, -1 to 1, 2, 15, 9 to 11, 3, 20 to max;\n"
-    "}\n",
+      "enum TestEnum {\n"
+      "  FOO = 0;\n"
+      "  reserved -2147483648, -6 to -4, -1 to 1, 2, 15, 9 to 11, 3, 20 to "
+      "max;\n"
+      "}\n",
 
-    "enum_type {"
-    "  name: \"TestEnum\""
-    "  value { name:\"FOO\" number:0 }"
-    "  reserved_range { start:-2147483648  end:-2147483648 }"
-    "  reserved_range { start:-6           end:-4          }"
-    "  reserved_range { start:-1           end:1           }"
-    "  reserved_range { start:2            end:2           }"
-    "  reserved_range { start:15           end:15          }"
-    "  reserved_range { start:9            end:11          }"
-    "  reserved_range { start:3            end:3           }"
-    "  reserved_range { start:20           end:2147483647  }"
-    "}");
+      "enum_type {"
+      "  name: \"TestEnum\""
+      "  value { name:\"FOO\" number:0 }"
+      "  reserved_range { start:-2147483648  end:-2147483648 }"
+      "  reserved_range { start:-6           end:-4          }"
+      "  reserved_range { start:-1           end:1           }"
+      "  reserved_range { start:2            end:2           }"
+      "  reserved_range { start:15           end:15          }"
+      "  reserved_range { start:9            end:11          }"
+      "  reserved_range { start:3            end:3           }"
+      "  reserved_range { start:20           end:2147483647  }"
+      "}");
 }
 
 TEST_F(ParseEnumTest, ReservedNames) {
   ExpectParsesTo(
-    "enum TestEnum {\n"
-    "  FOO = 0;\n"
-    "  reserved \"foo\", \"bar\";\n"
-    "}\n",
+      "enum TestEnum {\n"
+      "  FOO = 0;\n"
+      "  reserved \"foo\", \"bar\";\n"
+      "}\n",
 
-    "enum_type {"
-    "  name: \"TestEnum\""
-    "  value { name:\"FOO\" number:0 }"
-    "  reserved_name: \"foo\""
-    "  reserved_name: \"bar\""
-    "}");
+      "enum_type {"
+      "  name: \"TestEnum\""
+      "  value { name:\"FOO\" number:0 }"
+      "  reserved_name: \"foo\""
+      "  reserved_name: \"bar\""
+      "}");
 }
 
 // ===================================================================
@@ -1033,80 +1085,76 @@
 
 TEST_F(ParseServiceTest, SimpleService) {
   ExpectParsesTo(
-    "service TestService {\n"
-    "  rpc Foo(In) returns (Out);\n"
-    "}\n",
+      "service TestService {\n"
+      "  rpc Foo(In) returns (Out);\n"
+      "}\n",
 
-    "service {"
-    "  name: \"TestService\""
-    "  method { name:\"Foo\" input_type:\"In\" output_type:\"Out\" }"
-    "}");
+      "service {"
+      "  name: \"TestService\""
+      "  method { name:\"Foo\" input_type:\"In\" output_type:\"Out\" }"
+      "}");
 }
 
 TEST_F(ParseServiceTest, MethodsAndStreams) {
   ExpectParsesTo(
-    "service TestService {\n"
-    "  rpc Foo(In1) returns (Out1);\n"
-    "  rpc Bar(In2) returns (Out2);\n"
-    "  rpc Baz(In3) returns (Out3);\n"
-    "}\n",
+      "service TestService {\n"
+      "  rpc Foo(In1) returns (Out1);\n"
+      "  rpc Bar(In2) returns (Out2);\n"
+      "  rpc Baz(In3) returns (Out3);\n"
+      "}\n",
 
-    "service {"
-    "  name: \"TestService\""
-    "  method { name:\"Foo\" input_type:\"In1\" output_type:\"Out1\" }"
-    "  method { name:\"Bar\" input_type:\"In2\" output_type:\"Out2\" }"
-    "  method { name:\"Baz\" input_type:\"In3\" output_type:\"Out3\" }"
-    "}");
+      "service {"
+      "  name: \"TestService\""
+      "  method { name:\"Foo\" input_type:\"In1\" output_type:\"Out1\" }"
+      "  method { name:\"Bar\" input_type:\"In2\" output_type:\"Out2\" }"
+      "  method { name:\"Baz\" input_type:\"In3\" output_type:\"Out3\" }"
+      "}");
 }
 
 
-
 // ===================================================================
 // imports and packages
 
 typedef ParserTest ParseMiscTest;
 
 TEST_F(ParseMiscTest, ParseImport) {
-  ExpectParsesTo(
-    "import \"foo/bar/baz.proto\";\n",
-    "dependency: \"foo/bar/baz.proto\"");
+  ExpectParsesTo("import \"foo/bar/baz.proto\";\n",
+                 "dependency: \"foo/bar/baz.proto\"");
 }
 
 TEST_F(ParseMiscTest, ParseMultipleImports) {
   ExpectParsesTo(
-    "import \"foo.proto\";\n"
-    "import \"bar.proto\";\n"
-    "import \"baz.proto\";\n",
-    "dependency: \"foo.proto\""
-    "dependency: \"bar.proto\""
-    "dependency: \"baz.proto\"");
+      "import \"foo.proto\";\n"
+      "import \"bar.proto\";\n"
+      "import \"baz.proto\";\n",
+      "dependency: \"foo.proto\""
+      "dependency: \"bar.proto\""
+      "dependency: \"baz.proto\"");
 }
 
 TEST_F(ParseMiscTest, ParsePublicImports) {
   ExpectParsesTo(
-    "import \"foo.proto\";\n"
-    "import public \"bar.proto\";\n"
-    "import \"baz.proto\";\n"
-    "import public \"qux.proto\";\n",
-    "dependency: \"foo.proto\""
-    "dependency: \"bar.proto\""
-    "dependency: \"baz.proto\""
-    "dependency: \"qux.proto\""
-    "public_dependency: 1 "
-    "public_dependency: 3 ");
+      "import \"foo.proto\";\n"
+      "import public \"bar.proto\";\n"
+      "import \"baz.proto\";\n"
+      "import public \"qux.proto\";\n",
+      "dependency: \"foo.proto\""
+      "dependency: \"bar.proto\""
+      "dependency: \"baz.proto\""
+      "dependency: \"qux.proto\""
+      "public_dependency: 1 "
+      "public_dependency: 3 ");
 }
 
 TEST_F(ParseMiscTest, ParsePackage) {
-  ExpectParsesTo(
-    "package foo.bar.baz;\n",
-    "package: \"foo.bar.baz\"");
+  ExpectParsesTo("package foo.bar.baz;\n", "package: \"foo.bar.baz\"");
 }
 
 TEST_F(ParseMiscTest, ParsePackageWithSpaces) {
   ExpectParsesTo(
-    "package foo   .   bar.  \n"
-    "  baz;\n",
-    "package: \"foo.bar.baz\"");
+      "package foo   .   bar.  \n"
+      "  baz;\n",
+      "package: \"foo.bar.baz\"");
 }
 
 // ===================================================================
@@ -1149,341 +1197,335 @@
 
 TEST_F(ParseErrorTest, UnknownSyntaxIdentifier) {
   ExpectHasEarlyExitErrors(
-    "syntax = \"no_such_syntax\";",
-    "0:9: Unrecognized syntax identifier \"no_such_syntax\".  This parser "
+      "syntax = \"no_such_syntax\";",
+      "0:9: Unrecognized syntax identifier \"no_such_syntax\".  This parser "
       "only recognizes \"proto2\" and \"proto3\".\n");
   EXPECT_EQ("no_such_syntax", parser_->GetSyntaxIdentifier());
 }
 
 TEST_F(ParseErrorTest, SimpleSyntaxError) {
-  ExpectHasErrors(
-    "message TestMessage @#$ { blah }",
-    "0:20: Expected \"{\".\n");
+  ExpectHasErrors("message TestMessage @#$ { blah }",
+                  "0:20: Expected \"{\".\n");
   EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier());
 }
 
 TEST_F(ParseErrorTest, ExpectedTopLevel) {
-  ExpectHasErrors(
-    "blah;",
-    "0:0: Expected top-level statement (e.g. \"message\").\n");
+  ExpectHasErrors("blah;",
+                  "0:0: Expected top-level statement (e.g. \"message\").\n");
 }
 
 TEST_F(ParseErrorTest, UnmatchedCloseBrace) {
   // This used to cause an infinite loop.  Doh.
-  ExpectHasErrors(
-    "}",
-    "0:0: Expected top-level statement (e.g. \"message\").\n"
-    "0:0: Unmatched \"}\".\n");
+  ExpectHasErrors("}",
+                  "0:0: Expected top-level statement (e.g. \"message\").\n"
+                  "0:0: Unmatched \"}\".\n");
 }
 
 // -------------------------------------------------------------------
 // Message errors
 
 TEST_F(ParseErrorTest, MessageMissingName) {
-  ExpectHasErrors(
-    "message {}",
-    "0:8: Expected message name.\n");
+  ExpectHasErrors("message {}", "0:8: Expected message name.\n");
 }
 
 TEST_F(ParseErrorTest, MessageMissingBody) {
-  ExpectHasErrors(
-    "message TestMessage;",
-    "0:19: Expected \"{\".\n");
+  ExpectHasErrors("message TestMessage;", "0:19: Expected \"{\".\n");
 }
 
 TEST_F(ParseErrorTest, EofInMessage) {
   ExpectHasErrors(
-    "message TestMessage {",
-    "0:21: Reached end of input in message definition (missing '}').\n");
+      "message TestMessage {",
+      "0:21: Reached end of input in message definition (missing '}').\n");
 }
 
 TEST_F(ParseErrorTest, MissingFieldNumber) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional int32 foo;\n"
-    "}\n",
-    "1:20: Missing field number.\n");
+      "message TestMessage {\n"
+      "  optional int32 foo;\n"
+      "}\n",
+      "1:20: Missing field number.\n");
 }
 
 TEST_F(ParseErrorTest, ExpectedFieldNumber) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional int32 foo = ;\n"
-    "}\n",
-    "1:23: Expected field number.\n");
+      "message TestMessage {\n"
+      "  optional int32 foo = ;\n"
+      "}\n",
+      "1:23: Expected field number.\n");
 }
 
 TEST_F(ParseErrorTest, FieldNumberOutOfRange) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional int32 foo = 0x100000000;\n"
-    "}\n",
-    "1:23: Integer out of range.\n");
+      "message TestMessage {\n"
+      "  optional int32 foo = 0x100000000;\n"
+      "}\n",
+      "1:23: Integer out of range.\n");
 }
 
 TEST_F(ParseErrorTest, MissingLabel) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  int32 foo = 1;\n"
-    "}\n",
-    "1:2: Expected \"required\", \"optional\", or \"repeated\".\n");
+      "message TestMessage {\n"
+      "  int32 foo = 1;\n"
+      "}\n",
+      "1:2: Expected \"required\", \"optional\", or \"repeated\".\n");
 }
 
 TEST_F(ParseErrorTest, ExpectedOptionName) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional uint32 foo = 1 [];\n"
-    "}\n",
-    "1:27: Expected identifier.\n");
+      "message TestMessage {\n"
+      "  optional uint32 foo = 1 [];\n"
+      "}\n",
+      "1:27: Expected identifier.\n");
 }
 
 TEST_F(ParseErrorTest, NonExtensionOptionNameBeginningWithDot) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional uint32 foo = 1 [.foo=1];\n"
-    "}\n",
-    "1:27: Expected identifier.\n");
+      "message TestMessage {\n"
+      "  optional uint32 foo = 1 [.foo=1];\n"
+      "}\n",
+      "1:27: Expected identifier.\n");
 }
 
 TEST_F(ParseErrorTest, DefaultValueTypeMismatch) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional uint32 foo = 1 [default=true];\n"
-    "}\n",
-    "1:35: Expected integer for field default value.\n");
+      "message TestMessage {\n"
+      "  optional uint32 foo = 1 [default=true];\n"
+      "}\n",
+      "1:35: Expected integer for field default value.\n");
 }
 
 TEST_F(ParseErrorTest, DefaultValueNotBoolean) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional bool foo = 1 [default=blah];\n"
-    "}\n",
-    "1:33: Expected \"true\" or \"false\".\n");
+      "message TestMessage {\n"
+      "  optional bool foo = 1 [default=blah];\n"
+      "}\n",
+      "1:33: Expected \"true\" or \"false\".\n");
 }
 
 TEST_F(ParseErrorTest, DefaultValueNotString) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional string foo = 1 [default=1];\n"
-    "}\n",
-    "1:35: Expected string for field default value.\n");
+      "message TestMessage {\n"
+      "  optional string foo = 1 [default=1];\n"
+      "}\n",
+      "1:35: Expected string for field default value.\n");
 }
 
 TEST_F(ParseErrorTest, DefaultValueUnsignedNegative) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional uint32 foo = 1 [default=-1];\n"
-    "}\n",
-    "1:36: Unsigned field can't have negative default value.\n");
+      "message TestMessage {\n"
+      "  optional uint32 foo = 1 [default=-1];\n"
+      "}\n",
+      "1:36: Unsigned field can't have negative default value.\n");
 }
 
 TEST_F(ParseErrorTest, DefaultValueTooLarge) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional int32  foo = 1 [default= 0x80000000];\n"
-    "  optional int32  foo = 1 [default=-0x80000001];\n"
-    "  optional uint32 foo = 1 [default= 0x100000000];\n"
-    "  optional int64  foo = 1 [default= 0x80000000000000000];\n"
-    "  optional int64  foo = 1 [default=-0x80000000000000001];\n"
-    "  optional uint64 foo = 1 [default= 0x100000000000000000];\n"
-    "}\n",
-    "1:36: Integer out of range.\n"
-    "2:36: Integer out of range.\n"
-    "3:36: Integer out of range.\n"
-    "4:36: Integer out of range.\n"
-    "5:36: Integer out of range.\n"
-    "6:36: Integer out of range.\n");
+      "message TestMessage {\n"
+      "  optional int32  foo = 1 [default= 0x80000000];\n"
+      "  optional int32  foo = 1 [default=-0x80000001];\n"
+      "  optional uint32 foo = 1 [default= 0x100000000];\n"
+      "  optional int64  foo = 1 [default= 0x80000000000000000];\n"
+      "  optional int64  foo = 1 [default=-0x80000000000000001];\n"
+      "  optional uint64 foo = 1 [default= 0x100000000000000000];\n"
+      "}\n",
+      "1:36: Integer out of range.\n"
+      "2:36: Integer out of range.\n"
+      "3:36: Integer out of range.\n"
+      "4:36: Integer out of range.\n"
+      "5:36: Integer out of range.\n"
+      "6:36: Integer out of range.\n");
 }
 
 TEST_F(ParseErrorTest, JsonNameNotString) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional string foo = 1 [json_name=1];\n"
-    "}\n",
-    "1:37: Expected string for JSON name.\n");
+      "message TestMessage {\n"
+      "  optional string foo = 1 [json_name=1];\n"
+      "}\n",
+      "1:37: Expected string for JSON name.\n");
 }
 
 TEST_F(ParseErrorTest, DuplicateJsonName) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional uint32 foo = 1 [json_name=\"a\",json_name=\"b\"];\n"
-    "}\n",
-    "1:41: Already set option \"json_name\".\n");
+      "message TestMessage {\n"
+      "  optional uint32 foo = 1 [json_name=\"a\",json_name=\"b\"];\n"
+      "}\n",
+      "1:41: Already set option \"json_name\".\n");
 }
 
 TEST_F(ParseErrorTest, EnumValueOutOfRange) {
   ExpectHasErrors(
-    "enum TestEnum {\n"
-    "  HEX_TOO_BIG   =  0x80000000;\n"
-    "  HEX_TOO_SMALL = -0x80000001;\n"
-    "  INT_TOO_BIG   =  2147483648;\n"
-    "  INT_TOO_SMALL = -2147483649;\n"
-    "}\n",
-    "1:19: Integer out of range.\n"
-    "2:19: Integer out of range.\n"
-    "3:19: Integer out of range.\n"
-    "4:19: Integer out of range.\n");
+      "enum TestEnum {\n"
+      "  HEX_TOO_BIG   =  0x80000000;\n"
+      "  HEX_TOO_SMALL = -0x80000001;\n"
+      "  INT_TOO_BIG   =  2147483648;\n"
+      "  INT_TOO_SMALL = -2147483649;\n"
+      "}\n",
+      "1:19: Integer out of range.\n"
+      "2:19: Integer out of range.\n"
+      "3:19: Integer out of range.\n"
+      "4:19: Integer out of range.\n");
 }
 
 TEST_F(ParseErrorTest, EnumAllowAliasFalse) {
   ExpectHasErrors(
-    "enum Foo {\n"
-    "  option allow_alias = false;\n"
-    "  BAR = 1;\n"
-    "  BAZ = 2;\n"
-    "}\n",
-    "5:0: \"Foo\" declares 'option allow_alias = false;' which has no effect. "
-    "Please remove the declaration.\n");
+      "enum Foo {\n"
+      "  option allow_alias = false;\n"
+      "  BAR = 1;\n"
+      "  BAZ = 2;\n"
+      "}\n",
+      "5:0: \"Foo\" declares 'option allow_alias = false;' which has no "
+      "effect. "
+      "Please remove the declaration.\n");
 }
 
 TEST_F(ParseErrorTest, UnnecessaryEnumAllowAlias) {
   ExpectHasErrors(
-    "enum Foo {\n"
-    "  option allow_alias = true;\n"
-    "  BAR = 1;\n"
-    "  BAZ = 2;\n"
-    "}\n",
-    "5:0: \"Foo\" declares support for enum aliases but no enum values share "
-    "field numbers. Please remove the unnecessary 'option allow_alias = true;' "
-    "declaration.\n");
+      "enum Foo {\n"
+      "  option allow_alias = true;\n"
+      "  BAR = 1;\n"
+      "  BAZ = 2;\n"
+      "}\n",
+      "5:0: \"Foo\" declares support for enum aliases but no enum values share "
+      "field numbers. Please remove the unnecessary 'option allow_alias = "
+      "true;' "
+      "declaration.\n");
 }
 
 TEST_F(ParseErrorTest, DefaultValueMissing) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional uint32 foo = 1 [default=];\n"
-    "}\n",
-    "1:35: Expected integer for field default value.\n");
+      "message TestMessage {\n"
+      "  optional uint32 foo = 1 [default=];\n"
+      "}\n",
+      "1:35: Expected integer for field default value.\n");
 }
 
 TEST_F(ParseErrorTest, DefaultValueForGroup) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional group Foo = 1 [default=blah] {}\n"
-    "}\n",
-    "1:34: Messages can't have default values.\n");
+      "message TestMessage {\n"
+      "  optional group Foo = 1 [default=blah] {}\n"
+      "}\n",
+      "1:34: Messages can't have default values.\n");
 }
 
 TEST_F(ParseErrorTest, DuplicateDefaultValue) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional uint32 foo = 1 [default=1,default=2];\n"
-    "}\n",
-    "1:37: Already set option \"default\".\n");
+      "message TestMessage {\n"
+      "  optional uint32 foo = 1 [default=1,default=2];\n"
+      "}\n",
+      "1:37: Already set option \"default\".\n");
 }
 
 TEST_F(ParseErrorTest, MissingOneofName) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  oneof {\n"
-    "    int32 bar = 1;\n"
-    "  }\n"
-    "}\n",
-    "1:8: Expected oneof name.\n");
+      "message TestMessage {\n"
+      "  oneof {\n"
+      "    int32 bar = 1;\n"
+      "  }\n"
+      "}\n",
+      "1:8: Expected oneof name.\n");
 }
 
 TEST_F(ParseErrorTest, LabelInOneof) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  oneof foo {\n"
-    "    optional int32 bar = 1;\n"
-    "  }\n"
-    "}\n",
-    "2:4: Fields in oneofs must not have labels (required / optional "
+      "message TestMessage {\n"
+      "  oneof foo {\n"
+      "    optional int32 bar = 1;\n"
+      "  }\n"
+      "}\n",
+      "2:4: Fields in oneofs must not have labels (required / optional "
       "/ repeated).\n");
 }
 
 TEST_F(ParseErrorTest, MapInOneof) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  oneof foo {\n"
-    "    map<int32, int32> foo_map = 1;\n"
-    "    map message_field = 2;\n"  // a normal message field is OK
-    "  }\n"
-    "}\n",
-    "2:7: Map fields are not allowed in oneofs.\n");
+      "message TestMessage {\n"
+      "  oneof foo {\n"
+      "    map<int32, int32> foo_map = 1;\n"
+      "    map message_field = 2;\n"  // a normal message field is OK
+      "  }\n"
+      "}\n",
+      "2:7: Map fields are not allowed in oneofs.\n");
 }
 
 TEST_F(ParseErrorTest, LabelForMap) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional map<int32, int32> int_map = 1;\n"
-    "  required map<int32, int32> int_map2 = 2;\n"
-    "  repeated map<int32, int32> int_map3 = 3;\n"
-    "  optional map map_message = 4;\n"  // a normal message field is OK
-    "}\n",
-    "1:14: Field labels (required/optional/repeated) are not allowed on map "
-    "fields.\n"
-    "2:14: Field labels (required/optional/repeated) are not allowed on map "
-    "fields.\n"
-    "3:14: Field labels (required/optional/repeated) are not allowed on map "
-    "fields.\n");
+      "message TestMessage {\n"
+      "  optional map<int32, int32> int_map = 1;\n"
+      "  required map<int32, int32> int_map2 = 2;\n"
+      "  repeated map<int32, int32> int_map3 = 3;\n"
+      "  optional map map_message = 4;\n"  // a normal message field is OK
+      "}\n",
+      "1:14: Field labels (required/optional/repeated) are not allowed on map "
+      "fields.\n"
+      "2:14: Field labels (required/optional/repeated) are not allowed on map "
+      "fields.\n"
+      "3:14: Field labels (required/optional/repeated) are not allowed on map "
+      "fields.\n");
 }
 
 TEST_F(ParseErrorTest, MalformedMaps) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  map map_message = 1;\n"   // a normal message field lacking label
-    "  map<string> str_map = 2;\n"
-    "  map<string,> str_map2 = 3;\n"
-    "  map<,string> str_map3 = 4;\n"
-    "  map<> empty_map = 5;\n"
-    "  map<string,string str_map6 = 6;\n"
-    "}"
-    "extend SomeMessage {\n"
-    "  map<int32, int32> int_map = 1;\n"
-    "}",
-    "1:6: Expected \"required\", \"optional\", or \"repeated\".\n"
-    "2:12: Expected \",\".\n"
-    "3:13: Expected type name.\n"
-    "4:6: Expected type name.\n"
-    "5:6: Expected type name.\n"
-    "6:20: Expected \">\".\n"
-    "8:5: Map fields are not allowed to be extensions.\n");
+      "message TestMessage {\n"
+      "  map map_message = 1;\n"  // a normal message field lacking label
+      "  map<string> str_map = 2;\n"
+      "  map<string,> str_map2 = 3;\n"
+      "  map<,string> str_map3 = 4;\n"
+      "  map<> empty_map = 5;\n"
+      "  map<string,string str_map6 = 6;\n"
+      "}"
+      "extend SomeMessage {\n"
+      "  map<int32, int32> int_map = 1;\n"
+      "}",
+      "1:6: Expected \"required\", \"optional\", or \"repeated\".\n"
+      "2:12: Expected \",\".\n"
+      "3:13: Expected type name.\n"
+      "4:6: Expected type name.\n"
+      "5:6: Expected type name.\n"
+      "6:20: Expected \">\".\n"
+      "8:5: Map fields are not allowed to be extensions.\n");
 }
 
 TEST_F(ParseErrorTest, GroupNotCapitalized) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional group foo = 1 {}\n"
-    "}\n",
-    "1:17: Group names must start with a capital letter.\n");
+      "message TestMessage {\n"
+      "  optional group foo = 1 {}\n"
+      "}\n",
+      "1:17: Group names must start with a capital letter.\n");
 }
 
 TEST_F(ParseErrorTest, GroupMissingBody) {
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional group Foo = 1;\n"
-    "}\n",
-    "1:24: Missing group body.\n");
+      "message TestMessage {\n"
+      "  optional group Foo = 1;\n"
+      "}\n",
+      "1:24: Missing group body.\n");
 }
 
 TEST_F(ParseErrorTest, ExtendingPrimitive) {
-  ExpectHasErrors(
-    "extend int32 { optional string foo = 4; }\n",
-    "0:7: Expected message type.\n");
+  ExpectHasErrors("extend int32 { optional string foo = 4; }\n",
+                  "0:7: Expected message type.\n");
 }
 
 TEST_F(ParseErrorTest, ErrorInExtension) {
   ExpectHasErrors(
-    "message Foo { extensions 100 to 199; }\n"
-    "extend Foo { optional string foo; }\n",
-    "1:32: Missing field number.\n");
+      "message Foo { extensions 100 to 199; }\n"
+      "extend Foo { optional string foo; }\n",
+      "1:32: Missing field number.\n");
 }
 
 TEST_F(ParseErrorTest, MultipleParseErrors) {
   // When a statement has a parse error, the parser should be able to continue
   // parsing at the next statement.
   ExpectHasErrors(
-    "message TestMessage {\n"
-    "  optional int32 foo;\n"
-    "  !invalid statement ending in a block { blah blah { blah } blah }\n"
-    "  optional int32 bar = 3 {}\n"
-    "}\n",
-    "1:20: Missing field number.\n"
-    "2:2: Expected \"required\", \"optional\", or \"repeated\".\n"
-    "2:2: Expected type name.\n"
-    "3:25: Expected \";\".\n");
+      "message TestMessage {\n"
+      "  optional int32 foo;\n"
+      "  !invalid statement ending in a block { blah blah { blah } blah }\n"
+      "  optional int32 bar = 3 {}\n"
+      "}\n",
+      "1:20: Missing field number.\n"
+      "2:2: Expected \"required\", \"optional\", or \"repeated\".\n"
+      "2:2: Expected type name.\n"
+      "3:25: Expected \";\".\n");
 }
 
 TEST_F(ParseErrorTest, EofInAggregateValue) {
@@ -1503,67 +1545,66 @@
       "label, as fields are 'optional' by default.\n");
 }
 
-
 // -------------------------------------------------------------------
 // Enum errors
 
 TEST_F(ParseErrorTest, EofInEnum) {
   ExpectHasErrors(
-    "enum TestEnum {",
-    "0:15: Reached end of input in enum definition (missing '}').\n");
+      "enum TestEnum {",
+      "0:15: Reached end of input in enum definition (missing '}').\n");
 }
 
 TEST_F(ParseErrorTest, EnumValueMissingNumber) {
   ExpectHasErrors(
-    "enum TestEnum {\n"
-    "  FOO;\n"
-    "}\n",
-    "1:5: Missing numeric value for enum constant.\n");
+      "enum TestEnum {\n"
+      "  FOO;\n"
+      "}\n",
+      "1:5: Missing numeric value for enum constant.\n");
 }
 
 TEST_F(ParseErrorTest, EnumReservedStandaloneMaxNotAllowed) {
   ExpectHasErrors(
-    "enum TestEnum {\n"
-    "  FOO = 1;\n"
-    "  reserved max;\n"
-    "}\n",
-    "2:11: Expected enum value or number range.\n");
+      "enum TestEnum {\n"
+      "  FOO = 1;\n"
+      "  reserved max;\n"
+      "}\n",
+      "2:11: Expected enum value or number range.\n");
 }
 
 TEST_F(ParseErrorTest, EnumReservedMixNameAndNumber) {
   ExpectHasErrors(
-    "enum TestEnum {\n"
-    "  FOO = 1;\n"
-    "  reserved 10, \"foo\";\n"
-    "}\n",
-    "2:15: Expected enum number range.\n");
+      "enum TestEnum {\n"
+      "  FOO = 1;\n"
+      "  reserved 10, \"foo\";\n"
+      "}\n",
+      "2:15: Expected enum number range.\n");
 }
 
 TEST_F(ParseErrorTest, EnumReservedPositiveNumberOutOfRange) {
   ExpectHasErrors(
-    "enum TestEnum {\n"
-       "FOO = 1;\n"
-    "  reserved 2147483648;\n"
-    "}\n",
-    "2:11: Integer out of range.\n");
+      "enum TestEnum {\n"
+      "FOO = 1;\n"
+      "  reserved 2147483648;\n"
+      "}\n",
+      "2:11: Integer out of range.\n");
 }
 
 TEST_F(ParseErrorTest, EnumReservedNegativeNumberOutOfRange) {
   ExpectHasErrors(
-    "enum TestEnum {\n"
-       "FOO = 1;\n"
-    "  reserved -2147483649;\n"
-    "}\n",
-    "2:12: Integer out of range.\n");
+      "enum TestEnum {\n"
+      "FOO = 1;\n"
+      "  reserved -2147483649;\n"
+      "}\n",
+      "2:12: Integer out of range.\n");
 }
 
 TEST_F(ParseErrorTest, EnumReservedMissingQuotes) {
   ExpectHasErrors(
-    "enum TestEnum {\n"
-    "  FOO = 1;\n"
-    "  reserved foo;\n"
-    "}\n",
-    "2:11: Expected enum value or number range.\n");
+      "enum TestEnum {\n"
+      "  FOO = 1;\n"
+      "  reserved foo;\n"
+      "}\n",
+      "2:11: Expected enum value or number range.\n");
 }
 
 // -------------------------------------------------------------------
@@ -1571,90 +1612,89 @@
 
 TEST_F(ParseErrorTest, ReservedStandaloneMaxNotAllowed) {
   ExpectHasErrors(
-    "message Foo {\n"
-    "  reserved max;\n"
-    "}\n",
-    "1:11: Expected field name or number range.\n");
+      "message Foo {\n"
+      "  reserved max;\n"
+      "}\n",
+      "1:11: Expected field name or number range.\n");
 }
 
 TEST_F(ParseErrorTest, ReservedMixNameAndNumber) {
   ExpectHasErrors(
-    "message Foo {\n"
-    "  reserved 10, \"foo\";\n"
-    "}\n",
-    "1:15: Expected field number range.\n");
+      "message Foo {\n"
+      "  reserved 10, \"foo\";\n"
+      "}\n",
+      "1:15: Expected field number range.\n");
 }
 
 TEST_F(ParseErrorTest, ReservedMissingQuotes) {
   ExpectHasErrors(
-    "message Foo {\n"
-    "  reserved foo;\n"
-    "}\n",
-    "1:11: Expected field name or number range.\n");
+      "message Foo {\n"
+      "  reserved foo;\n"
+      "}\n",
+      "1:11: Expected field name or number range.\n");
 }
 
 TEST_F(ParseErrorTest, ReservedNegativeNumber) {
   ExpectHasErrors(
-    "message Foo {\n"
-    "  reserved -10;\n"
-    "}\n",
-    "1:11: Expected field name or number range.\n");
+      "message Foo {\n"
+      "  reserved -10;\n"
+      "}\n",
+      "1:11: Expected field name or number range.\n");
 }
 
 TEST_F(ParseErrorTest, ReservedNumberOutOfRange) {
   ExpectHasErrors(
-    "message Foo {\n"
-    "  reserved 2147483648;\n"
-    "}\n",
-    "1:11: Integer out of range.\n");
+      "message Foo {\n"
+      "  reserved 2147483648;\n"
+      "}\n",
+      "1:11: Integer out of range.\n");
 }
 
-
 // -------------------------------------------------------------------
 // Service errors
 
 TEST_F(ParseErrorTest, EofInService) {
   ExpectHasErrors(
-    "service TestService {",
-    "0:21: Reached end of input in service definition (missing '}').\n");
+      "service TestService {",
+      "0:21: Reached end of input in service definition (missing '}').\n");
 }
 
 TEST_F(ParseErrorTest, ServiceMethodPrimitiveParams) {
   ExpectHasErrors(
-    "service TestService {\n"
-    "  rpc Foo(int32) returns (string);\n"
-    "}\n",
-    "1:10: Expected message type.\n"
-    "1:26: Expected message type.\n");
+      "service TestService {\n"
+      "  rpc Foo(int32) returns (string);\n"
+      "}\n",
+      "1:10: Expected message type.\n"
+      "1:26: Expected message type.\n");
 }
 
 
 TEST_F(ParseErrorTest, EofInMethodOptions) {
   ExpectHasErrors(
-    "service TestService {\n"
-    "  rpc Foo(Bar) returns(Bar) {",
-    "1:29: Reached end of input in method options (missing '}').\n"
-    "1:29: Reached end of input in service definition (missing '}').\n");
+      "service TestService {\n"
+      "  rpc Foo(Bar) returns(Bar) {",
+      "1:29: Reached end of input in method options (missing '}').\n"
+      "1:29: Reached end of input in service definition (missing '}').\n");
 }
 
 
 TEST_F(ParseErrorTest, PrimitiveMethodInput) {
   ExpectHasErrors(
-    "service TestService {\n"
-    "  rpc Foo(int32) returns(Bar);\n"
-    "}\n",
-    "1:10: Expected message type.\n");
+      "service TestService {\n"
+      "  rpc Foo(int32) returns(Bar);\n"
+      "}\n",
+      "1:10: Expected message type.\n");
 }
 
 
 TEST_F(ParseErrorTest, MethodOptionTypeError) {
   // This used to cause an infinite loop.
   ExpectHasErrors(
-    "message Baz {}\n"
-    "service Foo {\n"
-    "  rpc Bar(Baz) returns(Baz) { option invalid syntax; }\n"
-    "}\n",
-    "2:45: Expected \"=\".\n");
+      "message Baz {}\n"
+      "service Foo {\n"
+      "  rpc Bar(Baz) returns(Baz) { option invalid syntax; }\n"
+      "}\n",
+      "2:45: Expected \"=\".\n");
 }
 
 
@@ -1662,16 +1702,15 @@
 // Import and package errors
 
 TEST_F(ParseErrorTest, ImportNotQuoted) {
-  ExpectHasErrors(
-    "import foo;\n",
-    "0:7: Expected a string naming the file to import.\n");
+  ExpectHasErrors("import foo;\n",
+                  "0:7: Expected a string naming the file to import.\n");
 }
 
 TEST_F(ParseErrorTest, MultiplePackagesInFile) {
   ExpectHasErrors(
-    "package foo;\n"
-    "package bar;\n",
-    "1:0: Multiple package definitions.\n");
+      "package foo;\n"
+      "package bar;\n",
+      "1:0: Multiple package definitions.\n");
 }
 
 // ===================================================================
@@ -1690,149 +1729,272 @@
 
   // Now try to define it as a package.
   ExpectHasValidationErrors(
-    "package foo.bar;",
-    "0:0: \"foo\" is already defined (as something other than a package) "
+      "package foo.bar;",
+      "0:0: \"foo\" is already defined (as something other than a package) "
       "in file \"bar.proto\".\n");
 }
 
+TEST_F(ParserValidationErrorTest, ImportUnloadedError) {
+  ExpectHasValidationErrors(
+      "package test;\n"
+      "\n"
+      "import \"unloaded.proto\";",
+      "2:0: Import \"unloaded.proto\" has not been loaded.\n");
+}
+
+TEST_F(ParserValidationErrorTest, ImportTwice) {
+  FileDescriptorProto other_file;
+  other_file.set_name("bar.proto");
+  other_file.add_message_type()->set_name("foo");
+  EXPECT_TRUE(pool_.BuildFile(other_file) != nullptr);
+
+  ExpectHasValidationErrors(
+      "package test;\n"
+      "\n"
+      "import \"bar.proto\";\n"
+      "  import \"bar.proto\";",
+      "3:2: Import \"bar.proto\" was listed twice.\n");
+}
+
+TEST_F(ParserValidationErrorTest, DuplicateFileError) {
+  FileDescriptorProto other_file;
+  other_file.set_name("foo.proto");
+  EXPECT_TRUE(pool_.BuildFile(other_file) != nullptr);
+
+  ExpectHasValidationErrors(
+      "package test;", "0:0: A file with this name is already in the pool.\n");
+}
+
 TEST_F(ParserValidationErrorTest, MessageNameError) {
   ExpectHasValidationErrors(
-    "message Foo {}\n"
-    "message Foo {}\n",
-    "1:8: \"Foo\" is already defined.\n");
+      "message Foo {}\n"
+      "message Foo {}\n",
+      "1:8: \"Foo\" is already defined.\n");
 }
 
 TEST_F(ParserValidationErrorTest, FieldNameError) {
   ExpectHasValidationErrors(
-    "message Foo {\n"
-    "  optional int32 bar = 1;\n"
-    "  optional int32 bar = 2;\n"
-    "}\n",
-    "2:17: \"bar\" is already defined in \"Foo\".\n");
+      "message Foo {\n"
+      "  optional int32 bar = 1;\n"
+      "  optional int32 bar = 2;\n"
+      "}\n",
+      "2:17: \"bar\" is already defined in \"Foo\".\n");
 }
 
 TEST_F(ParserValidationErrorTest, FieldTypeError) {
   ExpectHasValidationErrors(
-    "message Foo {\n"
-    "  optional Baz bar = 1;\n"
-    "}\n",
-    "1:11: \"Baz\" is not defined.\n");
+      "message Foo {\n"
+      "  optional Baz bar = 1;\n"
+      "}\n",
+      "1:11: \"Baz\" is not defined.\n");
 }
 
 TEST_F(ParserValidationErrorTest, FieldNumberError) {
   ExpectHasValidationErrors(
-    "message Foo {\n"
-    "  optional int32 bar = 0;\n"
-    "}\n",
-    "1:23: Field numbers must be positive integers.\n");
+      "message Foo {\n"
+      "  optional int32 bar = 0;\n"
+      "}\n",
+      "1:23: Field numbers must be positive integers.\n");
 }
 
 TEST_F(ParserValidationErrorTest, FieldExtendeeError) {
+  ExpectHasValidationErrors("extend Baz { optional int32 bar = 1; }\n",
+                            "0:7: \"Baz\" is not defined.\n");
+}
+
+TEST_F(ParserValidationErrorTest, ExtensionJsonNameError) {
   ExpectHasValidationErrors(
-    "extend Baz { optional int32 bar = 1; }\n",
-    "0:7: \"Baz\" is not defined.\n");
+      "message TestMessage {\n"
+      "  extensions 1 to 100;\n"
+      "}\n"
+      "extend TestMessage {\n"
+      "  optional int32 foo = 12 [json_name = \"bar\"];\n"
+      "}",
+      "4:27: option json_name is not allowed on extension fields.\n");
 }
 
 TEST_F(ParserValidationErrorTest, FieldDefaultValueError) {
   ExpectHasValidationErrors(
-    "enum Baz { QUX = 1; }\n"
-    "message Foo {\n"
-    "  optional Baz bar = 1 [default=NO_SUCH_VALUE];\n"
-    "}\n",
-    "2:32: Enum type \"Baz\" has no value named \"NO_SUCH_VALUE\".\n");
+      "enum Baz { QUX = 1; }\n"
+      "message Foo {\n"
+      "  optional Baz bar = 1 [default=NO_SUCH_VALUE];\n"
+      "}\n",
+      "2:32: Enum type \"Baz\" has no value named \"NO_SUCH_VALUE\".\n");
 }
 
 TEST_F(ParserValidationErrorTest, FileOptionNameError) {
   ExpectHasValidationErrors(
-    "option foo = 5;",
-    "0:7: Option \"foo\" unknown. Ensure that your proto definition file "
-    "imports the proto which defines the option.\n");
+      "option foo = 5;",
+      "0:7: Option \"foo\" unknown. Ensure that your proto definition file "
+      "imports the proto which defines the option.\n");
 }
 
 TEST_F(ParserValidationErrorTest, FileOptionValueError) {
   ExpectHasValidationErrors(
-    "option java_outer_classname = 5;",
-    "0:30: Value must be quoted string for string option "
-    "\"google.protobuf.FileOptions.java_outer_classname\".\n");
+      "option java_outer_classname = 5;",
+      "0:30: Value must be quoted string for string option "
+      "\"google.protobuf.FileOptions.java_outer_classname\".\n");
 }
 
 TEST_F(ParserValidationErrorTest, FieldOptionNameError) {
   ExpectHasValidationErrors(
-    "message Foo {\n"
-    "  optional bool bar = 1 [foo=1];\n"
-    "}\n",
-    "1:25: Option \"foo\" unknown. Ensure that your proto definition file "
-    "imports the proto which defines the option.\n");
+      "message Foo {\n"
+      "  optional bool bar = 1 [foo=1];\n"
+      "}\n",
+      "1:25: Option \"foo\" unknown. Ensure that your proto definition file "
+      "imports the proto which defines the option.\n");
 }
 
 TEST_F(ParserValidationErrorTest, FieldOptionValueError) {
   ExpectHasValidationErrors(
-    "message Foo {\n"
-    "  optional int32 bar = 1 [ctype=1];\n"
-    "}\n",
-    "1:32: Value must be identifier for enum-valued option "
-    "\"google.protobuf.FieldOptions.ctype\".\n");
+      "message Foo {\n"
+      "  optional int32 bar = 1 [ctype=1];\n"
+      "}\n",
+      "1:32: Value must be identifier for enum-valued option "
+      "\"google.protobuf.FieldOptions.ctype\".\n");
 }
 
 TEST_F(ParserValidationErrorTest, ExtensionRangeNumberError) {
   ExpectHasValidationErrors(
-    "message Foo {\n"
-    "  extensions 0;\n"
-    "}\n",
-    "1:13: Extension numbers must be positive integers.\n");
+      "message Foo {\n"
+      "  extensions 0;\n"
+      "}\n",
+      "1:13: Extension numbers must be positive integers.\n");
+}
+
+TEST_F(ParserValidationErrorTest, Proto3ExtensionError) {
+  ExpectHasValidationErrors(
+      "syntax = 'proto3';\n"
+      "message Foo { \n"
+      "  extensions 100 to 199;\n"
+      "}\n"
+      "extend Foo { string foo = 101; }\n",
+      "4:7: Extensions in proto3 are only allowed for defining options.\n"
+      "2:13: Extension ranges are not allowed in proto3.\n");
+}
+
+TEST_F(ParserValidationErrorTest, Proto3MessageSet) {
+  ExpectHasValidationErrors(
+      "syntax = 'proto3';\n"
+      "message Foo { \n"
+      "  option message_set_wire_format = true;\n"
+      "}\n",
+      "1:8: MessageSet is not supported in proto3.\n");
+}
+
+TEST_F(ParserValidationErrorTest, Proto3Required) {
+  ExpectHasValidationErrors(
+      "syntax = 'proto3';\n"
+      "message Foo { \n"
+      "  required int32 field = 1;"
+      "}\n",
+      "2:11: Required fields are not allowed in proto3.\n");
+}
+
+TEST_F(ParserValidationErrorTest, Proto3Default) {
+  ExpectHasValidationErrors(
+      "syntax = 'proto3';\n"
+      "message Foo { \n"
+      "  int32 field = 1 [default = 12];"
+      "}\n",
+      "2:29: Explicit default values are not allowed in proto3.\n");
+}
+
+TEST_F(ParserValidationErrorTest, Proto3JsonConflictError) {
+  ExpectHasValidationErrors(
+      "syntax = 'proto3';\n"
+      "message TestMessage {\n"
+      "  uint32 foo = 1;\n"
+      "  uint32 Foo = 2;\n"
+      "}\n",
+      "3:9: The JSON camel-case name of field \"Foo\" conflicts with field "
+      "\"foo\". This is not allowed in proto3.\n");
 }
 
 TEST_F(ParserValidationErrorTest, EnumNameError) {
   ExpectHasValidationErrors(
-    "enum Foo {A = 1;}\n"
-    "enum Foo {B = 1;}\n",
-    "1:5: \"Foo\" is already defined.\n");
+      "enum Foo {A = 1;}\n"
+      "enum Foo {B = 1;}\n",
+      "1:5: \"Foo\" is already defined.\n");
+}
+
+TEST_F(ParserValidationErrorTest, Proto3EnumError) {
+  ExpectHasValidationErrors(
+      "syntax = 'proto3';\n"
+      "enum Foo {A = 1;}\n",
+      "1:14: The first enum value must be zero in proto3.\n");
 }
 
 TEST_F(ParserValidationErrorTest, EnumValueNameError) {
   ExpectHasValidationErrors(
-    "enum Foo {\n"
-    "  BAR = 1;\n"
-    "  BAR = 1;\n"
-    "}\n",
-    "2:2: \"BAR\" is already defined.\n");
+      "enum Foo {\n"
+      "  BAR = 1;\n"
+      "  BAR = 1;\n"
+      "}\n",
+      "2:2: \"BAR\" is already defined.\n");
+}
+
+TEST_F(ParserValidationErrorTest, EnumValueAliasError) {
+  ExpectHasValidationErrors(
+      "enum Foo {\n"
+      "  BAR = 1;\n"
+      "  BAZ = 1;\n"
+      "}\n",
+      "2:8: \"BAZ\" uses the same enum value as \"BAR\". If this is "
+      "intended, set 'option allow_alias = true;' to the enum "
+      "definition.\n");
+}
+
+TEST_F(ParserValidationErrorTest, ExplicitlyMapEntryError) {
+  ExpectHasValidationErrors(
+      "message Foo {\n"
+      "  message ValueEntry {\n"
+      "    option map_entry = true;\n"
+      "    optional int32 key = 1;\n"
+      "    optional int32 value = 2;\n"
+      "    extensions 99 to 999;\n"
+      "  }\n"
+      "  repeated ValueEntry value = 1;\n"
+      "}",
+      "7:11: map_entry should not be set explicitly. Use "
+      "map<KeyType, ValueType> instead.\n");
 }
 
 TEST_F(ParserValidationErrorTest, ServiceNameError) {
   ExpectHasValidationErrors(
-    "service Foo {}\n"
-    "service Foo {}\n",
-    "1:8: \"Foo\" is already defined.\n");
+      "service Foo {}\n"
+      "service Foo {}\n",
+      "1:8: \"Foo\" is already defined.\n");
 }
 
 TEST_F(ParserValidationErrorTest, MethodNameError) {
   ExpectHasValidationErrors(
-    "message Baz {}\n"
-    "service Foo {\n"
-    "  rpc Bar(Baz) returns(Baz);\n"
-    "  rpc Bar(Baz) returns(Baz);\n"
-    "}\n",
-    "3:6: \"Bar\" is already defined in \"Foo\".\n");
+      "message Baz {}\n"
+      "service Foo {\n"
+      "  rpc Bar(Baz) returns(Baz);\n"
+      "  rpc Bar(Baz) returns(Baz);\n"
+      "}\n",
+      "3:6: \"Bar\" is already defined in \"Foo\".\n");
 }
 
 
 TEST_F(ParserValidationErrorTest, MethodInputTypeError) {
   ExpectHasValidationErrors(
-    "message Baz {}\n"
-    "service Foo {\n"
-    "  rpc Bar(Qux) returns(Baz);\n"
-    "}\n",
-    "2:10: \"Qux\" is not defined.\n");
+      "message Baz {}\n"
+      "service Foo {\n"
+      "  rpc Bar(Qux) returns(Baz);\n"
+      "}\n",
+      "2:10: \"Qux\" is not defined.\n");
 }
 
 
 TEST_F(ParserValidationErrorTest, MethodOutputTypeError) {
   ExpectHasValidationErrors(
-    "message Baz {}\n"
-    "service Foo {\n"
-    "  rpc Bar(Baz) returns(Qux);\n"
-    "}\n",
-    "2:23: \"Qux\" is not defined.\n");
+      "message Baz {}\n"
+      "service Foo {\n"
+      "  rpc Bar(Baz) returns(Qux);\n"
+      "}\n",
+      "2:23: \"Qux\" is not defined.\n");
 }
 
 
@@ -1847,16 +2009,16 @@
   // Define "foo.base" and try "base.bar".
   // "base.bar" is resolved to "foo.base.bar" which is not defined.
   ExpectHasValidationErrors(
-    "package foo.base;\n"
-    "import \"base.proto\";\n"
-    "message qux {\n"
-    "  optional base.bar baz = 1;\n"
-    "  optional .base.bar quz = 2;\n"
-    "}\n",
-    "3:11: \"base.bar\" is resolved to \"foo.base.bar\","
-    " which is not defined. The innermost scope is searched first "
-    "in name resolution. Consider using a leading '.'(i.e., \".base.bar\")"
-    " to start from the outermost scope.\n");
+      "package foo.base;\n"
+      "import \"base.proto\";\n"
+      "message qux {\n"
+      "  optional base.bar baz = 1;\n"
+      "  optional .base.bar quz = 2;\n"
+      "}\n",
+      "3:11: \"base.bar\" is resolved to \"foo.base.bar\","
+      " which is not defined. The innermost scope is searched first "
+      "in name resolution. Consider using a leading '.'(i.e., \".base.bar\")"
+      " to start from the outermost scope.\n");
 }
 
 TEST_F(ParserValidationErrorTest, ResovledUndefinedOptionError) {
@@ -1928,26 +2090,26 @@
 };
 
 // Sorts nested DescriptorProtos of a DescriptoProto, by name.
-void SortMessages(DescriptorProto *descriptor_proto) {
+void SortMessages(DescriptorProto* descriptor_proto) {
   int size = descriptor_proto->nested_type_size();
   // recursively sort; we can't guarantee the order of nested messages either
   for (int i = 0; i < size; ++i) {
     SortMessages(descriptor_proto->mutable_nested_type(i));
   }
-  DescriptorProto **data =
-    descriptor_proto->mutable_nested_type()->mutable_data();
+  DescriptorProto** data =
+      descriptor_proto->mutable_nested_type()->mutable_data();
   std::sort(data, data + size, CompareDescriptorNames());
 }
 
 // Sorts DescriptorProtos belonging to a FileDescriptorProto, by name.
-void SortMessages(FileDescriptorProto *file_descriptor_proto) {
+void SortMessages(FileDescriptorProto* file_descriptor_proto) {
   int size = file_descriptor_proto->message_type_size();
   // recursively sort; we can't guarantee the order of nested messages either
   for (int i = 0; i < size; ++i) {
     SortMessages(file_descriptor_proto->mutable_message_type(i));
   }
-  DescriptorProto **data =
-    file_descriptor_proto->mutable_message_type()->mutable_data();
+  DescriptorProto** data =
+      file_descriptor_proto->mutable_message_type()->mutable_data();
   std::sort(data, data + size, CompareDescriptorNames());
 }
 
@@ -1974,7 +2136,7 @@
 
 TEST_F(ParseDescriptorDebugTest, TestAllDescriptorTypes) {
   const FileDescriptor* original_file =
-     protobuf_unittest::TestAllTypes::descriptor()->file();
+      protobuf_unittest::TestAllTypes::descriptor()->file();
   FileDescriptorProto expected;
   original_file->CopyTo(&expected);
 
@@ -1987,8 +2149,7 @@
   FileDescriptorProto parsed;
   parser_->Parse(input_.get(), &parsed);
   EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);
-  ASSERT_EQ("", error_collector_.text_)
-      << "Failed to parse:\n" << debug_string;
+  ASSERT_EQ("", error_collector_.text_) << "Failed to parse:\n" << debug_string;
 
   // We now have a FileDescriptorProto, but to compare with the expected we
   // need to link to a FileDecriptor, then output back to a proto. We'll
@@ -2002,14 +2163,13 @@
   public_import->CopyTo(&public_import_proto);
   ASSERT_TRUE(pool_.BuildFile(public_import_proto) != NULL);
   const FileDescriptor* import =
-       protobuf_unittest_import::ImportMessage::descriptor()->file();
+      protobuf_unittest_import::ImportMessage::descriptor()->file();
   FileDescriptorProto import_proto;
   import->CopyTo(&import_proto);
   ASSERT_TRUE(pool_.BuildFile(import_proto) != NULL);
   const FileDescriptor* actual = pool_.BuildFile(parsed);
   parsed.Clear();
-  ASSERT_TRUE(actual != NULL)
-      << "Failed to validate:\n" << debug_string;
+  ASSERT_TRUE(actual != NULL) << "Failed to validate:\n" << debug_string;
   actual->CopyTo(&parsed);
   ASSERT_TRUE(actual != NULL);
 
@@ -2027,7 +2187,7 @@
 
 TEST_F(ParseDescriptorDebugTest, TestCustomOptions) {
   const FileDescriptor* original_file =
-     protobuf_unittest::AggregateMessage::descriptor()->file();
+      protobuf_unittest::AggregateMessage::descriptor()->file();
   FileDescriptorProto expected;
   original_file->CopyTo(&expected);
 
@@ -2139,25 +2299,25 @@
   // We don't test the exact comment placement or formatting, because we do not
   // want to be too fragile here.
   const char* expected_comments[] = {
-    "Detached comment before syntax.",
-    "Syntax comment.",
-    "Detached comment before package.",
-    "Package comment.",
-    "Detached comment before TestMessage1.",
-    "Message comment.",
-    "More detail in message comment.",
-    "Detached comment before foo.",
-    "Field comment",
-    "Detached comment before NestedMessage.",
-    "Nested-message comment",
-    "Detached comment before MyEnumType.",
-    "Enum comment",
-    "Detached comment before ASDF.",
-    "Enum-value comment",
-    "Detached comment before MyService.",
-    "Service comment",
-    "Detached comment before MyRPCCall.",
-    "RPC comment",
+      "Detached comment before syntax.",
+      "Syntax comment.",
+      "Detached comment before package.",
+      "Package comment.",
+      "Detached comment before TestMessage1.",
+      "Message comment.",
+      "More detail in message comment.",
+      "Detached comment before foo.",
+      "Field comment",
+      "Detached comment before NestedMessage.",
+      "Nested-message comment",
+      "Detached comment before MyEnumType.",
+      "Enum comment",
+      "Detached comment before ASDF.",
+      "Enum-value comment",
+      "Detached comment before MyService.",
+      "Service comment",
+      "Detached comment before MyRPCCall.",
+      "RPC comment",
   };
 
   DebugStringOptions debug_string_options;
@@ -2179,8 +2339,8 @@
     FileDescriptorProto parsed;
     parser_->Parse(input_.get(), &parsed);
     EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type);
-    ASSERT_EQ("", error_collector_.text_)
-        << "Failed to parse:\n" << debug_string;
+    ASSERT_EQ("", error_collector_.text_) << "Failed to parse:\n"
+                                          << debug_string;
   }
 
 }
@@ -2234,11 +2394,9 @@
 //   *output_field to the descriptor of the field, and *output_index to -1.
 // Returns true if the path was valid, false otherwise.  A gTest failure is
 // recorded before returning false.
-bool FollowPath(const Message& root,
-                const int* path_begin, const int* path_end,
+bool FollowPath(const Message& root, const int* path_begin, const int* path_end,
                 const Message** output_message,
-                const FieldDescriptor** output_field,
-                int* output_index) {
+                const FieldDescriptor** output_field, int* output_index) {
   if (path_begin == path_end) {
     // Path refers to this whole message.
     *output_message = &root;
@@ -2253,8 +2411,8 @@
   const FieldDescriptor* field = descriptor->FindFieldByNumber(*path_begin);
 
   if (field == NULL) {
-    ADD_FAILURE() << descriptor->name() << " has no field number: "
-                  << *path_begin;
+    ADD_FAILURE() << descriptor->name()
+                  << " has no field number: " << *path_begin;
     return false;
   }
 
@@ -2274,16 +2432,16 @@
 
     if (index >= size) {
       ADD_FAILURE() << descriptor->name() << "." << field->name()
-                    << " has size " << size << ", but path contained index: "
-                    << index;
+                    << " has size " << size
+                    << ", but path contained index: " << index;
       return false;
     }
 
     if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
       // Descend into child message.
       const Message& child = reflection->GetRepeatedMessage(root, field, index);
-      return FollowPath(child, path_begin, path_end,
-                        output_message, output_field, output_index);
+      return FollowPath(child, path_begin, path_end, output_message,
+                        output_field, output_index);
     } else if (path_begin == path_end) {
       // Path refers to this element.
       *output_message = &root;
@@ -2298,8 +2456,8 @@
   } else {
     if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
       const Message& child = reflection->GetMessage(root, field);
-      return FollowPath(child, path_begin, path_end,
-                        output_message, output_field, output_index);
+      return FollowPath(child, path_begin, path_end, output_message,
+                        output_field, output_index);
     } else if (path_begin == path_end) {
       // Path refers to this field.
       *output_message = &root;
@@ -2359,9 +2517,8 @@
   }
 
   virtual void TearDown() {
-    EXPECT_TRUE(spans_.empty())
-        << "Forgot to call HasSpan() for:\n"
-        << spans_.begin()->second->DebugString();
+    EXPECT_TRUE(spans_.empty()) << "Forgot to call HasSpan() for:\n"
+                                << spans_.begin()->second->DebugString();
   }
 
   // -----------------------------------------------------------------
@@ -2372,8 +2529,8 @@
 
   bool HasSpan(char start_marker, char end_marker,
                const Message& descriptor_proto) {
-    return HasSpanWithComment(
-        start_marker, end_marker, descriptor_proto, NULL, -1, NULL, NULL, NULL);
+    return HasSpanWithComment(start_marker, end_marker, descriptor_proto, NULL,
+                              -1, NULL, NULL, NULL);
   }
 
   bool HasSpanWithComment(char start_marker, char end_marker,
@@ -2381,10 +2538,10 @@
                           const char* expected_leading_comments,
                           const char* expected_trailing_comments,
                           const char* expected_leading_detached_comments) {
-    return HasSpanWithComment(
-        start_marker, end_marker, descriptor_proto, NULL, -1,
-        expected_leading_comments, expected_trailing_comments,
-        expected_leading_detached_comments);
+    return HasSpanWithComment(start_marker, end_marker, descriptor_proto, NULL,
+                              -1, expected_leading_comments,
+                              expected_trailing_comments,
+                              expected_leading_detached_comments);
   }
 
   bool HasSpan(char start_marker, char end_marker,
@@ -2395,8 +2552,8 @@
   bool HasSpan(char start_marker, char end_marker,
                const Message& descriptor_proto, const std::string& field_name,
                int index) {
-    return HasSpan(start_marker, end_marker, descriptor_proto,
-                   field_name, index, NULL, NULL, NULL);
+    return HasSpan(start_marker, end_marker, descriptor_proto, field_name,
+                   index, NULL, NULL, NULL);
   }
 
   bool HasSpan(char start_marker, char end_marker,
@@ -2412,15 +2569,15 @@
       return false;
     }
 
-    return HasSpanWithComment(
-        start_marker, end_marker, descriptor_proto, field, index,
-        expected_leading_comments, expected_trailing_comments,
-        expected_leading_detached_comments);
+    return HasSpanWithComment(start_marker, end_marker, descriptor_proto, field,
+                              index, expected_leading_comments,
+                              expected_trailing_comments,
+                              expected_leading_detached_comments);
   }
 
   bool HasSpan(const Message& descriptor_proto) {
-    return HasSpanWithComment(
-        '\0', '\0', descriptor_proto, NULL, -1, NULL, NULL, NULL);
+    return HasSpanWithComment('\0', '\0', descriptor_proto, NULL, -1, NULL,
+                              NULL, NULL);
   }
 
   bool HasSpan(const Message& descriptor_proto, const std::string& field_name) {
@@ -2432,12 +2589,12 @@
     return HasSpan('\0', '\0', descriptor_proto, field_name, index);
   }
 
-  bool HasSpanWithComment(
-      char start_marker, char end_marker, const Message& descriptor_proto,
-      const FieldDescriptor* field, int index,
-      const char* expected_leading_comments,
-      const char* expected_trailing_comments,
-      const char* expected_leading_detached_comments) {
+  bool HasSpanWithComment(char start_marker, char end_marker,
+                          const Message& descriptor_proto,
+                          const FieldDescriptor* field, int index,
+                          const char* expected_leading_comments,
+                          const char* expected_trailing_comments,
+                          const char* expected_leading_detached_comments) {
     std::pair<SpanMap::iterator, SpanMap::iterator> range =
         spans_.equal_range(SpanKey(descriptor_proto, field, index));
 
@@ -2501,9 +2658,9 @@
 
     inline SpanKey() {}
     inline SpanKey(const Message& descriptor_proto_param,
-                   const FieldDescriptor* field_param,
-                   int index_param)
-        : descriptor_proto(&descriptor_proto_param), field(field_param),
+                   const FieldDescriptor* field_param, int index_param)
+        : descriptor_proto(&descriptor_proto_param),
+          field(field_param),
           index(index_param) {}
 
     inline bool operator<(const SpanKey& other) const {
@@ -2551,15 +2708,15 @@
 };
 
 TEST_F(SourceInfoTest, BasicFileDecls) {
-  EXPECT_TRUE(Parse(
-      "$a$syntax = \"proto2\";$i$\n"
-      "$b$package foo.bar;$c$\n"
-      "$d$import \"baz.proto\";$e$\n"
-      "$f$import\"qux.proto\";$h$\n"
-      "$j$import $k$public$l$ \"bar.proto\";$m$\n"
-      "$n$import $o$weak$p$ \"bar.proto\";$q$\n"
-      "\n"
-      "// comment ignored\n"));
+  EXPECT_TRUE(
+      Parse("$a$syntax = \"proto2\";$i$\n"
+            "$b$package foo.bar;$c$\n"
+            "$d$import \"baz.proto\";$e$\n"
+            "$f$import\"qux.proto\";$h$\n"
+            "$j$import $k$public$l$ \"bar.proto\";$m$\n"
+            "$n$import $o$weak$p$ \"bar.proto\";$q$\n"
+            "\n"
+            "// comment ignored\n"));
 
   EXPECT_TRUE(HasSpan('a', 'q', file_));
   EXPECT_TRUE(HasSpan('b', 'c', file_, "package"));
@@ -2573,9 +2730,9 @@
 }
 
 TEST_F(SourceInfoTest, Messages) {
-  EXPECT_TRUE(Parse(
-      "$a$message $b$Foo$c$ {}$d$\n"
-      "$e$message $f$Bar$g$ {}$h$\n"));
+  EXPECT_TRUE(
+      Parse("$a$message $b$Foo$c$ {}$d$\n"
+            "$e$message $f$Bar$g$ {}$h$\n"));
 
   EXPECT_TRUE(HasSpan('a', 'd', file_.message_type(0)));
   EXPECT_TRUE(HasSpan('b', 'c', file_.message_type(0), "name"));
@@ -2587,11 +2744,11 @@
 }
 
 TEST_F(SourceInfoTest, Fields) {
-  EXPECT_TRUE(Parse(
-      "message Foo {\n"
-      "  $a$optional$b$ $c$int32$d$ $e$bar$f$ = $g$1$h$;$i$\n"
-      "  $j$repeated$k$ $l$X.Y$m$ $n$baz$o$ = $p$2$q$;$r$\n"
-      "}\n"));
+  EXPECT_TRUE(
+      Parse("message Foo {\n"
+            "  $a$optional$b$ $c$int32$d$ $e$bar$f$ = $g$1$h$;$i$\n"
+            "  $j$repeated$k$ $l$X.Y$m$ $n$baz$o$ = $p$2$q$;$r$\n"
+            "}\n"));
 
   const FieldDescriptorProto& field1 = file_.message_type(0).field(0);
   const FieldDescriptorProto& field2 = file_.message_type(0).field(1);
@@ -2615,14 +2772,14 @@
 }
 
 TEST_F(SourceInfoTest, Extensions) {
-  EXPECT_TRUE(Parse(
-      "$a$extend $b$Foo$c$ {\n"
-      "  $d$optional$e$ int32 bar = 1;$f$\n"
-      "  $g$repeated$h$ X.Y baz = 2;$i$\n"
-      "}$j$\n"
-      "$k$extend $l$Bar$m$ {\n"
-      "  $n$optional int32 qux = 1;$o$\n"
-      "}$p$\n"));
+  EXPECT_TRUE(
+      Parse("$a$extend $b$Foo$c$ {\n"
+            "  $d$optional$e$ int32 bar = 1;$f$\n"
+            "  $g$repeated$h$ X.Y baz = 2;$i$\n"
+            "}$j$\n"
+            "$k$extend $l$Bar$m$ {\n"
+            "  $n$optional int32 qux = 1;$o$\n"
+            "}$p$\n"));
 
   const FieldDescriptorProto& field1 = file_.extension(0);
   const FieldDescriptorProto& field2 = file_.extension(1);
@@ -2657,16 +2814,16 @@
 }
 
 TEST_F(SourceInfoTest, NestedExtensions) {
-  EXPECT_TRUE(Parse(
-      "message Message {\n"
-      "  $a$extend $b$Foo$c$ {\n"
-      "    $d$optional$e$ int32 bar = 1;$f$\n"
-      "    $g$repeated$h$ X.Y baz = 2;$i$\n"
-      "  }$j$\n"
-      "  $k$extend $l$Bar$m$ {\n"
-      "    $n$optional int32 qux = 1;$o$\n"
-      "  }$p$\n"
-      "}\n"));
+  EXPECT_TRUE(
+      Parse("message Message {\n"
+            "  $a$extend $b$Foo$c$ {\n"
+            "    $d$optional$e$ int32 bar = 1;$f$\n"
+            "    $g$repeated$h$ X.Y baz = 2;$i$\n"
+            "  }$j$\n"
+            "  $k$extend $l$Bar$m$ {\n"
+            "    $n$optional int32 qux = 1;$o$\n"
+            "  }$p$\n"
+            "}\n"));
 
   const FieldDescriptorProto& field1 = file_.message_type(0).extension(0);
   const FieldDescriptorProto& field2 = file_.message_type(0).extension(1);
@@ -2703,11 +2860,11 @@
 }
 
 TEST_F(SourceInfoTest, ExtensionRanges) {
-  EXPECT_TRUE(Parse(
-      "message Message {\n"
-      "  $a$extensions $b$1$c$ to $d$4$e$, $f$6$g$;$h$\n"
-      "  $i$extensions $j$8$k$ to $l$max$m$;$n$\n"
-      "}\n"));
+  EXPECT_TRUE(
+      Parse("message Message {\n"
+            "  $a$extensions $b$1$c$ to $d$4$e$, $f$6$g$;$h$\n"
+            "  $i$extensions $j$8$k$ to $l$max$m$;$n$\n"
+            "}\n"));
 
   const DescriptorProto::ExtensionRange& range1 =
       file_.message_type(0).extension_range(0);
@@ -2765,12 +2922,12 @@
 }
 
 TEST_F(SourceInfoTest, Oneofs) {
-  EXPECT_TRUE(Parse(
-      "message Foo {\n"
-      "  $a$oneof $c$foo$d$ {\n"
-      "    $e$int32$f$ $g$a$h$ = $i$1$j$;$k$\n"
-      "  }$r$\n"
-      "}\n"));
+  EXPECT_TRUE(
+      Parse("message Foo {\n"
+            "  $a$oneof $c$foo$d$ {\n"
+            "    $e$int32$f$ $g$a$h$ = $i$1$j$;$k$\n"
+            "  }$r$\n"
+            "}\n"));
 
   const OneofDescriptorProto& oneof_decl = file_.message_type(0).oneof_decl(0);
   const FieldDescriptorProto& field = file_.message_type(0).field(0);
@@ -2790,13 +2947,13 @@
 }
 
 TEST_F(SourceInfoTest, NestedMessages) {
-  EXPECT_TRUE(Parse(
-      "message Foo {\n"
-      "  $a$message $b$Bar$c$ {\n"
-      "    $d$message $e$Baz$f$ {}$g$\n"
-      "  }$h$\n"
-      "  $i$message $j$Qux$k$ {}$l$\n"
-      "}\n"));
+  EXPECT_TRUE(
+      Parse("message Foo {\n"
+            "  $a$message $b$Bar$c$ {\n"
+            "    $d$message $e$Baz$f$ {}$g$\n"
+            "  }$h$\n"
+            "  $i$message $j$Qux$k$ {}$l$\n"
+            "}\n"));
 
   const DescriptorProto& bar = file_.message_type(0).nested_type(0);
   const DescriptorProto& baz = bar.nested_type(0);
@@ -2816,13 +2973,13 @@
 }
 
 TEST_F(SourceInfoTest, Groups) {
-  EXPECT_TRUE(Parse(
-      "message Foo {\n"
-      "  message Bar {}\n"
-      "  $a$optional$b$ $c$group$d$ $e$Baz$f$ = $g$1$h$ {\n"
-      "    $i$message Qux {}$j$\n"
-      "  }$k$\n"
-      "}\n"));
+  EXPECT_TRUE(
+      Parse("message Foo {\n"
+            "  message Bar {}\n"
+            "  $a$optional$b$ $c$group$d$ $e$Baz$f$ = $g$1$h$ {\n"
+            "    $i$message Qux {}$j$\n"
+            "  }$k$\n"
+            "}\n"));
 
   const DescriptorProto& bar = file_.message_type(0).nested_type(0);
   const DescriptorProto& baz = file_.message_type(0).nested_type(1);
@@ -2850,9 +3007,9 @@
 }
 
 TEST_F(SourceInfoTest, Enums) {
-  EXPECT_TRUE(Parse(
-      "$a$enum $b$Foo$c$ {}$d$\n"
-      "$e$enum $f$Bar$g$ {}$h$\n"));
+  EXPECT_TRUE(
+      Parse("$a$enum $b$Foo$c$ {}$d$\n"
+            "$e$enum $f$Bar$g$ {}$h$\n"));
 
   EXPECT_TRUE(HasSpan('a', 'd', file_.enum_type(0)));
   EXPECT_TRUE(HasSpan('b', 'c', file_.enum_type(0), "name"));
@@ -2864,11 +3021,11 @@
 }
 
 TEST_F(SourceInfoTest, EnumValues) {
-  EXPECT_TRUE(Parse(
-      "enum Foo {\n"
-      "  $a$BAR$b$ = $c$1$d$;$e$\n"
-      "  $f$BAZ$g$ = $h$2$i$;$j$\n"
-      "}"));
+  EXPECT_TRUE(
+      Parse("enum Foo {\n"
+            "  $a$BAR$b$ = $c$1$d$;$e$\n"
+            "  $f$BAZ$g$ = $h$2$i$;$j$\n"
+            "}"));
 
   const EnumValueDescriptorProto& bar = file_.enum_type(0).value(0);
   const EnumValueDescriptorProto& baz = file_.enum_type(0).value(1);
@@ -2887,11 +3044,11 @@
 }
 
 TEST_F(SourceInfoTest, NestedEnums) {
-  EXPECT_TRUE(Parse(
-      "message Foo {\n"
-      "  $a$enum $b$Bar$c$ {}$d$\n"
-      "  $e$enum $f$Baz$g$ {}$h$\n"
-      "}\n"));
+  EXPECT_TRUE(
+      Parse("message Foo {\n"
+            "  $a$enum $b$Bar$c$ {}$d$\n"
+            "  $e$enum $f$Baz$g$ {}$h$\n"
+            "}\n"));
 
   const EnumDescriptorProto& bar = file_.message_type(0).enum_type(0);
   const EnumDescriptorProto& baz = file_.message_type(0).enum_type(1);
@@ -2908,9 +3065,9 @@
 }
 
 TEST_F(SourceInfoTest, Services) {
-  EXPECT_TRUE(Parse(
-      "$a$service $b$Foo$c$ {}$d$\n"
-      "$e$service $f$Bar$g$ {}$h$\n"));
+  EXPECT_TRUE(
+      Parse("$a$service $b$Foo$c$ {}$d$\n"
+            "$e$service $f$Bar$g$ {}$h$\n"));
 
   EXPECT_TRUE(HasSpan('a', 'd', file_.service(0)));
   EXPECT_TRUE(HasSpan('b', 'c', file_.service(0), "name"));
@@ -2922,11 +3079,11 @@
 }
 
 TEST_F(SourceInfoTest, MethodsAndStreams) {
-  EXPECT_TRUE(Parse(
-      "service Foo {\n"
-      "  $a$rpc $b$Bar$c$($d$X$e$) returns($f$Y$g$);$h$"
-      "  $i$rpc $j$Baz$k$($l$Z$m$) returns($n$W$o$);$p$"
-      "}"));
+  EXPECT_TRUE(
+      Parse("service Foo {\n"
+            "  $a$rpc $b$Bar$c$($d$X$e$) returns($f$Y$g$);$h$"
+            "  $i$rpc $j$Baz$k$($l$Z$m$) returns($n$W$o$);$p$"
+            "}"));
 
   const MethodDescriptorProto& bar = file_.service(0).method(0);
   const MethodDescriptorProto& baz = file_.service(0).method(1);
@@ -2949,15 +3106,14 @@
 
 
 TEST_F(SourceInfoTest, Options) {
-  EXPECT_TRUE(Parse(
-      "$a$option $b$foo$c$.$d$($e$bar.baz$f$)$g$ = "
-          "$h$123$i$;$j$\n"
-      "$k$option qux = $l$-123$m$;$n$\n"
-      "$o$option corge = $p$abc$q$;$r$\n"
-      "$s$option grault = $t$'blah'$u$;$v$\n"
-      "$w$option garply = $x${ yadda yadda }$y$;$z$\n"
-      "$0$option waldo = $1$123.0$2$;$3$\n"
-  ));
+  EXPECT_TRUE(
+      Parse("$a$option $b$foo$c$.$d$($e$bar.baz$f$)$g$ = "
+            "$h$123$i$;$j$\n"
+            "$k$option qux = $l$-123$m$;$n$\n"
+            "$o$option corge = $p$abc$q$;$r$\n"
+            "$s$option grault = $t$'blah'$u$;$v$\n"
+            "$w$option garply = $x${ yadda yadda }$y$;$z$\n"
+            "$0$option waldo = $1$123.0$2$;$3$\n"));
 
   const UninterpretedOption& option1 = file_.options().uninterpreted_option(0);
   const UninterpretedOption& option2 = file_.options().uninterpreted_option(1);
@@ -3015,22 +3171,22 @@
 }
 
 TEST_F(SourceInfoTest, ScopedOptions) {
-  EXPECT_TRUE(Parse(
-    "message Foo {\n"
-    "  $a$option mopt = 1;$b$\n"
-    "}\n"
-    "enum Bar {\n"
-    "  $c$option eopt = 1;$d$\n"
-    "}\n"
-    "service Baz {\n"
-    "  $e$option sopt = 1;$f$\n"
-    "  rpc M(X) returns(Y) {\n"
-    "    $g$option mopt = 1;$h$\n"
-    "  }\n"
-    "  rpc MS4($1$stream$2$ X) returns($3$stream$4$ Y) {\n"
-    "    $k$option mopt = 1;$l$\n"
-    "  }\n"
-    "}\n"));
+  EXPECT_TRUE(
+      Parse("message Foo {\n"
+            "  $a$option mopt = 1;$b$\n"
+            "}\n"
+            "enum Bar {\n"
+            "  $c$option eopt = 1;$d$\n"
+            "}\n"
+            "service Baz {\n"
+            "  $e$option sopt = 1;$f$\n"
+            "  rpc M(X) returns(Y) {\n"
+            "    $g$option mopt = 1;$h$\n"
+            "  }\n"
+            "  rpc MS4($1$stream$2$ X) returns($3$stream$4$ Y) {\n"
+            "    $k$option mopt = 1;$l$\n"
+            "  }\n"
+            "}\n"));
 
   EXPECT_TRUE(HasSpan('a', 'b', file_.message_type(0).options()));
   EXPECT_TRUE(HasSpan('c', 'd', file_.enum_type(0).options()));
@@ -3041,87 +3197,89 @@
   EXPECT_TRUE(HasSpan(file_));
   EXPECT_TRUE(HasSpan(file_.message_type(0)));
   EXPECT_TRUE(HasSpan(file_.message_type(0), "name"));
-  EXPECT_TRUE(HasSpan(file_.message_type(0).options()
-                      .uninterpreted_option(0)));
-  EXPECT_TRUE(HasSpan(file_.message_type(0).options()
-                      .uninterpreted_option(0), "name"));
-  EXPECT_TRUE(HasSpan(file_.message_type(0).options()
-                      .uninterpreted_option(0).name(0)));
-  EXPECT_TRUE(HasSpan(file_.message_type(0).options()
-                      .uninterpreted_option(0).name(0), "name_part"));
-  EXPECT_TRUE(HasSpan(file_.message_type(0).options()
-                      .uninterpreted_option(0), "positive_int_value"));
+  EXPECT_TRUE(HasSpan(file_.message_type(0).options().uninterpreted_option(0)));
+  EXPECT_TRUE(
+      HasSpan(file_.message_type(0).options().uninterpreted_option(0), "name"));
+  EXPECT_TRUE(
+      HasSpan(file_.message_type(0).options().uninterpreted_option(0).name(0)));
+  EXPECT_TRUE(
+      HasSpan(file_.message_type(0).options().uninterpreted_option(0).name(0),
+              "name_part"));
+  EXPECT_TRUE(HasSpan(file_.message_type(0).options().uninterpreted_option(0),
+                      "positive_int_value"));
   EXPECT_TRUE(HasSpan(file_.enum_type(0)));
   EXPECT_TRUE(HasSpan(file_.enum_type(0), "name"));
-  EXPECT_TRUE(HasSpan(file_.enum_type(0).options()
-                      .uninterpreted_option(0)));
-  EXPECT_TRUE(HasSpan(file_.enum_type(0).options()
-                      .uninterpreted_option(0), "name"));
-  EXPECT_TRUE(HasSpan(file_.enum_type(0).options()
-                      .uninterpreted_option(0).name(0)));
-  EXPECT_TRUE(HasSpan(file_.enum_type(0).options()
-                      .uninterpreted_option(0).name(0), "name_part"));
-  EXPECT_TRUE(HasSpan(file_.enum_type(0).options()
-                      .uninterpreted_option(0), "positive_int_value"));
+  EXPECT_TRUE(HasSpan(file_.enum_type(0).options().uninterpreted_option(0)));
+  EXPECT_TRUE(
+      HasSpan(file_.enum_type(0).options().uninterpreted_option(0), "name"));
+  EXPECT_TRUE(
+      HasSpan(file_.enum_type(0).options().uninterpreted_option(0).name(0)));
+  EXPECT_TRUE(
+      HasSpan(file_.enum_type(0).options().uninterpreted_option(0).name(0),
+              "name_part"));
+  EXPECT_TRUE(HasSpan(file_.enum_type(0).options().uninterpreted_option(0),
+                      "positive_int_value"));
   EXPECT_TRUE(HasSpan(file_.service(0)));
   EXPECT_TRUE(HasSpan(file_.service(0), "name"));
   EXPECT_TRUE(HasSpan(file_.service(0).method(0)));
-  EXPECT_TRUE(HasSpan(file_.service(0).options()
-                      .uninterpreted_option(0)));
-  EXPECT_TRUE(HasSpan(file_.service(0).options()
-                      .uninterpreted_option(0), "name"));
-  EXPECT_TRUE(HasSpan(file_.service(0).options()
-                      .uninterpreted_option(0).name(0)));
-  EXPECT_TRUE(HasSpan(file_.service(0).options()
-                      .uninterpreted_option(0).name(0), "name_part"));
-  EXPECT_TRUE(HasSpan(file_.service(0).options()
-                      .uninterpreted_option(0), "positive_int_value"));
+  EXPECT_TRUE(HasSpan(file_.service(0).options().uninterpreted_option(0)));
+  EXPECT_TRUE(
+      HasSpan(file_.service(0).options().uninterpreted_option(0), "name"));
+  EXPECT_TRUE(
+      HasSpan(file_.service(0).options().uninterpreted_option(0).name(0)));
+  EXPECT_TRUE(HasSpan(
+      file_.service(0).options().uninterpreted_option(0).name(0), "name_part"));
+  EXPECT_TRUE(HasSpan(file_.service(0).options().uninterpreted_option(0),
+                      "positive_int_value"));
   EXPECT_TRUE(HasSpan(file_.service(0).method(0), "name"));
   EXPECT_TRUE(HasSpan(file_.service(0).method(0), "input_type"));
   EXPECT_TRUE(HasSpan(file_.service(0).method(0), "output_type"));
-  EXPECT_TRUE(HasSpan(file_.service(0).method(0).options()
-                      .uninterpreted_option(0)));
-  EXPECT_TRUE(HasSpan(file_.service(0).method(0).options()
-                      .uninterpreted_option(0), "name"));
-  EXPECT_TRUE(HasSpan(file_.service(0).method(0).options()
-                      .uninterpreted_option(0).name(0)));
-  EXPECT_TRUE(HasSpan(file_.service(0).method(0).options()
-                      .uninterpreted_option(0).name(0), "name_part"));
-  EXPECT_TRUE(HasSpan(file_.service(0).method(0).options()
-                      .uninterpreted_option(0), "positive_int_value"));
+  EXPECT_TRUE(
+      HasSpan(file_.service(0).method(0).options().uninterpreted_option(0)));
+  EXPECT_TRUE(HasSpan(
+      file_.service(0).method(0).options().uninterpreted_option(0), "name"));
+  EXPECT_TRUE(HasSpan(
+      file_.service(0).method(0).options().uninterpreted_option(0).name(0)));
+  EXPECT_TRUE(HasSpan(
+      file_.service(0).method(0).options().uninterpreted_option(0).name(0),
+      "name_part"));
+  EXPECT_TRUE(
+      HasSpan(file_.service(0).method(0).options().uninterpreted_option(0),
+              "positive_int_value"));
 
   EXPECT_TRUE(HasSpan('k', 'l', file_.service(0).method(1).options()));
   EXPECT_TRUE(HasSpan(file_.service(0).method(1)));
   EXPECT_TRUE(HasSpan(file_.service(0).method(1), "name"));
   EXPECT_TRUE(HasSpan(file_.service(0).method(1), "input_type"));
   EXPECT_TRUE(HasSpan(file_.service(0).method(1), "output_type"));
-  EXPECT_TRUE(HasSpan(file_.service(0).method(1).options()
-                      .uninterpreted_option(0)));
-  EXPECT_TRUE(HasSpan(file_.service(0).method(1).options()
-                      .uninterpreted_option(0), "name"));
-  EXPECT_TRUE(HasSpan(file_.service(0).method(1).options()
-                      .uninterpreted_option(0).name(0)));
-  EXPECT_TRUE(HasSpan(file_.service(0).method(1).options()
-                      .uninterpreted_option(0).name(0), "name_part"));
-  EXPECT_TRUE(HasSpan(file_.service(0).method(1).options()
-                      .uninterpreted_option(0), "positive_int_value"));
-  EXPECT_TRUE(HasSpan('1', '2', file_.service(0).method(1),
-                      "client_streaming"));
-  EXPECT_TRUE(HasSpan('3', '4', file_.service(0).method(1),
-                      "server_streaming"));
+  EXPECT_TRUE(
+      HasSpan(file_.service(0).method(1).options().uninterpreted_option(0)));
+  EXPECT_TRUE(HasSpan(
+      file_.service(0).method(1).options().uninterpreted_option(0), "name"));
+  EXPECT_TRUE(HasSpan(
+      file_.service(0).method(1).options().uninterpreted_option(0).name(0)));
+  EXPECT_TRUE(HasSpan(
+      file_.service(0).method(1).options().uninterpreted_option(0).name(0),
+      "name_part"));
+  EXPECT_TRUE(
+      HasSpan(file_.service(0).method(1).options().uninterpreted_option(0),
+              "positive_int_value"));
+  EXPECT_TRUE(
+      HasSpan('1', '2', file_.service(0).method(1), "client_streaming"));
+  EXPECT_TRUE(
+      HasSpan('3', '4', file_.service(0).method(1), "server_streaming"));
 }
 
 TEST_F(SourceInfoTest, FieldOptions) {
   // The actual "name = value" pairs are parsed by the same code as for
   // top-level options so we won't re-test that -- just make sure that the
   // syntax used for field options is understood.
-  EXPECT_TRUE(Parse(
-      "message Foo {"
-      "  optional int32 bar = 1 "
-          "$a$[default=$b$123$c$,$d$opt1=123$e$,"
-          "$f$opt2='hi'$g$]$h$;"
-      "}\n"
-  ));
+  EXPECT_TRUE(
+      Parse("message Foo {"
+            "  optional int32 bar = 1 "
+            "$a$[default=$b$123$c$,$d$opt1=123$e$,"
+            "$f$opt2='hi'$g$]$h$;"
+            "}\n"));
 
   const FieldDescriptorProto& field = file_.message_type(0).field(0);
   const UninterpretedOption& option1 = field.options().uninterpreted_option(0);
@@ -3155,11 +3313,10 @@
   // The actual "name = value" pairs are parsed by the same code as for
   // top-level options so we won't re-test that -- just make sure that the
   // syntax used for enum options is understood.
-  EXPECT_TRUE(Parse(
-      "enum Foo {"
-      "  BAR = 1 $a$[$b$opt1=123$c$,$d$opt2='hi'$e$]$f$;"
-      "}\n"
-  ));
+  EXPECT_TRUE(
+      Parse("enum Foo {"
+            "  BAR = 1 $a$[$b$opt1=123$c$,$d$opt2='hi'$e$]$f$;"
+            "}\n"));
 
   const EnumValueDescriptorProto& value = file_.enum_type(0).value(0);
   const UninterpretedOption& option1 = value.options().uninterpreted_option(0);
@@ -3187,33 +3344,28 @@
 }
 
 TEST_F(SourceInfoTest, DocComments) {
-  EXPECT_TRUE(Parse(
-      "// Foo leading\n"
-      "// line 2\n"
-      "$a$message Foo {\n"
-      "  // Foo trailing\n"
-      "  // line 2\n"
-      "\n"
-      "  // detached\n"
-      "\n"
-      "  // bar leading\n"
-      "  $b$optional int32 bar = 1;$c$\n"
-      "  // bar trailing\n"
-      "}$d$\n"
-      "// ignored\n"
-  ));
+  EXPECT_TRUE(
+      Parse("// Foo leading\n"
+            "// line 2\n"
+            "$a$message Foo {\n"
+            "  // Foo trailing\n"
+            "  // line 2\n"
+            "\n"
+            "  // detached\n"
+            "\n"
+            "  // bar leading\n"
+            "  $b$optional int32 bar = 1;$c$\n"
+            "  // bar trailing\n"
+            "}$d$\n"
+            "// ignored\n"));
 
   const DescriptorProto& foo = file_.message_type(0);
   const FieldDescriptorProto& bar = foo.field(0);
 
-  EXPECT_TRUE(HasSpanWithComment('a', 'd', foo,
-      " Foo leading\n line 2\n",
-      " Foo trailing\n line 2\n",
-      NULL));
-  EXPECT_TRUE(HasSpanWithComment('b', 'c', bar,
-      " bar leading\n",
-      " bar trailing\n",
-      " detached\n"));
+  EXPECT_TRUE(HasSpanWithComment('a', 'd', foo, " Foo leading\n line 2\n",
+                                 " Foo trailing\n line 2\n", NULL));
+  EXPECT_TRUE(HasSpanWithComment('b', 'c', bar, " bar leading\n",
+                                 " bar trailing\n", " detached\n"));
 
   // Ignore these.
   EXPECT_TRUE(HasSpan(file_));
@@ -3225,45 +3377,40 @@
 }
 
 TEST_F(SourceInfoTest, DocComments2) {
-  EXPECT_TRUE(Parse(
-      "// detached before message.\n"
-      "\n"
-      "// Foo leading\n"
-      "// line 2\n"
-      "$a$message Foo {\n"
-      "  /* Foo trailing\n"
-      "   * line 2 */\n"
-      "  // detached\n"
-      "  /* bar leading\n"
-      "   */"
-      "  $b$optional int32 bar = 1;$c$  // bar trailing\n"
-      "  // ignored detached\n"
-      "}$d$\n"
-      "// ignored\n"
-      "\n"
-      "// detached before option\n"
-      "\n"
-      "// option leading\n"
-      "$e$option baz = 123;$f$\n"
-      "// option trailing\n"
-  ));
+  EXPECT_TRUE(
+      Parse("// detached before message.\n"
+            "\n"
+            "// Foo leading\n"
+            "// line 2\n"
+            "$a$message Foo {\n"
+            "  /* Foo trailing\n"
+            "   * line 2 */\n"
+            "  // detached\n"
+            "  /* bar leading\n"
+            "   */"
+            "  $b$optional int32 bar = 1;$c$  // bar trailing\n"
+            "  // ignored detached\n"
+            "}$d$\n"
+            "// ignored\n"
+            "\n"
+            "// detached before option\n"
+            "\n"
+            "// option leading\n"
+            "$e$option baz = 123;$f$\n"
+            "// option trailing\n"));
 
   const DescriptorProto& foo = file_.message_type(0);
   const FieldDescriptorProto& bar = foo.field(0);
   const UninterpretedOption& baz = file_.options().uninterpreted_option(0);
 
-  EXPECT_TRUE(HasSpanWithComment('a', 'd', foo,
-      " Foo leading\n line 2\n",
-      " Foo trailing\n line 2 ",
-      " detached before message.\n"));
-  EXPECT_TRUE(HasSpanWithComment('b', 'c', bar,
-      " bar leading\n",
-      " bar trailing\n",
-      " detached\n"));
-  EXPECT_TRUE(HasSpanWithComment('e', 'f', baz,
-      " option leading\n",
-      " option trailing\n",
-      " detached before option\n"));
+  EXPECT_TRUE(HasSpanWithComment('a', 'd', foo, " Foo leading\n line 2\n",
+                                 " Foo trailing\n line 2 ",
+                                 " detached before message.\n"));
+  EXPECT_TRUE(HasSpanWithComment('b', 'c', bar, " bar leading\n",
+                                 " bar trailing\n", " detached\n"));
+  EXPECT_TRUE(HasSpanWithComment('e', 'f', baz, " option leading\n",
+                                 " option trailing\n",
+                                 " detached before option\n"));
 
   // Ignore these.
   EXPECT_TRUE(HasSpan(file_));
@@ -3280,22 +3427,19 @@
 }
 
 TEST_F(SourceInfoTest, DocComments3) {
-  EXPECT_TRUE(Parse(
-      "$a$message Foo {\n"
-      "  // bar leading\n"
-      "  $b$optional int32 bar = 1 [(baz.qux) = {}];$c$\n"
-      "  // bar trailing\n"
-      "}$d$\n"
-      "// ignored\n"
-  ));
+  EXPECT_TRUE(
+      Parse("$a$message Foo {\n"
+            "  // bar leading\n"
+            "  $b$optional int32 bar = 1 [(baz.qux) = {}];$c$\n"
+            "  // bar trailing\n"
+            "}$d$\n"
+            "// ignored\n"));
 
   const DescriptorProto& foo = file_.message_type(0);
   const FieldDescriptorProto& bar = foo.field(0);
 
-  EXPECT_TRUE(HasSpanWithComment('b', 'c', bar,
-      " bar leading\n",
-      " bar trailing\n",
-      NULL));
+  EXPECT_TRUE(HasSpanWithComment('b', 'c', bar, " bar leading\n",
+                                 " bar trailing\n", NULL));
 
   // Ignore these.
   EXPECT_TRUE(HasSpan(file_));
@@ -3309,88 +3453,82 @@
   EXPECT_TRUE(HasSpan(bar.options().uninterpreted_option(0)));
   EXPECT_TRUE(HasSpan(bar.options().uninterpreted_option(0), "name"));
   EXPECT_TRUE(HasSpan(bar.options().uninterpreted_option(0).name(0)));
-  EXPECT_TRUE(HasSpan(
-      bar.options().uninterpreted_option(0).name(0), "name_part"));
-  EXPECT_TRUE(HasSpan(
-      bar.options().uninterpreted_option(0), "aggregate_value"));
+  EXPECT_TRUE(
+      HasSpan(bar.options().uninterpreted_option(0).name(0), "name_part"));
+  EXPECT_TRUE(
+      HasSpan(bar.options().uninterpreted_option(0), "aggregate_value"));
 }
 
 TEST_F(SourceInfoTest, DocCommentsTopLevel) {
-  EXPECT_TRUE(Parse(
-      "// detached before syntax paragraph 1\n"
-      "\n"
-      "// detached before syntax paragraph 2\n"
-      "\n"
-      "// syntax leading\n"
-      "$a$syntax = \"proto2\";$b$\n"
-      "// syntax trailing\n"
-      "\n"
-      "// syntax-package detached comments\n"
-      "\n"
-      ";\n"
-      "\n"
-      "// detached after empty before package\n"
-      "\n"
-      "// package leading\n"
-      "$c$package foo;$d$\n"
-      "// package trailing\n"
-      "\n"
-      "// ignored detach\n"
-      "\n"));
+  EXPECT_TRUE(
+      Parse("// detached before syntax paragraph 1\n"
+            "\n"
+            "// detached before syntax paragraph 2\n"
+            "\n"
+            "// syntax leading\n"
+            "$a$syntax = \"proto2\";$b$\n"
+            "// syntax trailing\n"
+            "\n"
+            "// syntax-package detached comments\n"
+            "\n"
+            ";\n"
+            "\n"
+            "// detached after empty before package\n"
+            "\n"
+            "// package leading\n"
+            "$c$package foo;$d$\n"
+            "// package trailing\n"
+            "\n"
+            "// ignored detach\n"
+            "\n"));
 
-  EXPECT_TRUE(HasSpan('a', 'b', file_, "syntax", -1,
-      " syntax leading\n",
-      " syntax trailing\n",
-      " detached before syntax paragraph 1\n"
-      "\n"
-      " detached before syntax paragraph 2\n"));
-  EXPECT_TRUE(HasSpan('c', 'd', file_, "package", -1,
-      " package leading\n",
-      " package trailing\n",
-      " syntax-package detached comments\n"
-      "\n"
-      " detached after empty before package\n"));
+  EXPECT_TRUE(HasSpan('a', 'b', file_, "syntax", -1, " syntax leading\n",
+                      " syntax trailing\n",
+                      " detached before syntax paragraph 1\n"
+                      "\n"
+                      " detached before syntax paragraph 2\n"));
+  EXPECT_TRUE(HasSpan('c', 'd', file_, "package", -1, " package leading\n",
+                      " package trailing\n",
+                      " syntax-package detached comments\n"
+                      "\n"
+                      " detached after empty before package\n"));
 
   // ignore these.
   EXPECT_TRUE(HasSpan(file_));
 }
 
 TEST_F(SourceInfoTest, DocCommentsOneof) {
-  EXPECT_TRUE(Parse(
-      "// Foo leading\n"
-      "$a$message Foo {\n"
-      "  /* Foo trailing\n"
-      "   */\n"
-      "  // detached before oneof\n"
-      "  /* bar leading\n"
-      "   * line 2 */\n"
-      "  $b$oneof bar {\n"
-      "  /* bar trailing\n"
-      "   * line 2 */\n"
-      "  // detached before bar_int\n"
-      "  /* bar_int leading\n"
-      "   */\n"
-      "  $c$int32 bar_int = 1;$d$  // bar_int trailing\n"
-      "  // detach comment ignored\n"
-      "  }$e$\n"
-      "}$f$\n"));
+  EXPECT_TRUE(
+      Parse("// Foo leading\n"
+            "$a$message Foo {\n"
+            "  /* Foo trailing\n"
+            "   */\n"
+            "  // detached before oneof\n"
+            "  /* bar leading\n"
+            "   * line 2 */\n"
+            "  $b$oneof bar {\n"
+            "  /* bar trailing\n"
+            "   * line 2 */\n"
+            "  // detached before bar_int\n"
+            "  /* bar_int leading\n"
+            "   */\n"
+            "  $c$int32 bar_int = 1;$d$  // bar_int trailing\n"
+            "  // detach comment ignored\n"
+            "  }$e$\n"
+            "}$f$\n"));
 
   const DescriptorProto& foo = file_.message_type(0);
   const OneofDescriptorProto& bar = foo.oneof_decl(0);
   const FieldDescriptorProto& bar_int = foo.field(0);
 
-  EXPECT_TRUE(HasSpanWithComment('a', 'f', foo,
-      " Foo leading\n",
-      " Foo trailing\n",
-      NULL));
-  EXPECT_TRUE(HasSpanWithComment('b', 'e', bar,
-      " bar leading\n line 2 ",
-      " bar trailing\n line 2 ",
-      " detached before oneof\n"));
-  EXPECT_TRUE(HasSpanWithComment('c', 'd', bar_int,
-      " bar_int leading\n",
-      " bar_int trailing\n",
-      " detached before bar_int\n"));
+  EXPECT_TRUE(HasSpanWithComment('a', 'f', foo, " Foo leading\n",
+                                 " Foo trailing\n", NULL));
+  EXPECT_TRUE(HasSpanWithComment('b', 'e', bar, " bar leading\n line 2 ",
+                                 " bar trailing\n line 2 ",
+                                 " detached before oneof\n"));
+  EXPECT_TRUE(HasSpanWithComment('c', 'd', bar_int, " bar_int leading\n",
+                                 " bar_int trailing\n",
+                                 " detached before bar_int\n"));
 
   // Ignore these.
   EXPECT_TRUE(HasSpan(file_));
diff --git a/src/google/protobuf/compiler/plugin.cc b/src/google/protobuf/compiler/plugin.cc
index 3504875..ac383f8 100644
--- a/src/google/protobuf/compiler/plugin.cc
+++ b/src/google/protobuf/compiler/plugin.cc
@@ -45,9 +45,9 @@
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/compiler/plugin.pb.h>
 #include <google/protobuf/compiler/code_generator.h>
+#include <google/protobuf/io/io_win32.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/descriptor.h>
-#include <google/protobuf/stubs/io_win32.h>
 
 
 namespace google {
@@ -57,14 +57,13 @@
 #if defined(_WIN32)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
-using google::protobuf::internal::win32::setmode;
+using google::protobuf::io::win32::setmode;
 #endif
 
 class GeneratorResponseContext : public GeneratorContext {
  public:
   GeneratorResponseContext(
-      const Version& compiler_version,
-      CodeGeneratorResponse* response,
+      const Version& compiler_version, CodeGeneratorResponse* response,
       const std::vector<const FileDescriptor*>& parsed_files)
       : compiler_version_(compiler_version),
         response_(response),
@@ -117,24 +116,26 @@
   for (int i = 0; i < request.file_to_generate_size(); i++) {
     parsed_files.push_back(pool.FindFileByName(request.file_to_generate(i)));
     if (parsed_files.back() == NULL) {
-      *error_msg = "protoc asked plugin to generate a file but "
-                   "did not provide a descriptor for the file: " +
-                   request.file_to_generate(i);
+      *error_msg =
+          "protoc asked plugin to generate a file but "
+          "did not provide a descriptor for the file: " +
+          request.file_to_generate(i);
       return false;
     }
   }
 
-  GeneratorResponseContext context(
-      request.compiler_version(), response, parsed_files);
+  GeneratorResponseContext context(request.compiler_version(), response,
+                                   parsed_files);
 
 
   std::string error;
-  bool succeeded = generator.GenerateAll(
-      parsed_files, request.parameter(), &context, &error);
+  bool succeeded = generator.GenerateAll(parsed_files, request.parameter(),
+                                         &context, &error);
 
   if (!succeeded && error.empty()) {
-    error = "Code generator returned false but provided no error "
-            "description.";
+    error =
+        "Code generator returned false but provided no error "
+        "description.";
   }
   if (!error.empty()) {
     response->set_error(error);
diff --git a/src/google/protobuf/compiler/plugin.h b/src/google/protobuf/compiler/plugin.h
index 0eed2df..69c5d3f 100644
--- a/src/google/protobuf/compiler/plugin.h
+++ b/src/google/protobuf/compiler/plugin.h
@@ -70,7 +70,7 @@
 namespace protobuf {
 namespace compiler {
 
-class CodeGenerator;    // code_generator.h
+class CodeGenerator;  // code_generator.h
 class CodeGeneratorRequest;
 class CodeGeneratorResponse;
 
diff --git a/src/google/protobuf/compiler/plugin.pb.cc b/src/google/protobuf/compiler/plugin.pb.cc
index 4759473..16ea252 100644
--- a/src/google/protobuf/compiler/plugin.pb.cc
+++ b/src/google/protobuf/compiler/plugin.pb.cc
@@ -98,13 +98,6 @@
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsCodeGeneratorResponse_google_2fprotobuf_2fcompiler_2fplugin_2eproto}, {
       &scc_info_CodeGeneratorResponse_File_google_2fprotobuf_2fcompiler_2fplugin_2eproto.base,}};
 
-void InitDefaults_google_2fprotobuf_2fcompiler_2fplugin_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Version_google_2fprotobuf_2fcompiler_2fplugin_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_CodeGeneratorRequest_google_2fprotobuf_2fcompiler_2fplugin_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_CodeGeneratorResponse_File_google_2fprotobuf_2fcompiler_2fplugin_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_CodeGeneratorResponse_google_2fprotobuf_2fcompiler_2fplugin_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2fcompiler_2fplugin_2eproto[4];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fcompiler_2fplugin_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fcompiler_2fplugin_2eproto = nullptr;
@@ -196,8 +189,7 @@
   "rotobuf/protoc-gen-go/plugin;plugin_go"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2fcompiler_2fplugin_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2fcompiler_2fplugin_2eproto,
   "google/protobuf/compiler/plugin.proto", &assign_descriptors_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto, 638,
 };
 
@@ -206,6 +198,10 @@
   {
     ::AddDescriptors_google_2fprotobuf_2fdescriptor_2eproto,
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Version_google_2fprotobuf_2fcompiler_2fplugin_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_CodeGeneratorRequest_google_2fprotobuf_2fcompiler_2fplugin_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_CodeGeneratorResponse_File_google_2fprotobuf_2fcompiler_2fplugin_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_CodeGeneratorResponse_google_2fprotobuf_2fcompiler_2fplugin_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2fcompiler_2fplugin_2eproto, deps, 1);
 }
 
@@ -220,17 +216,18 @@
 }
 class Version::HasBitSetters {
  public:
-  static void set_has_major(Version* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  using HasBits = decltype(std::declval<Version>()._has_bits_);
+  static void set_has_major(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
-  static void set_has_minor(Version* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_minor(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
-  static void set_has_patch(Version* msg) {
-    msg->_has_bits_[0] |= 0x00000008u;
+  static void set_has_patch(HasBits* has_bits) {
+    (*has_bits)[0] |= 8u;
   }
-  static void set_has_suffix(Version* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  static void set_has_suffix(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
 };
 
@@ -309,52 +306,63 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Version::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional int32 major = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_major(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_major(&has_bits);
+        major_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional int32 minor = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_minor(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_minor(&has_bits);
+        minor_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional int32 patch = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 24) goto handle_unusual;
-        set_patch(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_patch(&has_bits);
+        patch_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional string suffix = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_suffix(), ptr, ctx, "google.protobuf.compiler.Version.suffix");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Version::MergePartialFromCodedStream(
@@ -370,7 +378,7 @@
       // optional int32 major = 1;
       case 1: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (8 & 0xFF)) {
-          HasBitSetters::set_has_major(this);
+          HasBitSetters::set_has_major(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &major_)));
@@ -383,7 +391,7 @@
       // optional int32 minor = 2;
       case 2: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) {
-          HasBitSetters::set_has_minor(this);
+          HasBitSetters::set_has_minor(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &minor_)));
@@ -396,7 +404,7 @@
       // optional int32 patch = 3;
       case 3: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (24 & 0xFF)) {
-          HasBitSetters::set_has_patch(this);
+          HasBitSetters::set_has_patch(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &patch_)));
@@ -659,12 +667,13 @@
 }
 class CodeGeneratorRequest::HasBitSetters {
  public:
-  static void set_has_parameter(CodeGeneratorRequest* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<CodeGeneratorRequest>()._has_bits_);
+  static void set_has_parameter(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
   static const PROTOBUF_NAMESPACE_ID::compiler::Version& compiler_version(const CodeGeneratorRequest* msg);
-  static void set_has_compiler_version(CodeGeneratorRequest* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_compiler_version(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -756,58 +765,70 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* CodeGeneratorRequest::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated string file_to_generate = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(add_file_to_generate(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorRequest.file_to_generate");
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 10 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 10) break;
+          ptr += 1;
+        }
         break;
       }
       // optional string parameter = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_parameter(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorRequest.parameter");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.compiler.Version compiler_version = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_compiler_version(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.FileDescriptorProto proto_file = 15;
       case 15: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 122) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_proto_file(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 122 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 122) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool CodeGeneratorRequest::MergePartialFromCodedStream(
@@ -1130,14 +1151,15 @@
 }
 class CodeGeneratorResponse_File::HasBitSetters {
  public:
-  static void set_has_name(CodeGeneratorResponse_File* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<CodeGeneratorResponse_File>()._has_bits_);
+  static void set_has_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_insertion_point(CodeGeneratorResponse_File* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_insertion_point(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
-  static void set_has_content(CodeGeneratorResponse_File* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_content(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
 };
 
@@ -1224,45 +1246,53 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* CodeGeneratorResponse_File::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_name(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorResponse.File.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string insertion_point = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_insertion_point(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorResponse.File.insertion_point");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string content = 15;
       case 15: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 122) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_content(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorResponse.File.content");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool CodeGeneratorResponse_File::MergePartialFromCodedStream(
@@ -1560,8 +1590,9 @@
 }
 class CodeGeneratorResponse::HasBitSetters {
  public:
-  static void set_has_error(CodeGeneratorResponse* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<CodeGeneratorResponse>()._has_bits_);
+  static void set_has_error(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
 };
 
@@ -1629,41 +1660,51 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* CodeGeneratorResponse::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string error = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_error(), ptr, ctx, "google.protobuf.compiler.CodeGeneratorResponse.error");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15;
       case 15: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 122) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_file(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 122 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 122) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool CodeGeneratorResponse::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/compiler/python/python_generator.cc b/src/google/protobuf/compiler/python/python_generator.cc
index f652ef6..cf5b7f6 100644
--- a/src/google/protobuf/compiler/python/python_generator.cc
+++ b/src/google/protobuf/compiler/python/python_generator.cc
@@ -114,7 +114,7 @@
     "class",   "continue", "def",      "del",    "elif",  "else",   "except",
     "finally", "for",      "from",     "global", "if",    "import", "in",
     "is",      "lambda",   "nonlocal", "not",    "or",    "pass",   "raise",
-    "return",  "try",      "while",    "with",   "yield",
+    "return",  "try",      "while",    "with",   "yield", "print",
 };
 const char* const* kKeywordsEnd =
     kKeywords + (sizeof(kKeywords) / sizeof(kKeywords[0]));
@@ -129,6 +129,17 @@
   return false;
 }
 
+inline bool IsPythonKeyword(const string& name) {
+  return (std::find(kKeywords, kKeywordsEnd, name) != kKeywordsEnd);
+}
+
+std::string ResolveKeyword(const std::string& name) {
+  if (IsPythonKeyword(name)) {
+    return "globals()['" + name + "']";
+  }
+  return name;
+}
+
 // Returns the name of all containing types for descriptor,
 // in order from outermost to innermost, followed by descriptor's
 // own name.  Each name is separated by |separator|.
@@ -136,9 +147,17 @@
 std::string NamePrefixedWithNestedTypes(const DescriptorT& descriptor,
                                         const std::string& separator) {
   std::string name = descriptor.name();
-  for (const Descriptor* current = descriptor.containing_type();
-       current != NULL; current = current->containing_type()) {
-    name = current->name() + separator + name;
+  const Descriptor* parent = descriptor.containing_type();
+  if (parent != nullptr) {
+    std::string prefix = NamePrefixedWithNestedTypes(*parent, separator);
+    if (separator == "." && IsPythonKeyword(name)) {
+      return "getattr(" + prefix + ", '" + name + "')";
+    } else {
+      return prefix + separator + name;
+    }
+  }
+  if (separator == ".") {
+    name = ResolveKeyword(name);
   }
   return name;
 }
@@ -149,30 +168,27 @@
 // in proto2/public/reflection.py.
 const char kDescriptorKey[] = "DESCRIPTOR";
 
-
 // Does the file have top-level enums?
-inline bool HasTopLevelEnums(const FileDescriptor *file) {
+inline bool HasTopLevelEnums(const FileDescriptor* file) {
   return file->enum_type_count() > 0;
 }
 
-
 // Should we generate generic services for this file?
-inline bool HasGenericServices(const FileDescriptor *file) {
-  return file->service_count() > 0 &&
-         file->options().py_generic_services();
+inline bool HasGenericServices(const FileDescriptor* file) {
+  return file->service_count() > 0 && file->options().py_generic_services();
 }
 
-
 // Prints the common boilerplate needed at the top of every .py
 // file output by this generator.
-void PrintTopBoilerplate(
-    io::Printer* printer, const FileDescriptor* file, bool descriptor_proto) {
+void PrintTopBoilerplate(io::Printer* printer, const FileDescriptor* file,
+                         bool descriptor_proto) {
   // TODO(robinson): Allow parameterization of Python version?
   printer->Print(
       "# -*- coding: utf-8 -*-\n"
       "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
       "# source: $filename$\n"
-      "\nimport sys\n_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))"  //##PY25
+      "\nimport sys\n_b=sys.version_info[0]<3 and (lambda x:x) or (lambda "
+      "x:x.encode('latin1'))"  //##PY25
       "\n",
       "filename", file->name());
   if (HasTopLevelEnums(file)) {
@@ -197,7 +213,6 @@
   printer->Print("\n\n");
 }
 
-
 // Returns a Python literal giving the default value for a field.
 // If the field specifies no explicit default value, we'll return
 // the default default value for the field type (zero for numbers,
@@ -259,12 +274,14 @@
     case FieldDescriptor::CPPTYPE_ENUM:
       return StrCat(field.default_value_enum()->number());
     case FieldDescriptor::CPPTYPE_STRING:
-//##!PY25      return "b\"" + CEscape(field.default_value_string()) +
-//##!PY25             (field.type() != FieldDescriptor::TYPE_STRING ? "\"" :
-//##!PY25               "\".decode('utf-8')");
+      //##!PY25      return "b\"" + CEscape(field.default_value_string())
+      //+
+      //##!PY25             (field.type() != FieldDescriptor::TYPE_STRING ? "\""
+      //:
+      //##!PY25               "\".decode('utf-8')");
       return "_b(\"" + CEscape(field.default_value_string()) +  //##PY25
              (field.type() != FieldDescriptor::TYPE_STRING ? "\")" :  //##PY25
-               "\").decode('utf-8')");  //##PY25
+                  "\").decode('utf-8')");                             //##PY25
     case FieldDescriptor::CPPTYPE_MESSAGE:
       return "None";
   }
@@ -290,12 +307,9 @@
 
 }  // namespace
 
+Generator::Generator() : file_(NULL) {}
 
-Generator::Generator() : file_(NULL) {
-}
-
-Generator::~Generator() {
-}
+Generator::~Generator() {}
 
 bool Generator::Generate(const FileDescriptor* file,
                          const std::string& parameter,
@@ -349,8 +363,7 @@
     PrintServices();
   }
 
-  printer.Print(
-    "# @@protoc_insertion_point(module_scope)\n");
+  printer.Print("# @@protoc_insertion_point(module_scope)\n");
 
   return !printer.failed();
 }
@@ -363,9 +376,7 @@
 void StripThirdPartyPy(std::string* module_name) {
   const std::string third_party_py_prefix = "google3.third_party.py.";
   int len = third_party_py_prefix.length();
-  if (module_name->compare(0, len,
-                          third_party_py_prefix, 0,
-                          len) == 0) {
+  if (module_name->compare(0, len, third_party_py_prefix, 0, len) == 0) {
     *module_name = module_name->erase(0, len);
   }
 }
@@ -474,11 +485,11 @@
   for (int i = 0; i < file_->enum_type_count(); ++i) {
     const EnumDescriptor& enum_descriptor = *file_->enum_type(i);
     PrintEnum(enum_descriptor);
-    printer_->Print("$name$ = "
-                    "enum_type_wrapper.EnumTypeWrapper($descriptor_name$)",
-                    "name", enum_descriptor.name(),
-                    "descriptor_name",
-                    ModuleLevelDescriptorName(enum_descriptor));
+    printer_->Print(
+        "$name$ = "
+        "enum_type_wrapper.EnumTypeWrapper($descriptor_name$)",
+        "name", ResolveKeyword(enum_descriptor.name()), "descriptor_name",
+        ModuleLevelDescriptorName(enum_descriptor));
     printer_->Print("\n");
 
     for (int j = 0; j < enum_descriptor.value_count(); ++j) {
@@ -490,7 +501,7 @@
 
   for (int i = 0; i < top_level_enum_values.size(); ++i) {
     printer_->Print("$name$ = $value$\n", "name",
-                    top_level_enum_values[i].first, "value",
+                    ResolveKeyword(top_level_enum_values[i].first), "value",
                     StrCat(top_level_enum_values[i].second));
   }
   printer_->Print("\n");
@@ -533,8 +544,7 @@
   printer_->Outdent();
   printer_->Print("],\n");
   printer_->Print("containing_type=None,\n");
-  printer_->Print("serialized_options=$options_value$,\n",
-                  "options_value",
+  printer_->Print("serialized_options=$options_value$,\n", "options_value",
                   OptionsValue(options_string));
   EnumDescriptorProto edp;
   PrintSerializedPbInterval(enum_descriptor, edp);
@@ -566,7 +576,8 @@
     printer_->Print("$constant_name$ = $number$\n", "constant_name",
                     constant_name, "number",
                     StrCat(extension_field.number()));
-    printer_->Print("$name$ = ", "name", extension_field.name());
+    printer_->Print("$name$ = ", "name",
+                    ResolveKeyword(extension_field.name()));
     PrintFieldDescriptor(extension_field, is_extension);
     printer_->Print("\n");
   }
@@ -604,9 +615,8 @@
   std::string options_string;
   descriptor.options().SerializeToString(&options_string);
 
-  printer_->Print(
-      "$service_name$ = _descriptor.ServiceDescriptor(\n",
-      "service_name", service_name);
+  printer_->Print("$service_name$ = _descriptor.ServiceDescriptor(\n",
+                  "service_name", service_name);
   printer_->Indent();
   std::map<std::string, std::string> m;
   m["name"] = descriptor.name();
@@ -640,15 +650,14 @@
     m["options_value"] = OptionsValue(options_string);
     printer_->Print("_descriptor.MethodDescriptor(\n");
     printer_->Indent();
-    printer_->Print(
-        m,
-        "name='$name$',\n"
-        "full_name='$full_name$',\n"
-        "index=$index$,\n"
-        "containing_service=None,\n"
-        "input_type=$input_type$,\n"
-        "output_type=$output_type$,\n"
-        "serialized_options=$options_value$,\n");
+    printer_->Print(m,
+                    "name='$name$',\n"
+                    "full_name='$full_name$',\n"
+                    "index=$index$,\n"
+                    "containing_service=None,\n"
+                    "input_type=$input_type$,\n"
+                    "output_type=$output_type$,\n"
+                    "serialized_options=$options_value$,\n");
     printer_->Outdent();
     printer_->Print("),\n");
   }
@@ -660,23 +669,21 @@
   printer_->Print("\n");
 }
 
-
 void Generator::PrintDescriptorKeyAndModuleName(
     const ServiceDescriptor& descriptor) const {
-  printer_->Print(
-      "$descriptor_key$ = $descriptor_name$,\n",
-      "descriptor_key", kDescriptorKey,
-      "descriptor_name", ModuleLevelServiceDescriptorName(descriptor));
-  printer_->Print(
-      "__module__ = '$module_name$'\n",
-      "module_name", ModuleName(file_->name()));
+  printer_->Print("$descriptor_key$ = $descriptor_name$,\n", "descriptor_key",
+                  kDescriptorKey, "descriptor_name",
+                  ModuleLevelServiceDescriptorName(descriptor));
+  printer_->Print("__module__ = '$module_name$'\n", "module_name",
+                  ModuleName(file_->name()));
 }
 
 void Generator::PrintServiceClass(const ServiceDescriptor& descriptor) const {
   // Print the service.
-  printer_->Print("$class_name$ = service_reflection.GeneratedServiceType("
-                  "'$class_name$', (_service.Service,), dict(\n",
-                  "class_name", descriptor.name());
+  printer_->Print(
+      "$class_name$ = service_reflection.GeneratedServiceType("
+      "'$class_name$', (_service.Service,), dict(\n",
+      "class_name", descriptor.name());
   printer_->Indent();
   Generator::PrintDescriptorKeyAndModuleName(descriptor);
   printer_->Print("))\n\n");
@@ -685,10 +692,11 @@
 
 void Generator::PrintServiceStub(const ServiceDescriptor& descriptor) const {
   // Print the service stub.
-  printer_->Print("$class_name$_Stub = "
-                  "service_reflection.GeneratedServiceStubType("
-                  "'$class_name$_Stub', ($class_name$,), dict(\n",
-                  "class_name", descriptor.name());
+  printer_->Print(
+      "$class_name$_Stub = "
+      "service_reflection.GeneratedServiceStubType("
+      "'$class_name$_Stub', ($class_name$,), dict(\n",
+      "class_name", descriptor.name());
   printer_->Indent();
   Generator::PrintDescriptorKeyAndModuleName(descriptor);
   printer_->Print("))\n\n");
@@ -747,9 +755,8 @@
       "serialized_options=$options_value$,\n"
       "is_extendable=$extendable$,\n"
       "syntax='$syntax$'",
-      "options_value", OptionsValue(options_string),
-      "extendable", message_descriptor.extension_range_count() > 0 ?
-                      "True" : "False",
+      "options_value", OptionsValue(options_string), "extendable",
+      message_descriptor.extension_range_count() > 0 ? "True" : "False",
       "syntax", StringifySyntax(message_descriptor.file()->syntax()));
   printer_->Print(",\n");
 
@@ -777,12 +784,11 @@
     } else {
       m["serialized_options"] = ", serialized_options=" + options_string;
     }
-    printer_->Print(
-        m,
-        "_descriptor.OneofDescriptor(\n"
-        "  name='$name$', full_name='$full_name$',\n"
-        "  index=$index$, containing_type=None, "
-        "fields=[]$serialized_options$),\n");
+    printer_->Print(m,
+                    "_descriptor.OneofDescriptor(\n"
+                    "  name='$name$', full_name='$full_name$',\n"
+                    "  index=$index$, containing_type=None, "
+                    "fields=[]$serialized_options$),\n");
   }
   printer_->Outdent();
   printer_->Print("],\n");
@@ -812,7 +818,7 @@
     PrintMessage(*file_->message_type(i), "", &to_register, false);
     for (int j = 0; j < to_register.size(); ++j) {
       printer_->Print("_sym_db.RegisterMessage($name$)\n", "name",
-                      to_register[j]);
+                      ResolveKeyword(to_register[j]));
     }
     printer_->Print("\n");
   }
@@ -830,28 +836,36 @@
                              const std::string& prefix,
                              std::vector<std::string>* to_register,
                              bool is_nested) const {
-  std::string qualified_name(prefix + message_descriptor.name());
-  to_register->push_back(qualified_name);
+  std::string qualified_name;
   if (is_nested) {
+    if (IsPythonKeyword(message_descriptor.name())) {
+      qualified_name =
+          "getattr(" + prefix + ", '" + message_descriptor.name() + "')";
+    } else {
+      qualified_name = prefix + "." + message_descriptor.name();
+    }
     printer_->Print(
         "'$name$' : _reflection.GeneratedProtocolMessageType('$name$', "
         "(_message.Message,), {\n",
         "name", message_descriptor.name());
   } else {
+    qualified_name = ResolveKeyword(message_descriptor.name());
     printer_->Print(
-        "$name$ = _reflection.GeneratedProtocolMessageType('$name$', "
+        "$qualified_name$ = _reflection.GeneratedProtocolMessageType('$name$', "
         "(_message.Message,), {\n",
-        "name", message_descriptor.name());
+        "qualified_name", qualified_name, "name", message_descriptor.name());
   }
   printer_->Indent();
 
-  PrintNestedMessages(message_descriptor, qualified_name + ".", to_register);
+  to_register->push_back(qualified_name);
+
+  PrintNestedMessages(message_descriptor, qualified_name, to_register);
   std::map<std::string, std::string> m;
   m["descriptor_key"] = kDescriptorKey;
   m["descriptor_name"] = ModuleLevelDescriptorName(message_descriptor);
   printer_->Print(m, "'$descriptor_key$' : $descriptor_name$,\n");
-  printer_->Print("'__module__' : '$module_name$'\n",
-                  "module_name", ModuleName(file_->name()));
+  printer_->Print("'__module__' : '$module_name$'\n", "module_name",
+                  ModuleName(file_->name()));
   printer_->Print("# @@protoc_insertion_point(class_scope:$full_name$)\n",
                   "full_name", message_descriptor.full_name());
   printer_->Print("})\n");
@@ -954,9 +968,10 @@
   std::map<std::string, std::string> m;
   m["descriptor_name"] = kDescriptorKey;
   m["field_name"] = descriptor.name();
+  m["resolved_name"] = ResolveKeyword(descriptor.name());
   const char file_descriptor_template[] =
       "$descriptor_name$.extensions_by_name['$field_name$'] = "
-      "$field_name$\n";
+      "$resolved_name$\n";
   printer_->Print(m, file_descriptor_template);
 }
 
@@ -1002,15 +1017,14 @@
     const std::string& python_dict_name) const {
   // We should only ever be looking up fields in the current file.
   // The only things we refer to from other files are message descriptors.
-  GOOGLE_CHECK_EQ(field.file(), file_) << field.file()->name() << " vs. "
-                                << file_->name();
+  GOOGLE_CHECK_EQ(field.file(), file_)
+      << field.file()->name() << " vs. " << file_->name();
   if (!containing_type) {
-    return field.name();
+    return ResolveKeyword(field.name());
   }
-  return strings::Substitute(
-      "$0.$1['$2']",
-      ModuleLevelDescriptorName(*containing_type),
-      python_dict_name, field.name());
+  return strings::Substitute("$0.$1['$2']",
+                             ModuleLevelDescriptorName(*containing_type),
+                             python_dict_name, field.name());
 }
 
 // Prints containing_type for nested descriptors or enum descriptors.
@@ -1022,10 +1036,8 @@
     const std::string nested_name = ModuleLevelDescriptorName(descriptor);
     const std::string parent_name =
         ModuleLevelDescriptorName(*containing_descriptor);
-    printer_->Print(
-        "$nested_name$.containing_type = $parent_name$\n",
-        "nested_name", nested_name,
-        "parent_name", parent_name);
+    printer_->Print("$nested_name$.containing_type = $parent_name$\n",
+                    "nested_name", nested_name, "parent_name", parent_name);
   }
 }
 
@@ -1081,11 +1093,10 @@
   // containing_type() means "extended type."
   // On the other hand, extension_scope() will give us what we normally
   // mean by containing_type().
-  m["extended_message_class"] = ModuleLevelMessageName(
-      *extension_field.containing_type());
-  m["field"] = FieldReferencingExpression(extension_field.extension_scope(),
-                                          extension_field,
-                                          "extensions_by_name");
+  m["extended_message_class"] =
+      ModuleLevelMessageName(*extension_field.containing_type());
+  m["field"] = FieldReferencingExpression(
+      extension_field.extension_scope(), extension_field, "extensions_by_name");
   printer_->Print(m, "$extended_message_class$.RegisterExtension($field$)\n");
 }
 
@@ -1114,12 +1125,11 @@
   m["index"] = StrCat(descriptor.index());
   m["number"] = StrCat(descriptor.number());
   m["options"] = OptionsValue(options_string);
-  printer_->Print(
-      m,
-      "_descriptor.EnumValueDescriptor(\n"
-      "  name='$name$', index=$index$, number=$number$,\n"
-      "  serialized_options=$options$,\n"
-      "  type=None)");
+  printer_->Print(m,
+                  "_descriptor.EnumValueDescriptor(\n"
+                  "  name='$name$', index=$index$, number=$number$,\n"
+                  "  serialized_options=$options$,\n"
+                  "  type=None)");
 }
 
 // Returns a CEscaped string of serialized_options.
@@ -1128,14 +1138,14 @@
   if (serialized_options.length() == 0 || GeneratingDescriptorProto()) {
     return "None";
   } else {
-//##!PY25    return "b'('" + CEscape(serialized_options)+ "')";
-    return "_b('"+ CEscape(serialized_options) + "')";  //##PY25
+    //##!PY25    return "b'('" + CEscape(serialized_options)+ "')";
+    return "_b('" + CEscape(serialized_options) + "')";  //##PY25
   }
 }
 
 // Prints an expression for a Python FieldDescriptor for |field|.
-void Generator::PrintFieldDescriptor(
-    const FieldDescriptor& field, bool is_extension) const {
+void Generator::PrintFieldDescriptor(const FieldDescriptor& field,
+                                     bool is_extension) const {
   std::string options_string;
   field.options().SerializeToString(&options_string);
   std::map<std::string, std::string> m;
@@ -1150,19 +1160,20 @@
   m["default_value"] = StringifyDefaultValue(field);
   m["is_extension"] = is_extension ? "True" : "False";
   m["serialized_options"] = OptionsValue(options_string);
-  m["json_name"] = field.has_json_name() ?
-      ", json_name='" + field.json_name() + "'": "";
+  m["json_name"] =
+      field.has_json_name() ? ", json_name='" + field.json_name() + "'" : "";
   // We always set message_type and enum_type to None at this point, and then
   // these fields in correctly after all referenced descriptors have been
   // defined and/or imported (see FixForeignFieldsInDescriptors()).
   const char field_descriptor_decl[] =
-    "_descriptor.FieldDescriptor(\n"
-    "  name='$name$', full_name='$full_name$', index=$index$,\n"
-    "  number=$number$, type=$type$, cpp_type=$cpp_type$, label=$label$,\n"
-    "  has_default_value=$has_default_value$, default_value=$default_value$,\n"
-    "  message_type=None, enum_type=None, containing_type=None,\n"
-    "  is_extension=$is_extension$, extension_scope=None,\n"
-    "  serialized_options=$serialized_options$$json_name$, file=DESCRIPTOR)";
+      "_descriptor.FieldDescriptor(\n"
+      "  name='$name$', full_name='$full_name$', index=$index$,\n"
+      "  number=$number$, type=$type$, cpp_type=$cpp_type$, label=$label$,\n"
+      "  has_default_value=$has_default_value$, "
+      "default_value=$default_value$,\n"
+      "  message_type=None, enum_type=None, containing_type=None,\n"
+      "  is_extension=$is_extension$, extension_scope=None,\n"
+      "  serialized_options=$serialized_options$$json_name$, file=DESCRIPTOR)";
   printer_->Print(m, field_descriptor_decl);
 }
 
@@ -1174,8 +1185,7 @@
   printer_->Print("$list$=[\n", "list", list_variable_name);
   printer_->Indent();
   for (int i = 0; i < (message_descriptor.*CountFn)(); ++i) {
-    PrintFieldDescriptor(*(message_descriptor.*GetterFn)(i),
-                         is_extension);
+    PrintFieldDescriptor(*(message_descriptor.*GetterFn)(i), is_extension);
     printer_->Print(",\n");
   }
   printer_->Outdent();
@@ -1187,9 +1197,9 @@
 void Generator::PrintFieldsInDescriptor(
     const Descriptor& message_descriptor) const {
   const bool is_extension = false;
-  PrintFieldDescriptorsInDescriptor(
-      message_descriptor, is_extension, "fields",
-      &Descriptor::field_count, &Descriptor::field);
+  PrintFieldDescriptorsInDescriptor(message_descriptor, is_extension, "fields",
+                                    &Descriptor::field_count,
+                                    &Descriptor::field);
 }
 
 // Prints a statement assigning "extensions" to a list of Python
@@ -1197,9 +1207,9 @@
 void Generator::PrintExtensionsInDescriptor(
     const Descriptor& message_descriptor) const {
   const bool is_extension = true;
-  PrintFieldDescriptorsInDescriptor(
-      message_descriptor, is_extension, "extensions",
-      &Descriptor::extension_count, &Descriptor::extension);
+  PrintFieldDescriptorsInDescriptor(message_descriptor, is_extension,
+                                    "extensions", &Descriptor::extension_count,
+                                    &Descriptor::extension);
 }
 
 bool Generator::GeneratingDescriptorProto() const {
@@ -1273,8 +1283,8 @@
 // serialized_end=43,
 //
 template <typename DescriptorT, typename DescriptorProtoT>
-void Generator::PrintSerializedPbInterval(
-    const DescriptorT& descriptor, DescriptorProtoT& proto) const {
+void Generator::PrintSerializedPbInterval(const DescriptorT& descriptor,
+                                          DescriptorProtoT& proto) const {
   descriptor.CopyTo(&proto);
   std::string sp;
   proto.SerializeToString(&sp);
@@ -1294,9 +1304,7 @@
                                       io::Printer* printer) {
   // Reset the _options to None thus DescriptorBase.GetOptions() can
   // parse _options again after extensions are registered.
-  printer->Print(
-      "$descriptor$._options = None\n",
-      "descriptor", descriptor);
+  printer->Print("$descriptor$._options = None\n", "descriptor", descriptor);
 }
 }  // namespace
 
@@ -1358,8 +1366,7 @@
 
 // Prints expressions that set the options for field descriptors (including
 // extensions).
-void Generator::FixOptionsForField(
-    const FieldDescriptor& field) const {
+void Generator::FixOptionsForField(const FieldDescriptor& field) const {
   std::string field_options = OptionsValue(field.options().SerializeAsString());
   if (field_options != "None") {
     std::string field_name;
@@ -1368,12 +1375,12 @@
         // Top level extensions.
         field_name = field.name();
       } else {
-        field_name = FieldReferencingExpression(
-            field.extension_scope(), field, "extensions_by_name");
+        field_name = FieldReferencingExpression(field.extension_scope(), field,
+                                                "extensions_by_name");
       }
     } else {
-      field_name = FieldReferencingExpression(
-          field.containing_type(), field, "fields_by_name");
+      field_name = FieldReferencingExpression(field.containing_type(), field,
+                                              "fields_by_name");
     }
     PrintDescriptorOptionsFixingCode(field_name, field_options, printer_);
   }
@@ -1409,8 +1416,7 @@
       OptionsValue(descriptor.options().SerializeAsString());
   if (message_options != "None") {
     std::string descriptor_name = ModuleLevelDescriptorName(descriptor);
-    PrintDescriptorOptionsFixingCode(descriptor_name,
-                                     message_options,
+    PrintDescriptorOptionsFixingCode(descriptor_name, message_options,
                                      printer_);
   }
 }
@@ -1425,13 +1431,12 @@
     // There's no module alias in the dependent file if it was generated by
     // an old protoc (less than 3.0.0-alpha-1). Use module name in this
     // situation.
-    printer_->Print("try:\n"
-                    "  $alias$ = $copy_from$.$alias$\n"
-                    "except AttributeError:\n"
-                    "  $alias$ = $copy_from$.$module$\n",
-                    "alias", module_alias,
-                    "module", module_name,
-                    "copy_from", copy_from);
+    printer_->Print(
+        "try:\n"
+        "  $alias$ = $copy_from$.$alias$\n"
+        "except AttributeError:\n"
+        "  $alias$ = $copy_from$.$module$\n",
+        "alias", module_alias, "module", module_name, "copy_from", copy_from);
     CopyPublicDependenciesAliases(copy_from, file->public_dependency(i));
   }
 }
diff --git a/src/google/protobuf/compiler/python/python_generator.h b/src/google/protobuf/compiler/python/python_generator.h
index b4959bf..4630671 100644
--- a/src/google/protobuf/compiler/python/python_generator.h
+++ b/src/google/protobuf/compiler/python/python_generator.h
@@ -52,7 +52,9 @@
 class OneofDescriptor;
 class ServiceDescriptor;
 
-namespace io { class Printer; }
+namespace io {
+class Printer;
+}
 
 namespace compiler {
 namespace python {
@@ -82,8 +84,8 @@
 
   void PrintTopLevelExtensions() const;
 
-  void PrintFieldDescriptor(
-      const FieldDescriptor& field, bool is_extension) const;
+  void PrintFieldDescriptor(const FieldDescriptor& field,
+                            bool is_extension) const;
   void PrintFieldDescriptorsInDescriptor(
       const Descriptor& message_descriptor, bool is_extension,
       const std::string& list_variable_name, int (Descriptor::*CountFn)() const,
@@ -146,8 +148,8 @@
       const ServiceDescriptor& descriptor) const;
 
   template <typename DescriptorT, typename DescriptorProtoT>
-  void PrintSerializedPbInterval(
-      const DescriptorT& descriptor, DescriptorProtoT& proto) const;
+  void PrintSerializedPbInterval(const DescriptorT& descriptor,
+                                 DescriptorProtoT& proto) const;
 
   void FixAllDescriptorOptions() const;
   void FixOptionsForField(const FieldDescriptor& field) const;
diff --git a/src/google/protobuf/compiler/python/python_plugin_unittest.cc b/src/google/protobuf/compiler/python/python_plugin_unittest.cc
index aa04e8b..8d7ef98 100644
--- a/src/google/protobuf/compiler/python/python_plugin_unittest.cc
+++ b/src/google/protobuf/compiler/python/python_plugin_unittest.cc
@@ -36,10 +36,10 @@
 
 #include <memory>
 
-#include <google/protobuf/compiler/python/python_generator.h>
 #include <google/protobuf/compiler/command_line_interface.h>
-#include <google/protobuf/io/zero_copy_stream.h>
+#include <google/protobuf/compiler/python/python_generator.h>
 #include <google/protobuf/io/printer.h>
+#include <google/protobuf/io/zero_copy_stream.h>
 
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/testing/file.h>
@@ -102,13 +102,8 @@
   std::string python_out = "--python_out=" + TestTempDir();
   std::string test_out = "--test_out=" + TestTempDir();
 
-  const char* argv[] = {
-    "protoc",
-    proto_path.c_str(),
-    python_out.c_str(),
-    test_out.c_str(),
-    "test.proto"
-  };
+  const char* argv[] = {"protoc", proto_path.c_str(), python_out.c_str(),
+                        test_out.c_str(), "test.proto"};
 
   EXPECT_EQ(0, cli.Run(5, argv));
 }
diff --git a/src/google/protobuf/compiler/subprocess.cc b/src/google/protobuf/compiler/subprocess.cc
index 42f3d06..b920b2d 100644
--- a/src/google/protobuf/compiler/subprocess.cc
+++ b/src/google/protobuf/compiler/subprocess.cc
@@ -38,9 +38,9 @@
 
 #ifndef _WIN32
 #include <errno.h>
+#include <signal.h>
 #include <sys/select.h>
 #include <sys/wait.h>
-#include <signal.h>
 #endif
 
 #include <google/protobuf/stubs/logging.h>
@@ -54,7 +54,7 @@
 
 namespace {
 char* portable_strdup(const char* s) {
-  char* ns = (char*) malloc(strlen(s) + 1);
+  char* ns = (char*)malloc(strlen(s) + 1);
   if (ns != NULL) {
     strcpy(ns, s);
   }
@@ -73,7 +73,9 @@
 
 Subprocess::Subprocess()
     : process_start_error_(ERROR_SUCCESS),
-      child_handle_(NULL), child_stdin_(NULL), child_stdout_(NULL) {}
+      child_handle_(NULL),
+      child_stdin_(NULL),
+      child_stdout_(NULL) {}
 
 Subprocess::~Subprocess() {
   if (child_stdin_ != NULL) {
@@ -99,13 +101,13 @@
   }
 
   // Make child side of the pipes inheritable.
-  if (!SetHandleInformation(stdin_pipe_read,
-                            HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) {
+  if (!SetHandleInformation(stdin_pipe_read, HANDLE_FLAG_INHERIT,
+                            HANDLE_FLAG_INHERIT)) {
     GOOGLE_LOG(FATAL) << "SetHandleInformation: "
                       << Win32ErrorMessage(GetLastError());
   }
-  if (!SetHandleInformation(stdout_pipe_write,
-                            HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) {
+  if (!SetHandleInformation(stdout_pipe_write, HANDLE_FLAG_INHERIT,
+                            HANDLE_FLAG_INHERIT)) {
     GOOGLE_LOG(FATAL) << "SetHandleInformation: "
                       << Win32ErrorMessage(GetLastError());
   }
@@ -120,14 +122,13 @@
   startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE);
 
   if (startup_info.hStdError == INVALID_HANDLE_VALUE) {
-    GOOGLE_LOG(FATAL) << "GetStdHandle: "
-                      << Win32ErrorMessage(GetLastError());
+    GOOGLE_LOG(FATAL) << "GetStdHandle: " << Win32ErrorMessage(GetLastError());
   }
 
   // Invoking cmd.exe allows for '.bat' files from the path as well as '.exe'.
   // Using a malloc'ed string because CreateProcess() can mutate its second
   // parameter.
-  char *command_line =
+  char* command_line =
       portable_strdup(("cmd.exe /c \"" + program + "\"").c_str());
 
   // Create the process.
@@ -141,8 +142,7 @@
                      0,     // obscure creation flags
                      NULL,  // environment (inherit from parent)
                      NULL,  // current directory (inherit from parent)
-                     &startup_info,
-                     &process_info)) {
+                     &startup_info, &process_info)) {
     child_handle_ = process_info.hProcess;
     CloseHandleOrDie(process_info.hThread);
     child_stdin_ = stdin_pipe_write;
@@ -200,10 +200,8 @@
 
     if (signaled_handle == child_stdin_) {
       DWORD n;
-      if (!WriteFile(child_stdin_,
-                     input_data.data() + input_pos,
-                     input_data.size() - input_pos,
-                     &n, NULL)) {
+      if (!WriteFile(child_stdin_, input_data.data() + input_pos,
+                     input_data.size() - input_pos, &n, NULL)) {
         // Child closed pipe.  Presumably it will report an error later.
         // Pretend we're done for now.
         input_pos = input_data.size();
@@ -257,8 +255,8 @@
   child_handle_ = NULL;
 
   if (exit_code != 0) {
-    *error = strings::Substitute(
-        "Plugin failed with status code $0.", exit_code);
+    *error =
+        strings::Substitute("Plugin failed with status code $0.", exit_code);
     return false;
   }
 
@@ -312,7 +310,7 @@
   GOOGLE_CHECK(pipe(stdin_pipe) != -1);
   GOOGLE_CHECK(pipe(stdout_pipe) != -1);
 
-  char* argv[2] = { portable_strdup(program.c_str()), NULL };
+  char* argv[2] = {portable_strdup(program.c_str()), NULL};
 
   child_pid_ = fork();
   if (child_pid_ == -1) {
@@ -342,7 +340,7 @@
     ignored = write(STDERR_FILENO, argv[0], strlen(argv[0]));
     const char* message = ": program not found or is not executable\n";
     ignored = write(STDERR_FILENO, message, strlen(message));
-    (void) ignored;
+    (void)ignored;
 
     // Must use _exit() rather than exit() to avoid flushing output buffers
     // that will also be flushed by the parent.
@@ -397,7 +395,7 @@
 
     if (child_stdin_ != -1 && FD_ISSET(child_stdin_, &write_fds)) {
       int n = write(child_stdin_, input_data.data() + input_pos,
-                                  input_data.size() - input_pos);
+                    input_data.size() - input_pos);
       if (n < 0) {
         // Child closed pipe.  Presumably it will report an error later.
         // Pretend we're done for now.
@@ -447,14 +445,13 @@
   if (WIFEXITED(status)) {
     if (WEXITSTATUS(status) != 0) {
       int error_code = WEXITSTATUS(status);
-      *error = strings::Substitute(
-          "Plugin failed with status code $0.", error_code);
+      *error =
+          strings::Substitute("Plugin failed with status code $0.", error_code);
       return false;
     }
   } else if (WIFSIGNALED(status)) {
     int signal = WTERMSIG(status);
-    *error = strings::Substitute(
-        "Plugin killed by signal $0.", signal);
+    *error = strings::Substitute("Plugin killed by signal $0.", signal);
     return false;
   } else {
     *error = "Neither WEXITSTATUS nor WTERMSIG is true?";
diff --git a/src/google/protobuf/compiler/subprocess.h b/src/google/protobuf/compiler/subprocess.h
index 977abff..9c4f8b7 100644
--- a/src/google/protobuf/compiler/subprocess.h
+++ b/src/google/protobuf/compiler/subprocess.h
@@ -34,7 +34,7 @@
 #define GOOGLE_PROTOBUF_COMPILER_SUBPROCESS_H__
 
 #ifdef _WIN32
-#define WIN32_LEAN_AND_MEAN   // right...
+#define WIN32_LEAN_AND_MEAN  // right...
 #include <windows.h>
 #else  // _WIN32
 #include <sys/types.h>
@@ -60,8 +60,8 @@
   ~Subprocess();
 
   enum SearchMode {
-    SEARCH_PATH,   // Use PATH environment variable.
-    EXACT_NAME     // Program is an exact file name; don't use the PATH.
+    SEARCH_PATH,  // Use PATH environment variable.
+    EXACT_NAME    // Program is an exact file name; don't use the PATH.
   };
 
   // Start the subprocess.  Currently we don't provide a way to specify
diff --git a/src/google/protobuf/compiler/test_plugin.cc b/src/google/protobuf/compiler/test_plugin.cc
index 4b75876..6b56170 100644
--- a/src/google/protobuf/compiler/test_plugin.cc
+++ b/src/google/protobuf/compiler/test_plugin.cc
@@ -33,10 +33,10 @@
 // This is a dummy code generator plugin used by
 // command_line_interface_unittest.
 
-#include <string>
 #include <stdlib.h>
-#include <google/protobuf/compiler/plugin.h>
+#include <string>
 #include <google/protobuf/compiler/mock_code_generator.h>
+#include <google/protobuf/compiler/plugin.h>
 
 namespace google {
 namespace protobuf {
diff --git a/src/google/protobuf/compiler/zip_writer.cc b/src/google/protobuf/compiler/zip_writer.cc
index f03b3a6..872dd9e 100644
--- a/src/google/protobuf/compiler/zip_writer.cc
+++ b/src/google/protobuf/compiler/zip_writer.cc
@@ -75,50 +75,49 @@
 static const uint16 kDosEpoch = 1 << 5 | 1;
 
 static const uint32 kCRC32Table[256] = {
-  0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
-  0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
-  0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
-  0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
-  0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
-  0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
-  0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
-  0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
-  0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
-  0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
-  0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
-  0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
-  0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
-  0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
-  0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
-  0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
-  0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
-  0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
-  0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
-  0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
-  0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
-  0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
-  0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
-  0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
-  0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
-  0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
-  0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
-  0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
-  0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
-  0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
-  0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
-  0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
-  0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
-  0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
-  0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
-  0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
-  0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
-  0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
-  0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
-  0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
-  0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
-  0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
-  0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
-};
+    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+    0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+    0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+    0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+    0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+    0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+    0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+    0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+    0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+    0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+    0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+    0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+    0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+    0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+    0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+    0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+    0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+    0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+    0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+    0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+    0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+    0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+    0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+    0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+    0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+    0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+    0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+    0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+    0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+    0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+    0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+    0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+    0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+    0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+    0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+    0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+    0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
 
 static uint32 ComputeCRC32(const std::string& buf) {
   uint32 x = ~0U;
@@ -129,7 +128,7 @@
   return ~x;
 }
 
-static void WriteShort(io::CodedOutputStream *out, uint16 val) {
+static void WriteShort(io::CodedOutputStream* out, uint16 val) {
   uint8 p[2];
   p[0] = static_cast<uint8>(val);
   p[1] = static_cast<uint8>(val >> 8);
@@ -137,7 +136,7 @@
 }
 
 ZipWriter::ZipWriter(io::ZeroCopyOutputStream* raw_output)
-  : raw_output_(raw_output) {}
+    : raw_output_(raw_output) {}
 ZipWriter::~ZipWriter() {}
 
 bool ZipWriter::Write(const std::string& filename,
@@ -155,18 +154,18 @@
   // write file header
   io::CodedOutputStream output(raw_output_);
   output.WriteLittleEndian32(0x04034b50);  // magic
-  WriteShort(&output, 10);  // version needed to extract
-  WriteShort(&output, 0);  // flags
-  WriteShort(&output, 0);  // compression method: stored
-  WriteShort(&output, 0);  // last modified time
-  WriteShort(&output, kDosEpoch);  // last modified date
+  WriteShort(&output, 10);                 // version needed to extract
+  WriteShort(&output, 0);                  // flags
+  WriteShort(&output, 0);                  // compression method: stored
+  WriteShort(&output, 0);                  // last modified time
+  WriteShort(&output, kDosEpoch);          // last modified date
   output.WriteLittleEndian32(info.crc32);  // crc-32
-  output.WriteLittleEndian32(info.size);  // compressed size
-  output.WriteLittleEndian32(info.size);  // uncompressed size
-  WriteShort(&output, filename_size);  // file name length
-  WriteShort(&output, 0);   // extra field length
-  output.WriteString(filename);  // file name
-  output.WriteString(contents);  // file data
+  output.WriteLittleEndian32(info.size);   // compressed size
+  output.WriteLittleEndian32(info.size);   // uncompressed size
+  WriteShort(&output, filename_size);      // file name length
+  WriteShort(&output, 0);                  // extra field length
+  output.WriteString(filename);            // file name
+  output.WriteString(contents);            // file data
 
   return !output.HadError();
 }
@@ -185,35 +184,35 @@
     uint32 offset = files_[i].offset;
 
     output.WriteLittleEndian32(0x02014b50);  // magic
-    WriteShort(&output, 10);  // version made by
-    WriteShort(&output, 10);  // version needed to extract
-    WriteShort(&output, 0);  // flags
-    WriteShort(&output, 0);  // compression method: stored
-    WriteShort(&output, 0);  // last modified time
-    WriteShort(&output, kDosEpoch);  // last modified date
-    output.WriteLittleEndian32(crc32);  // crc-32
-    output.WriteLittleEndian32(size);  // compressed size
-    output.WriteLittleEndian32(size);  // uncompressed size
-    WriteShort(&output, filename_size);  // file name length
-    WriteShort(&output, 0);   // extra field length
-    WriteShort(&output, 0);   // file comment length
-    WriteShort(&output, 0);   // starting disk number
-    WriteShort(&output, 0);   // internal file attributes
-    output.WriteLittleEndian32(0);  // external file attributes
-    output.WriteLittleEndian32(offset);  // local header offset
-    output.WriteString(filename);  // file name
+    WriteShort(&output, 10);                 // version made by
+    WriteShort(&output, 10);                 // version needed to extract
+    WriteShort(&output, 0);                  // flags
+    WriteShort(&output, 0);                  // compression method: stored
+    WriteShort(&output, 0);                  // last modified time
+    WriteShort(&output, kDosEpoch);          // last modified date
+    output.WriteLittleEndian32(crc32);       // crc-32
+    output.WriteLittleEndian32(size);        // compressed size
+    output.WriteLittleEndian32(size);        // uncompressed size
+    WriteShort(&output, filename_size);      // file name length
+    WriteShort(&output, 0);                  // extra field length
+    WriteShort(&output, 0);                  // file comment length
+    WriteShort(&output, 0);                  // starting disk number
+    WriteShort(&output, 0);                  // internal file attributes
+    output.WriteLittleEndian32(0);           // external file attributes
+    output.WriteLittleEndian32(offset);      // local header offset
+    output.WriteString(filename);            // file name
   }
   uint32 dir_len = output.ByteCount();
 
   // write end of central directory marker
   output.WriteLittleEndian32(0x06054b50);  // magic
-  WriteShort(&output, 0);  // disk number
-  WriteShort(&output, 0);  // disk with start of central directory
-  WriteShort(&output, num_entries);  // central directory entries (this disk)
-  WriteShort(&output, num_entries);  // central directory entries (total)
+  WriteShort(&output, 0);                  // disk number
+  WriteShort(&output, 0);               // disk with start of central directory
+  WriteShort(&output, num_entries);     // central directory entries (this disk)
+  WriteShort(&output, num_entries);     // central directory entries (total)
   output.WriteLittleEndian32(dir_len);  // central directory byte size
   output.WriteLittleEndian32(dir_ofs);  // central directory offset
-  WriteShort(&output, 0);   // comment length
+  WriteShort(&output, 0);               // comment length
 
   return output.HadError();
 }
diff --git a/src/google/protobuf/descriptor.cc b/src/google/protobuf/descriptor.cc
index d5c20ee..cc1c4bf 100644
--- a/src/google/protobuf/descriptor.cc
+++ b/src/google/protobuf/descriptor.cc
@@ -150,73 +150,73 @@
 };
 
 const FieldDescriptor::CppType
-FieldDescriptor::kTypeToCppTypeMap[MAX_TYPE + 1] = {
-  static_cast<CppType>(0),  // 0 is reserved for errors
+    FieldDescriptor::kTypeToCppTypeMap[MAX_TYPE + 1] = {
+        static_cast<CppType>(0),  // 0 is reserved for errors
 
-  CPPTYPE_DOUBLE,   // TYPE_DOUBLE
-  CPPTYPE_FLOAT,    // TYPE_FLOAT
-  CPPTYPE_INT64,    // TYPE_INT64
-  CPPTYPE_UINT64,   // TYPE_UINT64
-  CPPTYPE_INT32,    // TYPE_INT32
-  CPPTYPE_UINT64,   // TYPE_FIXED64
-  CPPTYPE_UINT32,   // TYPE_FIXED32
-  CPPTYPE_BOOL,     // TYPE_BOOL
-  CPPTYPE_STRING,   // TYPE_STRING
-  CPPTYPE_MESSAGE,  // TYPE_GROUP
-  CPPTYPE_MESSAGE,  // TYPE_MESSAGE
-  CPPTYPE_STRING,   // TYPE_BYTES
-  CPPTYPE_UINT32,   // TYPE_UINT32
-  CPPTYPE_ENUM,     // TYPE_ENUM
-  CPPTYPE_INT32,    // TYPE_SFIXED32
-  CPPTYPE_INT64,    // TYPE_SFIXED64
-  CPPTYPE_INT32,    // TYPE_SINT32
-  CPPTYPE_INT64,    // TYPE_SINT64
+        CPPTYPE_DOUBLE,   // TYPE_DOUBLE
+        CPPTYPE_FLOAT,    // TYPE_FLOAT
+        CPPTYPE_INT64,    // TYPE_INT64
+        CPPTYPE_UINT64,   // TYPE_UINT64
+        CPPTYPE_INT32,    // TYPE_INT32
+        CPPTYPE_UINT64,   // TYPE_FIXED64
+        CPPTYPE_UINT32,   // TYPE_FIXED32
+        CPPTYPE_BOOL,     // TYPE_BOOL
+        CPPTYPE_STRING,   // TYPE_STRING
+        CPPTYPE_MESSAGE,  // TYPE_GROUP
+        CPPTYPE_MESSAGE,  // TYPE_MESSAGE
+        CPPTYPE_STRING,   // TYPE_BYTES
+        CPPTYPE_UINT32,   // TYPE_UINT32
+        CPPTYPE_ENUM,     // TYPE_ENUM
+        CPPTYPE_INT32,    // TYPE_SFIXED32
+        CPPTYPE_INT64,    // TYPE_SFIXED64
+        CPPTYPE_INT32,    // TYPE_SINT32
+        CPPTYPE_INT64,    // TYPE_SINT64
 };
 
-const char * const FieldDescriptor::kTypeToName[MAX_TYPE + 1] = {
-  "ERROR",     // 0 is reserved for errors
+const char* const FieldDescriptor::kTypeToName[MAX_TYPE + 1] = {
+    "ERROR",  // 0 is reserved for errors
 
-  "double",    // TYPE_DOUBLE
-  "float",     // TYPE_FLOAT
-  "int64",     // TYPE_INT64
-  "uint64",    // TYPE_UINT64
-  "int32",     // TYPE_INT32
-  "fixed64",   // TYPE_FIXED64
-  "fixed32",   // TYPE_FIXED32
-  "bool",      // TYPE_BOOL
-  "string",    // TYPE_STRING
-  "group",     // TYPE_GROUP
-  "message",   // TYPE_MESSAGE
-  "bytes",     // TYPE_BYTES
-  "uint32",    // TYPE_UINT32
-  "enum",      // TYPE_ENUM
-  "sfixed32",  // TYPE_SFIXED32
-  "sfixed64",  // TYPE_SFIXED64
-  "sint32",    // TYPE_SINT32
-  "sint64",    // TYPE_SINT64
+    "double",    // TYPE_DOUBLE
+    "float",     // TYPE_FLOAT
+    "int64",     // TYPE_INT64
+    "uint64",    // TYPE_UINT64
+    "int32",     // TYPE_INT32
+    "fixed64",   // TYPE_FIXED64
+    "fixed32",   // TYPE_FIXED32
+    "bool",      // TYPE_BOOL
+    "string",    // TYPE_STRING
+    "group",     // TYPE_GROUP
+    "message",   // TYPE_MESSAGE
+    "bytes",     // TYPE_BYTES
+    "uint32",    // TYPE_UINT32
+    "enum",      // TYPE_ENUM
+    "sfixed32",  // TYPE_SFIXED32
+    "sfixed64",  // TYPE_SFIXED64
+    "sint32",    // TYPE_SINT32
+    "sint64",    // TYPE_SINT64
 };
 
-const char * const FieldDescriptor::kCppTypeToName[MAX_CPPTYPE + 1] = {
-  "ERROR",     // 0 is reserved for errors
+const char* const FieldDescriptor::kCppTypeToName[MAX_CPPTYPE + 1] = {
+    "ERROR",  // 0 is reserved for errors
 
-  "int32",     // CPPTYPE_INT32
-  "int64",     // CPPTYPE_INT64
-  "uint32",    // CPPTYPE_UINT32
-  "uint64",    // CPPTYPE_UINT64
-  "double",    // CPPTYPE_DOUBLE
-  "float",     // CPPTYPE_FLOAT
-  "bool",      // CPPTYPE_BOOL
-  "enum",      // CPPTYPE_ENUM
-  "string",    // CPPTYPE_STRING
-  "message",   // CPPTYPE_MESSAGE
+    "int32",    // CPPTYPE_INT32
+    "int64",    // CPPTYPE_INT64
+    "uint32",   // CPPTYPE_UINT32
+    "uint64",   // CPPTYPE_UINT64
+    "double",   // CPPTYPE_DOUBLE
+    "float",    // CPPTYPE_FLOAT
+    "bool",     // CPPTYPE_BOOL
+    "enum",     // CPPTYPE_ENUM
+    "string",   // CPPTYPE_STRING
+    "message",  // CPPTYPE_MESSAGE
 };
 
-const char * const FieldDescriptor::kLabelToName[MAX_LABEL + 1] = {
-  "ERROR",     // 0 is reserved for errors
+const char* const FieldDescriptor::kLabelToName[MAX_LABEL + 1] = {
+    "ERROR",  // 0 is reserved for errors
 
-  "optional",  // LABEL_OPTIONAL
-  "required",  // LABEL_REQUIRED
-  "repeated",  // LABEL_REPEATED
+    "optional",  // LABEL_OPTIONAL
+    "required",  // LABEL_REQUIRED
+    "repeated",  // LABEL_REPEATED
 };
 
 const char* FileDescriptor::SyntaxName(FileDescriptor::Syntax syntax) {
@@ -232,7 +232,7 @@
   return NULL;
 }
 
-static const char * const kNonLinkedWeakMessageReplacementName = "google.protobuf.Empty";
+static const char* const kNonLinkedWeakMessageReplacementName = "google.protobuf.Empty";
 
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 const int FieldDescriptor::kMaxNumber;
@@ -406,7 +406,7 @@
 #define HASH_SET std::unordered_set
 #define HASH_FXN hash
 
-template<typename PairType>
+template <typename PairType>
 struct PointerIntegerPairHash {
   size_t operator()(const PairType& p) const {
     static const size_t prime1 = 16777499;
@@ -421,8 +421,7 @@
   static const size_t min_buckets = 8;
 #endif
   inline bool operator()(const PairType& a, const PairType& b) const {
-    return a.first < b.first ||
-          (a.first == b.first && a.second < b.second);
+    return a.first < b.first || (a.first == b.first && a.second < b.second);
   }
 };
 
@@ -467,26 +466,26 @@
 
 typedef HASH_MAP<DescriptorIntPair, const FieldDescriptor*,
                  PointerIntegerPairHash<DescriptorIntPair>,
-                 std::equal_to<DescriptorIntPair> >
+                 std::equal_to<DescriptorIntPair>>
     FieldsByNumberMap;
 
 typedef HASH_MAP<EnumIntPair, const EnumValueDescriptor*,
                  PointerIntegerPairHash<EnumIntPair>,
-                 std::equal_to<EnumIntPair> >
+                 std::equal_to<EnumIntPair>>
     EnumValuesByNumberMap;
 // This is a map rather than a hash-map, since we use it to iterate
 // through all the extensions that extend a given Descriptor, and an
 // ordered data structure that implements lower_bound is convenient
 // for that.
 typedef std::map<DescriptorIntPair, const FieldDescriptor*>
-  ExtensionsGroupedByDescriptorMap;
+    ExtensionsGroupedByDescriptorMap;
 typedef HASH_MAP<std::string, const SourceCodeInfo_Location*>
     LocationsByPathMap;
 
 std::set<std::string>* NewAllowedProto3Extendee() {
   auto allowed_proto3_extendees = new std::set<std::string>;
   const char* kOptionNames[] = {
-      "FileOptions",      "MessageOptions", "FieldOptions", "EnumOptions",
+      "FileOptions",      "MessageOptions", "FieldOptions",  "EnumOptions",
       "EnumValueOptions", "ServiceOptions", "MethodOptions", "OneofOptions"};
   for (int i = 0; i < GOOGLE_ARRAYSIZE(kOptionNames); ++i) {
     // descriptor.proto has a different package name in opensource. We allow
@@ -620,11 +619,13 @@
   // destroyed.  Note that the object's destructor will never be called,
   // so its fields must be plain old data (primitive data types and
   // pointers).  All of the descriptor types are such objects.
-  template<typename Type> Type* Allocate();
+  template <typename Type>
+  Type* Allocate();
 
   // Allocate an array of objects which will be reclaimed when the
   // pool in destroyed.  Again, destructors are never called.
-  template<typename Type> Type* AllocateArray(int count);
+  template <typename Type>
+  Type* AllocateArray(int count);
 
   // Allocate a string which will be destroyed when the pool is destroyed.
   // The string is initialized to the given value for convenience.
@@ -638,22 +639,23 @@
   // trouble understanding explicit template instantiations in some cases, so
   // in those cases we have to pass a dummy pointer of the right type as the
   // parameter instead of specifying the type explicitly.
-  template<typename Type> Type* AllocateMessage(Type* dummy = NULL);
+  template <typename Type>
+  Type* AllocateMessage(Type* dummy = NULL);
 
   // Allocate a FileDescriptorTables object.
   FileDescriptorTables* AllocateFileTables();
 
  private:
   std::vector<std::string*> strings_;  // All strings in the pool.
-  std::vector<Message*> messages_;  // All messages in the pool.
+  std::vector<Message*> messages_;     // All messages in the pool.
   std::vector<internal::once_flag*>
       once_dynamics_;  // All internal::call_onces in the pool.
   std::vector<FileDescriptorTables*>
       file_tables_;                 // All file tables in the pool.
   std::vector<void*> allocations_;  // All other memory allocated in the pool.
 
-  SymbolsByNameMap      symbols_by_name_;
-  FilesByNameMap        files_by_name_;
+  SymbolsByNameMap symbols_by_name_;
+  FilesByNameMap files_by_name_;
   ExtensionsGroupedByDescriptorMap extensions_;
 
   struct CheckPoint {
@@ -679,8 +681,8 @@
     int pending_extensions_before_checkpoint;
   };
   std::vector<CheckPoint> checkpoints_;
-  std::vector<const char*      > symbols_after_checkpoint_;
-  std::vector<const char*      > files_after_checkpoint_;
+  std::vector<const char*> symbols_after_checkpoint_;
+  std::vector<const char*> files_after_checkpoint_;
   std::vector<DescriptorIntPair> extensions_after_checkpoint_;
 
   // Allocate some bytes which will be reclaimed when the pool is
@@ -717,14 +719,14 @@
                                        const Symbol::Type type) const;
 
   // These return NULL if not found.
-  inline const FieldDescriptor* FindFieldByNumber(
-    const Descriptor* parent, int number) const;
+  inline const FieldDescriptor* FindFieldByNumber(const Descriptor* parent,
+                                                  int number) const;
   inline const FieldDescriptor* FindFieldByLowercaseName(
       const void* parent, const std::string& lowercase_name) const;
   inline const FieldDescriptor* FindFieldByCamelcaseName(
       const void* parent, const std::string& camelcase_name) const;
   inline const EnumValueDescriptor* FindEnumValueByNumber(
-    const EnumDescriptor* parent, int number) const;
+      const EnumDescriptor* parent, int number) const;
   // This creates a new EnumValueDescriptor if not found, in a thread-safe way.
   inline const EnumValueDescriptor* FindEnumValueByNumberCreatingIfUnknown(
       const EnumDescriptor* parent, int number) const;
@@ -853,18 +855,15 @@
   const CheckPoint& checkpoint = checkpoints_.back();
 
   for (int i = checkpoint.pending_symbols_before_checkpoint;
-       i < symbols_after_checkpoint_.size();
-       i++) {
+       i < symbols_after_checkpoint_.size(); i++) {
     symbols_by_name_.erase(symbols_after_checkpoint_[i]);
   }
   for (int i = checkpoint.pending_files_before_checkpoint;
-       i < files_after_checkpoint_.size();
-       i++) {
+       i < files_after_checkpoint_.size(); i++) {
     files_by_name_.erase(files_after_checkpoint_[i]);
   }
   for (int i = checkpoint.pending_extensions_before_checkpoint;
-       i < extensions_after_checkpoint_.size();
-       i++) {
+       i < extensions_after_checkpoint_.size(); i++) {
     extensions_.erase(extensions_after_checkpoint_[i]);
   }
 
@@ -886,8 +885,7 @@
       file_tables_.begin() + checkpoint.file_tables_before_checkpoint,
       file_tables_.end());
   for (int i = checkpoint.allocations_before_checkpoint;
-       i < allocations_.size();
-       i++) {
+       i < allocations_.size(); i++) {
     operator delete(allocations_[i]);
   }
 
@@ -940,8 +938,7 @@
 
   if (result.IsNull() && pool->underlay_ != NULL) {
     // Symbol not found; check the underlay.
-    result =
-      pool->underlay_->tables_->FindByNameHelper(pool->underlay_, name);
+    result = pool->underlay_->tables_->FindByNameHelper(pool->underlay_, name);
   }
 
   if (result.IsNull()) {
@@ -1067,13 +1064,12 @@
     // later.
     std::string enum_value_name = StringPrintf("UNKNOWN_ENUM_VALUE_%s_%d",
                                                parent->name().c_str(), number);
-    DescriptorPool::Tables* tables =
-        const_cast<DescriptorPool::Tables*>(DescriptorPool::generated_pool()->
-                                            tables_.get());
+    DescriptorPool::Tables* tables = const_cast<DescriptorPool::Tables*>(
+        DescriptorPool::generated_pool()->tables_.get());
     EnumValueDescriptor* result = tables->Allocate<EnumValueDescriptor>();
     result->name_ = tables->AllocateString(enum_value_name);
-    result->full_name_ = tables->AllocateString(parent->full_name() +
-                                                "." + enum_value_name);
+    result->full_name_ =
+        tables->AllocateString(parent->full_name() + "." + enum_value_name);
     result->number_ = number;
     result->type_ = parent;
     result->options_ = &EnumValueOptions::default_instance();
@@ -1083,7 +1079,6 @@
   }
 }
 
-
 inline const FieldDescriptor* DescriptorPool::Tables::FindExtension(
     const Descriptor* extendee, int number) const {
   return FindPtrOrNull(extensions_, std::make_pair(extendee, number));
@@ -1184,12 +1179,12 @@
 
 // -------------------------------------------------------------------
 
-template<typename Type>
+template <typename Type>
 Type* DescriptorPool::Tables::Allocate() {
   return reinterpret_cast<Type*>(AllocateBytes(sizeof(Type)));
 }
 
-template<typename Type>
+template <typename Type>
 Type* DescriptorPool::Tables::AllocateArray(int count) {
   return reinterpret_cast<Type*>(AllocateBytes(sizeof(Type) * count));
 }
@@ -1206,7 +1201,7 @@
   return result;
 }
 
-template<typename Type>
+template <typename Type>
 Type* DescriptorPool::Tables::AllocateMessage(Type* /* dummy */) {
   Type* result = new Type;
   messages_.push_back(result);
@@ -1254,42 +1249,41 @@
 DescriptorPool::ErrorCollector::~ErrorCollector() {}
 
 DescriptorPool::DescriptorPool()
-  : mutex_(NULL),
-    fallback_database_(NULL),
-    default_error_collector_(NULL),
-    underlay_(NULL),
-    tables_(new Tables),
-    enforce_dependencies_(true),
-    lazily_build_dependencies_(false),
-    allow_unknown_(false),
-    enforce_weak_(false),
-    disallow_enforce_utf8_(false) {}
+    : mutex_(NULL),
+      fallback_database_(NULL),
+      default_error_collector_(NULL),
+      underlay_(NULL),
+      tables_(new Tables),
+      enforce_dependencies_(true),
+      lazily_build_dependencies_(false),
+      allow_unknown_(false),
+      enforce_weak_(false),
+      disallow_enforce_utf8_(false) {}
 
 DescriptorPool::DescriptorPool(DescriptorDatabase* fallback_database,
                                ErrorCollector* error_collector)
-  : mutex_(new internal::WrappedMutex),
-    fallback_database_(fallback_database),
-    default_error_collector_(error_collector),
-    underlay_(NULL),
-    tables_(new Tables),
-    enforce_dependencies_(true),
-    lazily_build_dependencies_(false),
-    allow_unknown_(false),
-    enforce_weak_(false),
-    disallow_enforce_utf8_(false) {
-}
+    : mutex_(new internal::WrappedMutex),
+      fallback_database_(fallback_database),
+      default_error_collector_(error_collector),
+      underlay_(NULL),
+      tables_(new Tables),
+      enforce_dependencies_(true),
+      lazily_build_dependencies_(false),
+      allow_unknown_(false),
+      enforce_weak_(false),
+      disallow_enforce_utf8_(false) {}
 
 DescriptorPool::DescriptorPool(const DescriptorPool* underlay)
-  : mutex_(NULL),
-    fallback_database_(NULL),
-    default_error_collector_(NULL),
-    underlay_(underlay),
-    tables_(new Tables),
-    enforce_dependencies_(true),
-    lazily_build_dependencies_(false),
-    allow_unknown_(false),
-    enforce_weak_(false),
-    disallow_enforce_utf8_(false) {}
+    : mutex_(NULL),
+      fallback_database_(NULL),
+      default_error_collector_(NULL),
+      underlay_(underlay),
+      tables_(new Tables),
+      enforce_dependencies_(true),
+      lazily_build_dependencies_(false),
+      allow_unknown_(false),
+      enforce_weak_(false),
+      disallow_enforce_utf8_(false) {}
 
 DescriptorPool::~DescriptorPool() {
   if (mutex_ != NULL) delete mutex_;
@@ -1411,7 +1405,7 @@
   if (!result.IsNull()) return result.GetFile();
   if (underlay_ != NULL) {
     const FileDescriptor* file_result =
-      underlay_->FindFileContainingSymbol(symbol_name);
+        underlay_->FindFileContainingSymbol(symbol_name);
     if (file_result != NULL) return file_result;
   }
   if (TryFindSymbolInFallbackDatabase(symbol_name)) {
@@ -1441,8 +1435,7 @@
 const FieldDescriptor* DescriptorPool::FindExtensionByName(
     const std::string& name) const {
   Symbol result = tables_->FindByNameHelper(this, name);
-  if (result.type == Symbol::FIELD &&
-      result.field_descriptor->is_extension()) {
+  if (result.type == Symbol::FIELD && result.field_descriptor->is_extension()) {
     return result.field_descriptor;
   } else {
     return NULL;
@@ -1464,8 +1457,8 @@
 const EnumValueDescriptor* DescriptorPool::FindEnumValueByName(
     const std::string& name) const {
   Symbol result = tables_->FindByNameHelper(this, name);
-  return (result.type == Symbol::ENUM_VALUE) ?
-    result.enum_value_descriptor : NULL;
+  return (result.type == Symbol::ENUM_VALUE) ? result.enum_value_descriptor
+                                             : NULL;
 }
 
 const ServiceDescriptor* DescriptorPool::FindServiceByName(
@@ -1548,10 +1541,8 @@
 
 // -------------------------------------------------------------------
 
-const FieldDescriptor*
-Descriptor::FindFieldByNumber(int key) const {
-  const FieldDescriptor* result =
-    file()->tables_->FindFieldByNumber(this, key);
+const FieldDescriptor* Descriptor::FindFieldByNumber(int key) const {
+  const FieldDescriptor* result = file()->tables_->FindFieldByNumber(this, key);
   if (result == NULL || result->is_extension()) {
     return NULL;
   } else {
@@ -1562,7 +1553,7 @@
 const FieldDescriptor* Descriptor::FindFieldByLowercaseName(
     const std::string& key) const {
   const FieldDescriptor* result =
-    file()->tables_->FindFieldByLowercaseName(this, key);
+      file()->tables_->FindFieldByLowercaseName(this, key);
   if (result == NULL || result->is_extension()) {
     return NULL;
   } else {
@@ -1573,7 +1564,7 @@
 const FieldDescriptor* Descriptor::FindFieldByCamelcaseName(
     const std::string& key) const {
   const FieldDescriptor* result =
-    file()->tables_->FindFieldByCamelcaseName(this, key);
+      file()->tables_->FindFieldByCamelcaseName(this, key);
   if (result == NULL || result->is_extension()) {
     return NULL;
   } else {
@@ -1584,7 +1575,7 @@
 const FieldDescriptor* Descriptor::FindFieldByName(
     const std::string& key) const {
   Symbol result =
-    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD);
+      file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD);
   if (!result.IsNull() && !result.field_descriptor->is_extension()) {
     return result.field_descriptor;
   } else {
@@ -1595,7 +1586,7 @@
 const OneofDescriptor* Descriptor::FindOneofByName(
     const std::string& key) const {
   Symbol result =
-    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ONEOF);
+      file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ONEOF);
   if (!result.IsNull()) {
     return result.oneof_descriptor;
   } else {
@@ -1606,7 +1597,7 @@
 const FieldDescriptor* Descriptor::FindExtensionByName(
     const std::string& key) const {
   Symbol result =
-    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD);
+      file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD);
   if (!result.IsNull() && result.field_descriptor->is_extension()) {
     return result.field_descriptor;
   } else {
@@ -1617,7 +1608,7 @@
 const FieldDescriptor* Descriptor::FindExtensionByLowercaseName(
     const std::string& key) const {
   const FieldDescriptor* result =
-    file()->tables_->FindFieldByLowercaseName(this, key);
+      file()->tables_->FindFieldByLowercaseName(this, key);
   if (result == NULL || !result->is_extension()) {
     return NULL;
   } else {
@@ -1628,7 +1619,7 @@
 const FieldDescriptor* Descriptor::FindExtensionByCamelcaseName(
     const std::string& key) const {
   const FieldDescriptor* result =
-    file()->tables_->FindFieldByCamelcaseName(this, key);
+      file()->tables_->FindFieldByCamelcaseName(this, key);
   if (result == NULL || !result->is_extension()) {
     return NULL;
   } else {
@@ -1639,7 +1630,7 @@
 const Descriptor* Descriptor::FindNestedTypeByName(
     const std::string& key) const {
   Symbol result =
-    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::MESSAGE);
+      file()->tables_->FindNestedSymbolOfType(this, key, Symbol::MESSAGE);
   if (!result.IsNull()) {
     return result.descriptor;
   } else {
@@ -1650,7 +1641,7 @@
 const EnumDescriptor* Descriptor::FindEnumTypeByName(
     const std::string& key) const {
   Symbol result =
-    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM);
+      file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM);
   if (!result.IsNull()) {
     return result.enum_descriptor;
   } else {
@@ -1661,7 +1652,7 @@
 const EnumValueDescriptor* Descriptor::FindEnumValueByName(
     const std::string& key) const {
   Symbol result =
-    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE);
+      file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE);
   if (!result.IsNull()) {
     return result.enum_value_descriptor;
   } else {
@@ -1672,7 +1663,7 @@
 const EnumValueDescriptor* EnumDescriptor::FindValueByName(
     const std::string& key) const {
   Symbol result =
-    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE);
+      file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE);
   if (!result.IsNull()) {
     return result.enum_value_descriptor;
   } else {
@@ -1680,20 +1671,19 @@
   }
 }
 
-const EnumValueDescriptor*
-EnumDescriptor::FindValueByNumber(int key) const {
+const EnumValueDescriptor* EnumDescriptor::FindValueByNumber(int key) const {
   return file()->tables_->FindEnumValueByNumber(this, key);
 }
 
-const EnumValueDescriptor*
-EnumDescriptor::FindValueByNumberCreatingIfUnknown(int key) const {
+const EnumValueDescriptor* EnumDescriptor::FindValueByNumberCreatingIfUnknown(
+    int key) const {
   return file()->tables_->FindEnumValueByNumberCreatingIfUnknown(this, key);
 }
 
 const MethodDescriptor* ServiceDescriptor::FindMethodByName(
     const std::string& key) const {
   Symbol result =
-    file()->tables_->FindNestedSymbolOfType(this, key, Symbol::METHOD);
+      file()->tables_->FindNestedSymbolOfType(this, key, Symbol::METHOD);
   if (!result.IsNull()) {
     return result.method_descriptor;
   } else {
@@ -1724,7 +1714,7 @@
 const EnumValueDescriptor* FileDescriptor::FindEnumValueByName(
     const std::string& key) const {
   Symbol result =
-    tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE);
+      tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE);
   if (!result.IsNull()) {
     return result.enum_value_descriptor;
   } else {
@@ -1787,19 +1777,18 @@
   // more than a couple extension ranges.
   for (int i = 0; i < extension_range_count(); i++) {
     if (number >= extension_range(i)->start &&
-        number <  extension_range(i)->end) {
+        number < extension_range(i)->end) {
       return extension_range(i);
     }
   }
   return NULL;
 }
 
-const Descriptor::ReservedRange*
-Descriptor::FindReservedRangeContainingNumber(int number) const {
+const Descriptor::ReservedRange* Descriptor::FindReservedRangeContainingNumber(
+    int number) const {
   // TODO(chrisn): Consider a non-linear search.
   for (int i = 0; i < reserved_range_count(); i++) {
-    if (number >= reserved_range(i)->start &&
-        number <  reserved_range(i)->end) {
+    if (number >= reserved_range(i)->start && number < reserved_range(i)->end) {
       return reserved_range(i);
     }
   }
@@ -1864,22 +1853,22 @@
   if (tables_->known_bad_symbols_.count(name) > 0) return false;
 
   FileDescriptorProto file_proto;
-  if (// We skip looking in the fallback database if the name is a sub-symbol
-      // of any descriptor that already exists in the descriptor pool (except
-      // for package descriptors).  This is valid because all symbols except
-      // for packages are defined in a single file, so if the symbol exists
-      // then we should already have its definition.
-      //
-      // The other reason to do this is to support "overriding" type
-      // definitions by merging two databases that define the same type.  (Yes,
-      // people do this.)  The main difficulty with making this work is that
-      // FindFileContainingSymbol() is allowed to return both false positives
-      // (e.g., SimpleDescriptorDatabase, UpgradedDescriptorDatabase) and false
-      // negatives (e.g. ProtoFileParser, SourceTreeDescriptorDatabase).
-      // When two such databases are merged, looking up a non-existent
-      // sub-symbol of a type that already exists in the descriptor pool can
-      // result in an attempt to load multiple definitions of the same type.
-      // The check below avoids this.
+  if (  // We skip looking in the fallback database if the name is a sub-symbol
+        // of any descriptor that already exists in the descriptor pool (except
+        // for package descriptors).  This is valid because all symbols except
+        // for packages are defined in a single file, so if the symbol exists
+        // then we should already have its definition.
+        //
+        // The other reason to do this is to support "overriding" type
+        // definitions by merging two databases that define the same type. (Yes,
+        // people do this.)  The main difficulty with making this work is that
+        // FindFileContainingSymbol() is allowed to return both false positives
+        // (e.g., SimpleDescriptorDatabase, UpgradedDescriptorDatabase) and
+        // false negatives (e.g. ProtoFileParser, SourceTreeDescriptorDatabase).
+        // When two such databases are merged, looking up a non-existent
+        // sub-symbol of a type that already exists in the descriptor pool can
+        // result in an attempt to load multiple definitions of the same type.
+        // The check below avoids this.
       IsSubSymbolOfBuiltType(name)
 
       // Look up file containing this symbol in fallback database.
@@ -1905,7 +1894,7 @@
 
   FileDescriptorProto file_proto;
   if (!fallback_database_->FindFileContainingExtension(
-        containing_type->full_name(), field_number, &file_proto)) {
+          containing_type->full_name(), field_number, &file_proto)) {
     return false;
   }
 
@@ -2241,8 +2230,8 @@
         std::string tmp;
         TextFormat::Printer printer;
         printer.SetInitialIndentLevel(depth + 1);
-        printer.PrintFieldValueToString(options, fields[i],
-                                        repeated ? j : -1, &tmp);
+        printer.PrintFieldValueToString(options, fields[i], repeated ? j : -1,
+                                        &tmp);
         fieldval.append("{\n");
         fieldval.append(tmp);
         fieldval.append(depth * 2, ' ');
@@ -2313,8 +2302,8 @@
   std::vector<std::string> all_options;
   if (RetrieveOptions(depth, options, pool, &all_options)) {
     for (int i = 0; i < all_options.size(); i++) {
-      strings::SubstituteAndAppend(output, "$0option $1;\n",
-                                   prefix, all_options[i]);
+      strings::SubstituteAndAppend(output, "$0option $1;\n", prefix,
+                                   all_options[i]);
     }
   }
   return !all_options.empty();
@@ -2328,8 +2317,8 @@
       : options_(options), prefix_(prefix) {
     // Perform the SourceLocation lookup only if we're including user comments,
     // because the lookup is fairly expensive.
-    have_source_loc_ = options.include_comments &&
-        desc->GetSourceLocation(&source_loc_);
+    have_source_loc_ =
+        options.include_comments && desc->GetSourceLocation(&source_loc_);
   }
   SourceLocationCommentPrinter(const FileDescriptor* file,
                                const std::vector<int>& path,
@@ -2338,13 +2327,13 @@
       : options_(options), prefix_(prefix) {
     // Perform the SourceLocation lookup only if we're including user comments,
     // because the lookup is fairly expensive.
-    have_source_loc_ = options.include_comments &&
-        file->GetSourceLocation(path, &source_loc_);
+    have_source_loc_ =
+        options.include_comments && file->GetSourceLocation(path, &source_loc_);
   }
   void AddPreComment(std::string* output) {
     if (have_source_loc_) {
       // Detached leading comments.
-      for (int i = 0 ; i < source_loc_.leading_detached_comments.size(); ++i) {
+      for (int i = 0; i < source_loc_.leading_detached_comments.size(); ++i) {
         *output += FormatComment(source_loc_.leading_detached_comments[i]);
         *output += "\n";
       }
@@ -2395,16 +2384,15 @@
   {
     std::vector<int> path;
     path.push_back(FileDescriptorProto::kSyntaxFieldNumber);
-    SourceLocationCommentPrinter syntax_comment(
-        this, path, "", debug_string_options);
+    SourceLocationCommentPrinter syntax_comment(this, path, "",
+                                                debug_string_options);
     syntax_comment.AddPreComment(&contents);
     strings::SubstituteAndAppend(&contents, "syntax = \"$0\";\n\n",
                                  SyntaxName(syntax()));
     syntax_comment.AddPostComment(&contents);
   }
 
-  SourceLocationCommentPrinter
-      comment_printer(this, "", debug_string_options);
+  SourceLocationCommentPrinter comment_printer(this, "", debug_string_options);
   comment_printer.AddPreComment(&contents);
 
   std::set<int> public_dependencies;
@@ -2430,8 +2418,8 @@
   if (!package().empty()) {
     std::vector<int> path;
     path.push_back(FileDescriptorProto::kPackageFieldNumber);
-    SourceLocationCommentPrinter package_comment(
-        this, path, "", debug_string_options);
+    SourceLocationCommentPrinter package_comment(this, path, "",
+                                                 debug_string_options);
     package_comment.AddPreComment(&contents);
     strings::SubstituteAndAppend(&contents, "package $0;\n\n", package());
     package_comment.AddPostComment(&contents);
@@ -2508,8 +2496,8 @@
   std::string prefix(depth * 2, ' ');
   ++depth;
 
-  SourceLocationCommentPrinter
-      comment_printer(this, prefix, debug_string_options);
+  SourceLocationCommentPrinter comment_printer(this, prefix,
+                                               debug_string_options);
   comment_printer.AddPreComment(contents);
 
   if (include_opening_clause) {
@@ -2555,8 +2543,7 @@
   }
 
   for (int i = 0; i < extension_range_count(); i++) {
-    strings::SubstituteAndAppend(contents, "$0  extensions $1 to $2;\n",
-                                 prefix,
+    strings::SubstituteAndAppend(contents, "$0  extensions $1 to $2;\n", prefix,
                                  extension_range(i)->start,
                                  extension_range(i)->end - 1);
   }
@@ -2567,12 +2554,11 @@
     if (extension(i)->containing_type() != containing_type) {
       if (i > 0) strings::SubstituteAndAppend(contents, "$0  }\n", prefix);
       containing_type = extension(i)->containing_type();
-      strings::SubstituteAndAppend(contents, "$0  extend .$1 {\n",
-                                   prefix, containing_type->full_name());
+      strings::SubstituteAndAppend(contents, "$0  extend .$1 {\n", prefix,
+                                   containing_type->full_name());
     }
-    extension(i)->DebugString(
-        depth + 1, FieldDescriptor::PRINT_LABEL, contents,
-        debug_string_options);
+    extension(i)->DebugString(depth + 1, FieldDescriptor::PRINT_LABEL, contents,
+                              debug_string_options);
   }
   if (extension_count() > 0)
     strings::SubstituteAndAppend(contents, "$0  }\n", prefix);
@@ -2584,8 +2570,8 @@
       if (range->end == range->start + 1) {
         strings::SubstituteAndAppend(contents, "$0, ", range->start);
       } else {
-        strings::SubstituteAndAppend(contents, "$0 to $1, ",
-                                     range->start, range->end - 1);
+        strings::SubstituteAndAppend(contents, "$0 to $1, ", range->start,
+                                     range->end - 1);
       }
     }
     contents->replace(contents->size() - 2, 2, ";\n");
@@ -2627,7 +2613,7 @@
 
 // The field type string used in FieldDescriptor::DebugString()
 std::string FieldDescriptor::FieldTypeNameDebugString() const {
-  switch(type()) {
+  switch (type()) {
     case TYPE_MESSAGE:
       return "." + message_type()->full_name();
     case TYPE_ENUM:
@@ -2669,17 +2655,13 @@
     label.push_back(' ');
   }
 
-  SourceLocationCommentPrinter
-      comment_printer(this, prefix, debug_string_options);
+  SourceLocationCommentPrinter comment_printer(this, prefix,
+                                               debug_string_options);
   comment_printer.AddPreComment(contents);
 
-  strings::SubstituteAndAppend(contents, "$0$1$2 $3 = $4",
-                               prefix,
-                               label,
-                               field_type,
-                               type() == TYPE_GROUP ? message_type()->name() :
-                                                      name(),
-                               number());
+  strings::SubstituteAndAppend(
+      contents, "$0$1$2 $3 = $4", prefix, label, field_type,
+      type() == TYPE_GROUP ? message_type()->name() : name(), number());
 
   bool bracketed = false;
   if (has_default_value()) {
@@ -2742,8 +2724,8 @@
     const DebugStringOptions& debug_string_options) const {
   std::string prefix(depth * 2, ' ');
   ++depth;
-  SourceLocationCommentPrinter
-      comment_printer(this, prefix, debug_string_options);
+  SourceLocationCommentPrinter comment_printer(this, prefix,
+                                               debug_string_options);
   comment_printer.AddPreComment(contents);
   strings::SubstituteAndAppend(contents, "$0oneof $1 {", prefix, name());
 
@@ -2781,12 +2763,11 @@
   std::string prefix(depth * 2, ' ');
   ++depth;
 
-  SourceLocationCommentPrinter
-      comment_printer(this, prefix, debug_string_options);
+  SourceLocationCommentPrinter comment_printer(this, prefix,
+                                               debug_string_options);
   comment_printer.AddPreComment(contents);
 
-  strings::SubstituteAndAppend(contents, "$0enum $1 {\n",
-                               prefix, name());
+  strings::SubstituteAndAppend(contents, "$0enum $1 {\n", prefix, name());
 
   FormatLineOptions(depth, options(), file()->pool(), contents);
 
@@ -2801,8 +2782,8 @@
       if (range->end == range->start) {
         strings::SubstituteAndAppend(contents, "$0, ", range->start);
       } else {
-        strings::SubstituteAndAppend(contents, "$0 to $1, ",
-                                     range->start, range->end);
+        strings::SubstituteAndAppend(contents, "$0 to $1, ", range->start,
+                                     range->end);
       }
     }
     contents->replace(contents->size() - 2, 2, ";\n");
@@ -2839,12 +2820,11 @@
     const DebugStringOptions& debug_string_options) const {
   std::string prefix(depth * 2, ' ');
 
-  SourceLocationCommentPrinter
-      comment_printer(this, prefix, debug_string_options);
+  SourceLocationCommentPrinter comment_printer(this, prefix,
+                                               debug_string_options);
   comment_printer.AddPreComment(contents);
 
-  strings::SubstituteAndAppend(contents, "$0$1 = $2",
-                               prefix, name(), number());
+  strings::SubstituteAndAppend(contents, "$0$1 = $2", prefix, name(), number());
 
   std::string formatted_options;
   if (FormatBracketedOptions(depth, options(), type()->file()->pool(),
@@ -2871,8 +2851,8 @@
 void ServiceDescriptor::DebugString(
     std::string* contents,
     const DebugStringOptions& debug_string_options) const {
-  SourceLocationCommentPrinter
-      comment_printer(this, /* prefix */ "", debug_string_options);
+  SourceLocationCommentPrinter comment_printer(this, /* prefix */ "",
+                                               debug_string_options);
   comment_printer.AddPreComment(contents);
 
   strings::SubstituteAndAppend(contents, "service $0 {\n", name());
@@ -2906,22 +2886,20 @@
   std::string prefix(depth * 2, ' ');
   ++depth;
 
-  SourceLocationCommentPrinter
-      comment_printer(this, prefix, debug_string_options);
+  SourceLocationCommentPrinter comment_printer(this, prefix,
+                                               debug_string_options);
   comment_printer.AddPreComment(contents);
 
-  strings::SubstituteAndAppend(contents, "$0rpc $1($4.$2) returns ($5.$3)",
-                               prefix, name(),
-                               input_type()->full_name(),
-                               output_type()->full_name(),
-                               client_streaming() ? "stream " : "",
-                               server_streaming() ? "stream " : "");
+  strings::SubstituteAndAppend(
+      contents, "$0rpc $1($4.$2) returns ($5.$3)", prefix, name(),
+      input_type()->full_name(), output_type()->full_name(),
+      client_streaming() ? "stream " : "", server_streaming() ? "stream " : "");
 
   std::string formatted_options;
   if (FormatLineOptions(depth, options(), service()->file()->pool(),
                         &formatted_options)) {
-    strings::SubstituteAndAppend(contents, " {\n$0$1}\n",
-                                 formatted_options, prefix);
+    strings::SubstituteAndAppend(contents, " {\n$0$1}\n", formatted_options,
+                                 prefix);
   } else {
     contents->append(";\n");
   }
@@ -2937,13 +2915,13 @@
   GOOGLE_CHECK(out_location != nullptr);
   if (source_code_info_) {
     if (const SourceCodeInfo_Location* loc =
-        tables_->GetSourceLocation(path, source_code_info_)) {
+            tables_->GetSourceLocation(path, source_code_info_)) {
       const RepeatedField<int32>& span = loc->span();
       if (span.size() == 3 || span.size() == 4) {
-        out_location->start_line   = span.Get(0);
+        out_location->start_line = span.Get(0);
         out_location->start_column = span.Get(1);
-        out_location->end_line     = span.Get(span.size() == 3 ? 0 : 2);
-        out_location->end_column   = span.Get(span.size() - 1);
+        out_location->end_line = span.Get(span.size() == 3 ? 0 : 2);
+        out_location->end_column = span.Get(span.size() - 1);
 
         out_location->leading_comments = loc->leading_comments();
         out_location->trailing_comments = loc->trailing_comments();
@@ -3105,8 +3083,7 @@
 
 class DescriptorBuilder {
  public:
-  DescriptorBuilder(const DescriptorPool* pool,
-                    DescriptorPool::Tables* tables,
+  DescriptorBuilder(const DescriptorPool* pool, DescriptorPool::Tables* tables,
                     DescriptorPool::ErrorCollector* error_collector);
   ~DescriptorBuilder();
 
@@ -3212,9 +3189,7 @@
   // that LookupSymbol may still return a non-type symbol in LOOKUP_TYPES mode,
   // if it believes that's all it could refer to.  The caller should always
   // check that it receives the type of symbol it was expecting.
-  enum ResolveMode {
-    LOOKUP_ALL, LOOKUP_TYPES
-  };
+  enum ResolveMode { LOOKUP_ALL, LOOKUP_TYPES };
   Symbol LookupSymbol(const std::string& name, const std::string& relative_to,
                       DescriptorPool::PlaceholderType placeholder_type =
                           DescriptorPool::PLACEHOLDER_MESSAGE,
@@ -3274,49 +3249,41 @@
 
   // These methods all have the same signature for the sake of the BUILD_ARRAY
   // macro, below.
-  void BuildMessage(const DescriptorProto& proto,
-                    const Descriptor* parent,
+  void BuildMessage(const DescriptorProto& proto, const Descriptor* parent,
                     Descriptor* result);
   void BuildFieldOrExtension(const FieldDescriptorProto& proto,
-                             const Descriptor* parent,
-                             FieldDescriptor* result,
+                             const Descriptor* parent, FieldDescriptor* result,
                              bool is_extension);
-  void BuildField(const FieldDescriptorProto& proto,
-                  const Descriptor* parent,
+  void BuildField(const FieldDescriptorProto& proto, const Descriptor* parent,
                   FieldDescriptor* result) {
     BuildFieldOrExtension(proto, parent, result, false);
   }
   void BuildExtension(const FieldDescriptorProto& proto,
-                      const Descriptor* parent,
-                      FieldDescriptor* result) {
+                      const Descriptor* parent, FieldDescriptor* result) {
     BuildFieldOrExtension(proto, parent, result, true);
   }
   void BuildExtensionRange(const DescriptorProto::ExtensionRange& proto,
                            const Descriptor* parent,
                            Descriptor::ExtensionRange* result);
   void BuildReservedRange(const DescriptorProto::ReservedRange& proto,
-                           const Descriptor* parent,
-                           Descriptor::ReservedRange* result);
+                          const Descriptor* parent,
+                          Descriptor::ReservedRange* result);
   void BuildReservedRange(const EnumDescriptorProto::EnumReservedRange& proto,
                           const EnumDescriptor* parent,
                           EnumDescriptor::ReservedRange* result);
-  void BuildOneof(const OneofDescriptorProto& proto,
-                  Descriptor* parent,
+  void BuildOneof(const OneofDescriptorProto& proto, Descriptor* parent,
                   OneofDescriptor* result);
   void CheckEnumValueUniqueness(const EnumDescriptorProto& proto,
                                 const EnumDescriptor* result);
-  void BuildEnum(const EnumDescriptorProto& proto,
-                 const Descriptor* parent,
+  void BuildEnum(const EnumDescriptorProto& proto, const Descriptor* parent,
                  EnumDescriptor* result);
   void BuildEnumValue(const EnumValueDescriptorProto& proto,
                       const EnumDescriptor* parent,
                       EnumValueDescriptor* result);
-  void BuildService(const ServiceDescriptorProto& proto,
-                    const void* dummy,
+  void BuildService(const ServiceDescriptorProto& proto, const void* dummy,
                     ServiceDescriptor* result);
   void BuildMethod(const MethodDescriptorProto& proto,
-                   const ServiceDescriptor* parent,
-                   MethodDescriptor* result);
+                   const ServiceDescriptor* parent, MethodDescriptor* result);
 
   void LogUnusedDependency(const FileDescriptorProto& proto,
                            const FileDescriptor* result);
@@ -3512,10 +3479,8 @@
                               const ServiceDescriptorProto& proto);
   void ValidateMethodOptions(MethodDescriptor* method,
                              const MethodDescriptorProto& proto);
-  void ValidateProto3(FileDescriptor* file,
-                      const FileDescriptorProto& proto);
-  void ValidateProto3Message(Descriptor* message,
-                             const DescriptorProto& proto);
+  void ValidateProto3(FileDescriptor* file, const FileDescriptorProto& proto);
+  void ValidateProto3Message(Descriptor* message, const DescriptorProto& proto);
   void ValidateProto3Field(FieldDescriptor* field,
                            const FieldDescriptorProto& proto);
   void ValidateProto3Enum(EnumDescriptor* enm,
@@ -3538,27 +3503,26 @@
 const FileDescriptor* DescriptorPool::BuildFile(
     const FileDescriptorProto& proto) {
   GOOGLE_CHECK(fallback_database_ == NULL)
-    << "Cannot call BuildFile on a DescriptorPool that uses a "
-       "DescriptorDatabase.  You must instead find a way to get your file "
-       "into the underlying database.";
-  GOOGLE_CHECK(mutex_ == NULL);   // Implied by the above GOOGLE_CHECK.
+      << "Cannot call BuildFile on a DescriptorPool that uses a "
+         "DescriptorDatabase.  You must instead find a way to get your file "
+         "into the underlying database.";
+  GOOGLE_CHECK(mutex_ == NULL);  // Implied by the above GOOGLE_CHECK.
   tables_->known_bad_symbols_.clear();
   tables_->known_bad_files_.clear();
   return DescriptorBuilder(this, tables_.get(), NULL).BuildFile(proto);
 }
 
 const FileDescriptor* DescriptorPool::BuildFileCollectingErrors(
-    const FileDescriptorProto& proto,
-    ErrorCollector* error_collector) {
+    const FileDescriptorProto& proto, ErrorCollector* error_collector) {
   GOOGLE_CHECK(fallback_database_ == NULL)
-    << "Cannot call BuildFile on a DescriptorPool that uses a "
-       "DescriptorDatabase.  You must instead find a way to get your file "
-       "into the underlying database.";
-  GOOGLE_CHECK(mutex_ == NULL);   // Implied by the above GOOGLE_CHECK.
+      << "Cannot call BuildFile on a DescriptorPool that uses a "
+         "DescriptorDatabase.  You must instead find a way to get your file "
+         "into the underlying database.";
+  GOOGLE_CHECK(mutex_ == NULL);  // Implied by the above GOOGLE_CHECK.
   tables_->known_bad_symbols_.clear();
   tables_->known_bad_files_.clear();
-  return DescriptorBuilder(this, tables_.get(),
-                           error_collector).BuildFile(proto);
+  return DescriptorBuilder(this, tables_.get(), error_collector)
+      .BuildFile(proto);
 }
 
 const FileDescriptor* DescriptorPool::BuildFileFromDatabase(
@@ -3568,8 +3532,8 @@
     return NULL;
   }
   const FileDescriptor* result =
-      DescriptorBuilder(this, tables_.get(),
-                        default_error_collector_).BuildFile(proto);
+      DescriptorBuilder(this, tables_.get(), default_error_collector_)
+          .BuildFile(proto);
   if (result == NULL) {
     tables_->known_bad_files_.insert(proto.name());
   }
@@ -3577,15 +3541,14 @@
 }
 
 DescriptorBuilder::DescriptorBuilder(
-    const DescriptorPool* pool,
-    DescriptorPool::Tables* tables,
+    const DescriptorPool* pool, DescriptorPool::Tables* tables,
     DescriptorPool::ErrorCollector* error_collector)
-  : pool_(pool),
-    tables_(tables),
-    error_collector_(error_collector),
-    had_errors_(false),
-    possible_undeclared_dependency_(NULL),
-    undefine_resolved_name_("") {}
+    : pool_(pool),
+      tables_(tables),
+      error_collector_(error_collector),
+      had_errors_(false),
+      possible_undeclared_dependency_(NULL),
+      undefine_resolved_name_("") {}
 
 DescriptorBuilder::~DescriptorBuilder() {}
 
@@ -3600,8 +3563,8 @@
     }
     GOOGLE_LOG(ERROR) << "  " << element_name << ": " << error;
   } else {
-    error_collector_->AddError(filename_, element_name,
-                               &descriptor, location, error);
+    error_collector_->AddError(filename_, element_name, &descriptor, location,
+                               error);
   }
   had_errors_ = true;
 }
@@ -3624,19 +3587,22 @@
     if (possible_undeclared_dependency_ != NULL) {
       AddError(element_name, descriptor, location,
                "\"" + possible_undeclared_dependency_name_ +
-               "\" seems to be defined in \"" +
-               possible_undeclared_dependency_->name() + "\", which is not "
-               "imported by \"" + filename_ + "\".  To use it here, please "
-               "add the necessary import.");
+                   "\" seems to be defined in \"" +
+                   possible_undeclared_dependency_->name() +
+                   "\", which is not "
+                   "imported by \"" +
+                   filename_ +
+                   "\".  To use it here, please "
+                   "add the necessary import.");
     }
     if (!undefine_resolved_name_.empty()) {
       AddError(element_name, descriptor, location,
                "\"" + undefined_symbol + "\" is resolved to \"" +
-               undefine_resolved_name_ + "\", which is not defined. "
-               "The innermost scope is searched first in name resolution. "
-               "Consider using a leading '.'(i.e., \"."
-               + undefined_symbol +
-               "\") to start from the outermost scope.");
+                   undefine_resolved_name_ +
+                   "\", which is not defined. "
+                   "The innermost scope is searched first in name resolution. "
+                   "Consider using a leading '.'(i.e., \"." +
+                   undefined_symbol + "\") to start from the outermost scope.");
     }
   }
 }
@@ -3875,10 +3841,10 @@
 
   std::string::size_type dotpos = placeholder_full_name->find_last_of('.');
   if (dotpos != std::string::npos) {
-    placeholder_package = tables_->AllocateString(
-      placeholder_full_name->substr(0, dotpos));
-    placeholder_name = tables_->AllocateString(
-      placeholder_full_name->substr(dotpos + 1));
+    placeholder_package =
+        tables_->AllocateString(placeholder_full_name->substr(0, dotpos));
+    placeholder_name =
+        tables_->AllocateString(placeholder_full_name->substr(dotpos + 1));
   } else {
     placeholder_package = &internal::GetEmptyString();
     placeholder_name = placeholder_full_name;
@@ -3891,8 +3857,7 @@
 
   if (placeholder_type == PLACEHOLDER_ENUM) {
     placeholder_file->enum_type_count_ = 1;
-    placeholder_file->enum_types_ =
-      tables_->AllocateArray<EnumDescriptor>(1);
+    placeholder_file->enum_types_ = tables_->AllocateArray<EnumDescriptor>(1);
 
     EnumDescriptor* placeholder_enum = &placeholder_file->enum_types_[0];
     memset(placeholder_enum, 0, sizeof(*placeholder_enum));
@@ -3914,8 +3879,10 @@
     placeholder_value->name_ = tables_->AllocateString("PLACEHOLDER_VALUE");
     // Note that enum value names are siblings of their type, not children.
     placeholder_value->full_name_ =
-      placeholder_package->empty() ? placeholder_value->name_ :
-        tables_->AllocateString(*placeholder_package + ".PLACEHOLDER_VALUE");
+        placeholder_package->empty()
+            ? placeholder_value->name_
+            : tables_->AllocateString(*placeholder_package +
+                                      ".PLACEHOLDER_VALUE");
 
     placeholder_value->number_ = 0;
     placeholder_value->type_ = placeholder_enum;
@@ -3924,8 +3891,7 @@
     return Symbol(placeholder_enum);
   } else {
     placeholder_file->message_type_count_ = 1;
-    placeholder_file->message_types_ =
-      tables_->AllocateArray<Descriptor>(1);
+    placeholder_file->message_types_ = tables_->AllocateArray<Descriptor>(1);
 
     Descriptor* placeholder_message = &placeholder_file->message_types_[0];
     memset(placeholder_message, 0, sizeof(*placeholder_message));
@@ -3940,11 +3906,11 @@
     if (placeholder_type == PLACEHOLDER_EXTENDABLE_MESSAGE) {
       placeholder_message->extension_range_count_ = 1;
       placeholder_message->extension_ranges_ =
-        tables_->AllocateArray<Descriptor::ExtensionRange>(1);
+          tables_->AllocateArray<Descriptor::ExtensionRange>(1);
       placeholder_message->extension_ranges_->start = 1;
       // kMaxNumber + 1 because ExtensionRange::end is exclusive.
       placeholder_message->extension_ranges_->end =
-        FieldDescriptor::kMaxNumber + 1;
+          FieldDescriptor::kMaxNumber + 1;
     }
 
     return Symbol(placeholder_message);
@@ -3991,7 +3957,8 @@
       // This is only possible if there was already an error adding something of
       // the same name.
       if (!had_errors_) {
-        GOOGLE_LOG(DFATAL) << "\"" << full_name << "\" not previously defined in "
+        GOOGLE_LOG(DFATAL) << "\"" << full_name
+                    << "\" not previously defined in "
                        "symbols_by_name_, but was defined in "
                        "symbols_by_parent_; this shouldn't be possible.";
       }
@@ -4008,14 +3975,14 @@
       } else {
         AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME,
                  "\"" + full_name.substr(dot_pos + 1) +
-                 "\" is already defined in \"" +
-                 full_name.substr(0, dot_pos) + "\".");
+                     "\" is already defined in \"" +
+                     full_name.substr(0, dot_pos) + "\".");
       }
     } else {
       // Symbol seems to have been defined in a different file.
       AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME,
                "\"" + full_name + "\" is already defined in file \"" +
-               other_file->name() + "\".");
+                   other_file->name() + "\".");
     }
     return false;
   }
@@ -4043,9 +4010,10 @@
     if (existing_symbol.type != Symbol::PACKAGE) {
       // Symbol seems to have been defined in a different file.
       AddError(name, proto, DescriptorPool::ErrorCollector::NAME,
-               "\"" + name + "\" is already defined (as something other than "
-               "a package) in file \"" + existing_symbol.GetFile()->name() +
-               "\".");
+               "\"" + name +
+                   "\" is already defined (as something other than "
+                   "a package) in file \"" +
+                   existing_symbol.GetFile()->name() + "\".");
     }
   }
 }
@@ -4061,8 +4029,7 @@
       // I don't trust isalnum() due to locales.  :(
       if ((name[i] < 'a' || 'z' < name[i]) &&
           (name[i] < 'A' || 'Z' < name[i]) &&
-          (name[i] < '0' || '9' < name[i]) &&
-          (name[i] != '_')) {
+          (name[i] < '0' || '9' < name[i]) && (name[i] != '_')) {
         AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME,
                  "\"" + name + "\" is not a valid identifier.");
       }
@@ -4136,11 +4103,11 @@
 
 // A common pattern:  We want to convert a repeated field in the descriptor
 // to an array of values, calling some method to build each value.
-#define BUILD_ARRAY(INPUT, OUTPUT, NAME, METHOD, PARENT)             \
-  OUTPUT->NAME##_count_ = INPUT.NAME##_size();                       \
-  AllocateArray(INPUT.NAME##_size(), &OUTPUT->NAME##s_);             \
-  for (int i = 0; i < INPUT.NAME##_size(); i++) {                    \
-    METHOD(INPUT.NAME(i), PARENT, OUTPUT->NAME##s_ + i);             \
+#define BUILD_ARRAY(INPUT, OUTPUT, NAME, METHOD, PARENT) \
+  OUTPUT->NAME##_count_ = INPUT.NAME##_size();           \
+  AllocateArray(INPUT.NAME##_size(), &OUTPUT->NAME##s_); \
+  for (int i = 0; i < INPUT.NAME##_size(); i++) {        \
+    METHOD(INPUT.NAME(i), PARENT, OUTPUT->NAME##s_ + i); \
   }
 
 void DescriptorBuilder::AddRecursiveImportError(
@@ -4152,13 +4119,19 @@
   }
   error_message.append(proto.name());
 
-  AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER,
-           error_message);
+  if (from_here < tables_->pending_files_.size() - 1) {
+    AddError(tables_->pending_files_[from_here + 1], proto,
+             DescriptorPool::ErrorCollector::IMPORT, error_message);
+  } else {
+    AddError(proto.name(), proto, DescriptorPool::ErrorCollector::IMPORT,
+             error_message);
+  }
 }
 
 void DescriptorBuilder::AddTwiceListedError(const FileDescriptorProto& proto,
                                             int index) {
-  AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER,
+  AddError(proto.dependency(index), proto,
+           DescriptorPool::ErrorCollector::IMPORT,
            "Import \"" + proto.dependency(index) + "\" was listed twice.");
 }
 
@@ -4166,13 +4139,13 @@
                                        int index) {
   std::string message;
   if (pool_->fallback_database_ == NULL) {
-    message = "Import \"" + proto.dependency(index) +
-              "\" has not been loaded.";
+    message = "Import \"" + proto.dependency(index) + "\" has not been loaded.";
   } else {
     message = "Import \"" + proto.dependency(index) +
               "\" was not found or had errors.";
   }
-  AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, message);
+  AddError(proto.dependency(index), proto,
+           DescriptorPool::ErrorCollector::IMPORT, message);
 }
 
 static bool ExistingFileMatchesProto(const FileDescriptor* existing_file,
@@ -4389,8 +4362,8 @@
 
   // Check public dependencies.
   int public_dependency_count = 0;
-  result->public_dependencies_ = tables_->AllocateArray<int>(
-      proto.public_dependency_size());
+  result->public_dependencies_ =
+      tables_->AllocateArray<int>(proto.public_dependency_size());
   for (int i = 0; i < proto.public_dependency_size(); i++) {
     // Only put valid public dependency indexes.
     int index = proto.public_dependency(i);
@@ -4404,8 +4377,7 @@
         unused_dependency_.erase(result->dependency(index));
       }
     } else {
-      AddError(proto.name(), proto,
-               DescriptorPool::ErrorCollector::OTHER,
+      AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER,
                "Invalid public dependency index.");
     }
   }
@@ -4424,25 +4396,24 @@
 
   // Check weak dependencies.
   int weak_dependency_count = 0;
-  result->weak_dependencies_ = tables_->AllocateArray<int>(
-      proto.weak_dependency_size());
+  result->weak_dependencies_ =
+      tables_->AllocateArray<int>(proto.weak_dependency_size());
   for (int i = 0; i < proto.weak_dependency_size(); i++) {
     int index = proto.weak_dependency(i);
     if (index >= 0 && index < proto.dependency_size()) {
       result->weak_dependencies_[weak_dependency_count++] = index;
     } else {
-      AddError(proto.name(), proto,
-               DescriptorPool::ErrorCollector::OTHER,
+      AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER,
                "Invalid weak dependency index.");
     }
   }
   result->weak_dependency_count_ = weak_dependency_count;
 
   // Convert children.
-  BUILD_ARRAY(proto, result, message_type, BuildMessage  , NULL);
-  BUILD_ARRAY(proto, result, enum_type   , BuildEnum     , NULL);
-  BUILD_ARRAY(proto, result, service     , BuildService  , NULL);
-  BUILD_ARRAY(proto, result, extension   , BuildExtension, NULL);
+  BUILD_ARRAY(proto, result, message_type, BuildMessage, NULL);
+  BUILD_ARRAY(proto, result, enum_type, BuildEnum, NULL);
+  BUILD_ARRAY(proto, result, service, BuildService, NULL);
+  BUILD_ARRAY(proto, result, extension, BuildExtension, NULL);
 
   // Copy options.
   if (!proto.has_options()) {
@@ -4512,21 +4483,21 @@
 
   ValidateSymbolName(proto.name(), *full_name, proto);
 
-  result->name_            = tables_->AllocateString(proto.name());
-  result->full_name_       = full_name;
-  result->file_            = file_;
+  result->name_ = tables_->AllocateString(proto.name());
+  result->full_name_ = full_name;
+  result->file_ = file_;
   result->containing_type_ = parent;
-  result->is_placeholder_  = false;
+  result->is_placeholder_ = false;
   result->is_unqualified_placeholder_ = false;
 
   // Build oneofs first so that fields and extension ranges can refer to them.
-  BUILD_ARRAY(proto, result, oneof_decl     , BuildOneof         , result);
-  BUILD_ARRAY(proto, result, field          , BuildField         , result);
-  BUILD_ARRAY(proto, result, nested_type    , BuildMessage       , result);
-  BUILD_ARRAY(proto, result, enum_type      , BuildEnum          , result);
+  BUILD_ARRAY(proto, result, oneof_decl, BuildOneof, result);
+  BUILD_ARRAY(proto, result, field, BuildField, result);
+  BUILD_ARRAY(proto, result, nested_type, BuildMessage, result);
+  BUILD_ARRAY(proto, result, enum_type, BuildEnum, result);
   BUILD_ARRAY(proto, result, extension_range, BuildExtensionRange, result);
-  BUILD_ARRAY(proto, result, extension      , BuildExtension     , result);
-  BUILD_ARRAY(proto, result, reserved_range , BuildReservedRange , result);
+  BUILD_ARRAY(proto, result, extension, BuildExtension, result);
+  BUILD_ARRAY(proto, result, reserved_range, BuildReservedRange, result);
 
   // Copy reserved names.
   int reserved_name_count = proto.reserved_name_size();
@@ -4546,8 +4517,7 @@
                     DescriptorProto::kOptionsFieldNumber);
   }
 
-  AddSymbol(result->full_name(), parent, result->name(),
-            proto, Symbol(result));
+  AddSymbol(result->full_name(), parent, result->name(), proto, Symbol(result));
 
 
   for (int i = 0; i < proto.reserved_range_size(); i++) {
@@ -4573,8 +4543,7 @@
     } else {
       AddError(name, proto, DescriptorPool::ErrorCollector::NAME,
                strings::Substitute(
-                 "Field name \"$0\" is reserved multiple times.",
-                 name));
+                   "Field name \"$0\" is reserved multiple times.", name));
     }
   }
 
@@ -4583,12 +4552,12 @@
     for (int j = 0; j < result->extension_range_count(); j++) {
       const Descriptor::ExtensionRange* range = result->extension_range(j);
       if (range->start <= field->number() && field->number() < range->end) {
-        AddError(field->full_name(), proto.extension_range(j),
-                 DescriptorPool::ErrorCollector::NUMBER,
-                 strings::Substitute(
-                   "Extension range $0 to $1 includes field \"$2\" ($3).",
-                   range->start, range->end - 1,
-                   field->name(), field->number()));
+        AddError(
+            field->full_name(), proto.extension_range(j),
+            DescriptorPool::ErrorCollector::NUMBER,
+            strings::Substitute(
+                "Extension range $0 to $1 includes field \"$2\" ($3).",
+                range->start, range->end - 1, field->name(), field->number()));
       }
     }
     for (int j = 0; j < result->reserved_range_count(); j++) {
@@ -4596,16 +4565,15 @@
       if (range->start <= field->number() && field->number() < range->end) {
         AddError(field->full_name(), proto.reserved_range(j),
                  DescriptorPool::ErrorCollector::NUMBER,
-                 strings::Substitute(
-                   "Field \"$0\" uses reserved number $1.",
-                   field->name(), field->number()));
+                 strings::Substitute("Field \"$0\" uses reserved number $1.",
+                                     field->name(), field->number()));
       }
     }
     if (reserved_name_set.find(field->name()) != reserved_name_set.end()) {
-      AddError(field->full_name(), proto.field(i),
-               DescriptorPool::ErrorCollector::NAME,
-               strings::Substitute(
-                 "Field name \"$0\" is reserved.", field->name()));
+      AddError(
+          field->full_name(), proto.field(i),
+          DescriptorPool::ErrorCollector::NAME,
+          strings::Substitute("Field name \"$0\" is reserved.", field->name()));
     }
   }
 
@@ -4650,10 +4618,10 @@
 
   ValidateSymbolName(proto.name(), *full_name, proto);
 
-  result->name_         = tables_->AllocateString(proto.name());
-  result->full_name_    = full_name;
-  result->file_         = file_;
-  result->number_       = proto.number();
+  result->name_ = tables_->AllocateString(proto.name());
+  result->full_name_ = full_name;
+  result->file_ = file_;
+  result->number_ = proto.number();
   result->is_extension_ = is_extension;
 
   // If .proto files follow the style guide then the name should already be
@@ -4725,19 +4693,19 @@
       switch (result->cpp_type()) {
         case FieldDescriptor::CPPTYPE_INT32:
           result->default_value_int32_ =
-            strtol(proto.default_value().c_str(), &end_pos, 0);
+              strtol(proto.default_value().c_str(), &end_pos, 0);
           break;
         case FieldDescriptor::CPPTYPE_INT64:
           result->default_value_int64_ =
-            strto64(proto.default_value().c_str(), &end_pos, 0);
+              strto64(proto.default_value().c_str(), &end_pos, 0);
           break;
         case FieldDescriptor::CPPTYPE_UINT32:
           result->default_value_uint32_ =
-            strtoul(proto.default_value().c_str(), &end_pos, 0);
+              strtoul(proto.default_value().c_str(), &end_pos, 0);
           break;
         case FieldDescriptor::CPPTYPE_UINT64:
           result->default_value_uint64_ =
-            strtou64(proto.default_value().c_str(), &end_pos, 0);
+              strtou64(proto.default_value().c_str(), &end_pos, 0);
           break;
         case FieldDescriptor::CPPTYPE_FLOAT:
           if (proto.default_value() == "inf") {
@@ -4749,7 +4717,7 @@
           } else if (proto.default_value() == "nan") {
             result->default_value_float_ =
                 std::numeric_limits<float>::quiet_NaN();
-          } else  {
+          } else {
             result->default_value_float_ = io::SafeDoubleToFloat(
                 io::NoLocaleStrtod(proto.default_value().c_str(), &end_pos));
           }
@@ -4764,7 +4732,7 @@
           } else if (proto.default_value() == "nan") {
             result->default_value_double_ =
                 std::numeric_limits<double>::quiet_NaN();
-          } else  {
+          } else {
             result->default_value_double_ =
                 io::NoLocaleStrtod(proto.default_value().c_str(), &end_pos);
           }
@@ -4787,7 +4755,7 @@
         case FieldDescriptor::CPPTYPE_STRING:
           if (result->type() == FieldDescriptor::TYPE_BYTES) {
             result->default_value_string_ = tables_->AllocateString(
-              UnescapeCEscapeString(proto.default_value()));
+                UnescapeCEscapeString(proto.default_value()));
           } else {
             result->default_value_string_ =
                 tables_->AllocateString(proto.default_value());
@@ -4809,7 +4777,7 @@
           AddError(result->full_name(), proto,
                    DescriptorPool::ErrorCollector::DEFAULT_VALUE,
                    "Couldn't parse default value \"" + proto.default_value() +
-                   "\".");
+                       "\".");
         }
       }
     } else {
@@ -4868,10 +4836,10 @@
              result->number() <= FieldDescriptor::kLastReservedNumber) {
     AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER,
              strings::Substitute(
-               "Field numbers $0 through $1 are reserved for the protocol "
-               "buffer library implementation.",
-               FieldDescriptor::kFirstReservedNumber,
-               FieldDescriptor::kLastReservedNumber));
+                 "Field numbers $0 through $1 are reserved for the protocol "
+                 "buffer library implementation.",
+                 FieldDescriptor::kFirstReservedNumber,
+                 FieldDescriptor::kLastReservedNumber));
   }
 
   if (is_extension) {
@@ -4884,8 +4852,7 @@
     result->extension_scope_ = parent;
 
     if (proto.has_oneof_index()) {
-      AddError(result->full_name(), proto,
-               DescriptorPool::ErrorCollector::OTHER,
+      AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
                "FieldDescriptorProto.oneof_index should not be set for "
                "extensions.");
     }
@@ -4905,11 +4872,10 @@
       if (proto.oneof_index() < 0 ||
           proto.oneof_index() >= parent->oneof_decl_count()) {
         AddError(result->full_name(), proto,
-                 DescriptorPool::ErrorCollector::OTHER,
+                 DescriptorPool::ErrorCollector::TYPE,
                  strings::Substitute("FieldDescriptorProto.oneof_index $0 is "
                                      "out of range for type \"$1\".",
-                                     proto.oneof_index(),
-                                     parent->name()));
+                                     proto.oneof_index(), parent->name()));
         result->containing_oneof_ = NULL;
       } else {
         result->containing_oneof_ = parent->oneof_decl(proto.oneof_index());
@@ -4928,19 +4894,16 @@
   }
 
 
-  AddSymbol(result->full_name(), parent, result->name(),
-            proto, Symbol(result));
+  AddSymbol(result->full_name(), parent, result->name(), proto, Symbol(result));
 }
 
 void DescriptorBuilder::BuildExtensionRange(
-    const DescriptorProto::ExtensionRange& proto,
-    const Descriptor* parent,
+    const DescriptorProto::ExtensionRange& proto, const Descriptor* parent,
     Descriptor::ExtensionRange* result) {
   result->start = proto.start();
   result->end = proto.end();
   if (result->start <= 0) {
-    AddError(parent->full_name(), proto,
-             DescriptorPool::ErrorCollector::NUMBER,
+    AddError(parent->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER,
              "Extension numbers must be positive integers.");
   }
 
@@ -4950,8 +4913,7 @@
   // numbers are actually used as int32s in the message_set_wire_format.
 
   if (result->start >= result->end) {
-    AddError(parent->full_name(), proto,
-             DescriptorPool::ErrorCollector::NUMBER,
+    AddError(parent->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER,
              "Extension range end number must be greater than start number.");
   }
 
@@ -4973,14 +4935,12 @@
 }
 
 void DescriptorBuilder::BuildReservedRange(
-    const DescriptorProto::ReservedRange& proto,
-    const Descriptor* parent,
+    const DescriptorProto::ReservedRange& proto, const Descriptor* parent,
     Descriptor::ReservedRange* result) {
   result->start = proto.start();
   result->end = proto.end();
   if (result->start <= 0) {
-    AddError(parent->full_name(), proto,
-             DescriptorPool::ErrorCollector::NUMBER,
+    AddError(parent->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER,
              "Reserved numbers must be positive integers.");
   }
 }
@@ -4992,8 +4952,7 @@
   result->end = proto.end();
 
   if (result->start > result->end) {
-    AddError(parent->full_name(), proto,
-             DescriptorPool::ErrorCollector::NUMBER,
+    AddError(parent->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER,
              "Reserved range end number must be greater than start number.");
   }
 }
@@ -5024,8 +4983,7 @@
                     OneofDescriptorProto::kOptionsFieldNumber);
   }
 
-  AddSymbol(result->full_name(), parent, result->name(),
-            proto, Symbol(result));
+  AddSymbol(result->full_name(), parent, result->name(), proto, Symbol(result));
 }
 
 void DescriptorBuilder::CheckEnumValueUniqueness(
@@ -5105,18 +5063,17 @@
 
   ValidateSymbolName(proto.name(), *full_name, proto);
 
-  result->name_            = tables_->AllocateString(proto.name());
-  result->full_name_       = full_name;
-  result->file_            = file_;
+  result->name_ = tables_->AllocateString(proto.name());
+  result->full_name_ = full_name;
+  result->file_ = file_;
   result->containing_type_ = parent;
-  result->is_placeholder_  = false;
+  result->is_placeholder_ = false;
   result->is_unqualified_placeholder_ = false;
 
   if (proto.value_size() == 0) {
     // We cannot allow enums with no values because this would mean there
     // would be no valid default value for fields of this type.
-    AddError(result->full_name(), proto,
-             DescriptorPool::ErrorCollector::NAME,
+    AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NAME,
              "Enums must contain at least one value.");
   }
 
@@ -5143,8 +5100,7 @@
                     EnumDescriptorProto::kOptionsFieldNumber);
   }
 
-  AddSymbol(result->full_name(), parent, result->name(),
-            proto, Symbol(result));
+  AddSymbol(result->full_name(), parent, result->name(), proto, Symbol(result));
 
   for (int i = 0; i < proto.reserved_range_size(); i++) {
     const EnumDescriptorProto_EnumReservedRange& range1 =
@@ -5171,8 +5127,7 @@
     } else {
       AddError(name, proto, DescriptorPool::ErrorCollector::NAME,
                strings::Substitute(
-                 "Enum value \"$0\" is reserved multiple times.",
-                 name));
+                   "Enum value \"$0\" is reserved multiple times.", name));
     }
   }
 
@@ -5181,18 +5136,18 @@
     for (int j = 0; j < result->reserved_range_count(); j++) {
       const EnumDescriptor::ReservedRange* range = result->reserved_range(j);
       if (range->start <= value->number() && value->number() <= range->end) {
-        AddError(value->full_name(), proto.reserved_range(j),
-                 DescriptorPool::ErrorCollector::NUMBER,
-                 strings::Substitute(
-                   "Enum value \"$0\" uses reserved number $1.",
-                   value->name(), value->number()));
+        AddError(
+            value->full_name(), proto.reserved_range(j),
+            DescriptorPool::ErrorCollector::NUMBER,
+            strings::Substitute("Enum value \"$0\" uses reserved number $1.",
+                                value->name(), value->number()));
       }
     }
     if (reserved_name_set.find(value->name()) != reserved_name_set.end()) {
-      AddError(value->full_name(), proto.value(i),
-               DescriptorPool::ErrorCollector::NAME,
-               strings::Substitute(
-                 "Enum value \"$0\" is reserved.", value->name()));
+      AddError(
+          value->full_name(), proto.value(i),
+          DescriptorPool::ErrorCollector::NAME,
+          strings::Substitute("Enum value \"$0\" is reserved.", value->name()));
     }
   }
 }
@@ -5200,9 +5155,9 @@
 void DescriptorBuilder::BuildEnumValue(const EnumValueDescriptorProto& proto,
                                        const EnumDescriptor* parent,
                                        EnumValueDescriptor* result) {
-  result->name_   = tables_->AllocateString(proto.name());
+  result->name_ = tables_->AllocateString(proto.name());
   result->number_ = proto.number();
-  result->type_   = parent;
+  result->type_ = parent;
 
   // Note:  full_name for enum values is a sibling to the parent's name, not a
   //   child of it.
@@ -5225,15 +5180,15 @@
   // of the enum type instead of children of it.  So, we use
   // parent->containing_type() as the value's parent.
   bool added_to_outer_scope =
-    AddSymbol(result->full_name(), parent->containing_type(), result->name(),
-              proto, Symbol(result));
+      AddSymbol(result->full_name(), parent->containing_type(), result->name(),
+                proto, Symbol(result));
 
   // However, we also want to be able to search for values within a single
   // enum type, so we add it as a child of the enum type itself, too.
   // Note:  This could fail, but if it does, the error has already been
   //   reported by the above AddSymbol() call, so we ignore the return code.
   bool added_to_inner_scope =
-    file_tables_->AddAliasUnderParent(parent, result->name(), Symbol(result));
+      file_tables_->AddAliasUnderParent(parent, result->name(), Symbol(result));
 
   if (added_to_inner_scope && !added_to_outer_scope) {
     // This value did not conflict with any values defined in the same enum,
@@ -5252,12 +5207,12 @@
       outer_scope = "\"" + outer_scope + "\"";
     }
 
-    AddError(result->full_name(), proto,
-             DescriptorPool::ErrorCollector::NAME,
+    AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NAME,
              "Note that enum values use C++ scoping rules, meaning that "
              "enum values are siblings of their type, not children of it.  "
-             "Therefore, \"" + result->name() + "\" must be unique within "
-             + outer_scope + ", not just within \"" + parent->name() + "\".");
+             "Therefore, \"" +
+                 result->name() + "\" must be unique within " + outer_scope +
+                 ", not just within \"" + parent->name() + "\".");
   }
 
   // An enum is allowed to define two numbers that refer to the same value.
@@ -5275,9 +5230,9 @@
 
   ValidateSymbolName(proto.name(), *full_name, proto);
 
-  result->name_      = tables_->AllocateString(proto.name());
+  result->name_ = tables_->AllocateString(proto.name());
   result->full_name_ = full_name;
-  result->file_      = file_;
+  result->file_ = file_;
 
   BUILD_ARRAY(proto, result, method, BuildMethod, result);
 
@@ -5289,14 +5244,13 @@
                     ServiceDescriptorProto::kOptionsFieldNumber);
   }
 
-  AddSymbol(result->full_name(), NULL, result->name(),
-            proto, Symbol(result));
+  AddSymbol(result->full_name(), NULL, result->name(), proto, Symbol(result));
 }
 
 void DescriptorBuilder::BuildMethod(const MethodDescriptorProto& proto,
                                     const ServiceDescriptor* parent,
                                     MethodDescriptor* result) {
-  result->name_    = tables_->AllocateString(proto.name());
+  result->name_ = tables_->AllocateString(proto.name());
   result->service_ = parent;
 
   std::string* full_name = tables_->AllocateString(parent->full_name());
@@ -5321,16 +5275,15 @@
   result->client_streaming_ = proto.client_streaming();
   result->server_streaming_ = proto.server_streaming();
 
-  AddSymbol(result->full_name(), parent, result->name(),
-            proto, Symbol(result));
+  AddSymbol(result->full_name(), parent, result->name(), proto, Symbol(result));
 }
 
 #undef BUILD_ARRAY
 
 // -------------------------------------------------------------------
 
-void DescriptorBuilder::CrossLinkFile(
-    FileDescriptor* file, const FileDescriptorProto& proto) {
+void DescriptorBuilder::CrossLinkFile(FileDescriptor* file,
+                                      const FileDescriptorProto& proto) {
   if (file->options_ == NULL) {
     file->options_ = &FileOptions::default_instance();
   }
@@ -5352,8 +5305,8 @@
   }
 }
 
-void DescriptorBuilder::CrossLinkMessage(
-    Descriptor* message, const DescriptorProto& proto) {
+void DescriptorBuilder::CrossLinkMessage(Descriptor* message,
+                                         const DescriptorProto& proto) {
   if (message->options_ == NULL) {
     message->options_ = &MessageOptions::default_instance();
   }
@@ -5393,14 +5346,13 @@
       // safe.
       if (oneof_decl->field_count() > 0 &&
           message->field(i - 1)->containing_oneof() != oneof_decl) {
-        AddError(
-            message->full_name() + "." + message->field(i - 1)->name(),
-            proto.field(i - 1), DescriptorPool::ErrorCollector::OTHER,
-            strings::Substitute(
-                "Fields in the same oneof must be defined consecutively. "
-                "\"$0\" cannot be defined before the completion of the "
-                "\"$1\" oneof definition.",
-                message->field(i - 1)->name(), oneof_decl->name()));
+        AddError(message->full_name() + "." + message->field(i - 1)->name(),
+                 proto.field(i - 1), DescriptorPool::ErrorCollector::TYPE,
+                 strings::Substitute(
+                     "Fields in the same oneof must be defined consecutively. "
+                     "\"$0\" cannot be defined before the completion of the "
+                     "\"$1\" oneof definition.",
+                     message->field(i - 1)->name(), oneof_decl->name()));
       }
       // Must go through oneof_decls_ array to get a non-const version of the
       // OneofDescriptor.
@@ -5414,13 +5366,12 @@
 
     if (oneof_decl->field_count() == 0) {
       AddError(message->full_name() + "." + oneof_decl->name(),
-               proto.oneof_decl(i),
-               DescriptorPool::ErrorCollector::NAME,
+               proto.oneof_decl(i), DescriptorPool::ErrorCollector::NAME,
                "Oneof must have at least one field.");
     }
 
-    oneof_decl->fields_ =
-      tables_->AllocateArray<const FieldDescriptor*>(oneof_decl->field_count_);
+    oneof_decl->fields_ = tables_->AllocateArray<const FieldDescriptor*>(
+        oneof_decl->field_count_);
     oneof_decl->field_count_ = 0;
 
     if (oneof_decl->options_ == NULL) {
@@ -5449,8 +5400,8 @@
   }
 }
 
-void DescriptorBuilder::CrossLinkField(
-    FieldDescriptor* field, const FieldDescriptorProto& proto) {
+void DescriptorBuilder::CrossLinkField(FieldDescriptor* field,
+                                       const FieldDescriptorProto& proto) {
   if (field->options_ == NULL) {
     field->options_ = &FieldOptions::default_instance();
   }
@@ -5475,8 +5426,9 @@
     }
     field->containing_type_ = extendee.descriptor;
 
-    const Descriptor::ExtensionRange* extension_range = field->containing_type()
-        ->FindExtensionRangeContainingNumber(field->number());
+    const Descriptor::ExtensionRange* extension_range =
+        field->containing_type()->FindExtensionRangeContainingNumber(
+            field->number());
 
     if (extension_range == NULL) {
       AddError(field->full_name(), proto,
@@ -5493,8 +5445,7 @@
       // Note that this error will never happen when parsing .proto files.
       // It can only happen if you manually construct a FileDescriptorProto
       // that is incorrect.
-      AddError(field->full_name(), proto,
-               DescriptorPool::ErrorCollector::NAME,
+      AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::NAME,
                "Fields of oneofs must themselves have label LABEL_OPTIONAL.");
     }
   }
@@ -5615,20 +5566,19 @@
           // We can't just use field->enum_type()->FindValueByName() here
           // because that locks the pool's mutex, which we have already locked
           // at this point.
-          Symbol default_value =
-            LookupSymbolNoPlaceholder(proto.default_value(),
-                                      field->enum_type()->full_name());
+          Symbol default_value = LookupSymbolNoPlaceholder(
+              proto.default_value(), field->enum_type()->full_name());
 
           if (default_value.type == Symbol::ENUM_VALUE &&
               default_value.enum_value_descriptor->type() ==
-              field->enum_type()) {
+                  field->enum_type()) {
             field->default_value_enum_ = default_value.enum_value_descriptor;
           } else {
             AddError(field->full_name(), proto,
                      DescriptorPool::ErrorCollector::DEFAULT_VALUE,
                      "Enum type \"" + field->enum_type()->full_name() +
-                     "\" has no value named \"" + proto.default_value() +
-                     "\".");
+                         "\" has no value named \"" + proto.default_value() +
+                         "\".");
           }
         }
       } else if (field->enum_type()->value_count() > 0) {
@@ -5656,9 +5606,8 @@
   // risk to calling containing_type() or other accessors that will build
   // dependencies.
   if (!file_tables_->AddFieldByNumber(field)) {
-    const FieldDescriptor* conflicting_field =
-      file_tables_->FindFieldByNumber(field->containing_type(),
-                                      field->number());
+    const FieldDescriptor* conflicting_field = file_tables_->FindFieldByNumber(
+        field->containing_type(), field->number());
     std::string containing_type_name =
         field->containing_type() == NULL
             ? "unknown"
@@ -5668,16 +5617,14 @@
                DescriptorPool::ErrorCollector::NUMBER,
                strings::Substitute("Extension number $0 has already been used "
                                    "in \"$1\" by extension \"$2\".",
-                                   field->number(),
-                                   containing_type_name,
+                                   field->number(), containing_type_name,
                                    conflicting_field->full_name()));
     } else {
       AddError(field->full_name(), proto,
                DescriptorPool::ErrorCollector::NUMBER,
                strings::Substitute("Field number $0 has already been used in "
                                    "\"$1\" by field \"$2\".",
-                                   field->number(),
-                                   containing_type_name,
+                                   field->number(), containing_type_name,
                                    conflicting_field->name()));
     }
   } else {
@@ -5705,8 +5652,8 @@
   }
 }
 
-void DescriptorBuilder::CrossLinkEnum(
-    EnumDescriptor* enum_type, const EnumDescriptorProto& proto) {
+void DescriptorBuilder::CrossLinkEnum(EnumDescriptor* enum_type,
+                                      const EnumDescriptorProto& proto) {
   if (enum_type->options_ == NULL) {
     enum_type->options_ = &EnumOptions::default_instance();
   }
@@ -5724,8 +5671,8 @@
   }
 }
 
-void DescriptorBuilder::CrossLinkService(
-    ServiceDescriptor* service, const ServiceDescriptorProto& proto) {
+void DescriptorBuilder::CrossLinkService(ServiceDescriptor* service,
+                                         const ServiceDescriptorProto& proto) {
   if (service->options_ == NULL) {
     service->options_ = &ServiceOptions::default_instance();
   }
@@ -5735,8 +5682,8 @@
   }
 }
 
-void DescriptorBuilder::CrossLinkMethod(
-    MethodDescriptor* method, const MethodDescriptorProto& proto) {
+void DescriptorBuilder::CrossLinkMethod(MethodDescriptor* method,
+                                        const MethodDescriptorProto& proto) {
   if (method->options_ == NULL) {
     method->options_ = &MethodOptions::default_instance();
   }
@@ -5784,10 +5731,10 @@
 
 // -------------------------------------------------------------------
 
-#define VALIDATE_OPTIONS_FROM_ARRAY(descriptor, array_name, type)  \
-  for (int i = 0; i < descriptor->array_name##_count(); ++i) {     \
-    Validate##type##Options(descriptor->array_name##s_ + i,        \
-                            proto.array_name(i));                  \
+#define VALIDATE_OPTIONS_FROM_ARRAY(descriptor, array_name, type) \
+  for (int i = 0; i < descriptor->array_name##_count(); ++i) {    \
+    Validate##type##Options(descriptor->array_name##s_ + i,       \
+                            proto.array_name(i));                 \
   }
 
 // Determine if the file uses optimize_for = LITE_RUNTIME, being careful to
@@ -5795,8 +5742,7 @@
 static bool IsLite(const FileDescriptor* file) {
   // TODO(kenton):  I don't even remember how many of these conditions are
   //   actually possible.  I'm just being super-safe.
-  return file != NULL &&
-         &file->options() != &FileOptions::default_instance() &&
+  return file != NULL && &file->options() != &FileOptions::default_instance() &&
          file->options().optimize_for() == FileOptions::LITE_RUNTIME;
 }
 
@@ -5812,11 +5758,12 @@
     for (int i = 0; i < file->dependency_count(); i++) {
       if (IsLite(file->dependency(i))) {
         AddError(
-          file->name(), proto,
-          DescriptorPool::ErrorCollector::OTHER,
-          "Files that do not use optimize_for = LITE_RUNTIME cannot import "
-          "files which do use this option.  This file is not lite, but it "
-          "imports \"" + file->dependency(i)->name() + "\" which is.");
+            file->dependency(i)->name(), proto,
+            DescriptorPool::ErrorCollector::IMPORT,
+            "Files that do not use optimize_for = LITE_RUNTIME cannot import "
+            "files which do use this option.  This file is not lite, but it "
+            "imports \"" +
+                file->dependency(i)->name() + "\" which is.");
         break;
       }
     }
@@ -5826,8 +5773,8 @@
   }
 }
 
-void DescriptorBuilder::ValidateProto3(
-    FileDescriptor* file, const FileDescriptorProto& proto) {
+void DescriptorBuilder::ValidateProto3(FileDescriptor* file,
+                                       const FileDescriptorProto& proto) {
   for (int i = 0; i < file->extension_count(); ++i) {
     ValidateProto3Field(file->extensions_ + i, proto.extension(i));
   }
@@ -5853,31 +5800,28 @@
   return result;
 }
 
-void DescriptorBuilder::ValidateProto3Message(
-    Descriptor* message, const DescriptorProto& proto) {
+void DescriptorBuilder::ValidateProto3Message(Descriptor* message,
+                                              const DescriptorProto& proto) {
   for (int i = 0; i < message->nested_type_count(); ++i) {
-    ValidateProto3Message(message->nested_types_ + i,
-                                 proto.nested_type(i));
+    ValidateProto3Message(message->nested_types_ + i, proto.nested_type(i));
   }
   for (int i = 0; i < message->enum_type_count(); ++i) {
-    ValidateProto3Enum(message->enum_types_ + i,
-                              proto.enum_type(i));
+    ValidateProto3Enum(message->enum_types_ + i, proto.enum_type(i));
   }
   for (int i = 0; i < message->field_count(); ++i) {
     ValidateProto3Field(message->fields_ + i, proto.field(i));
   }
   for (int i = 0; i < message->extension_count(); ++i) {
-    ValidateProto3Field(message->extensions_ +i, proto.extension(i));
+    ValidateProto3Field(message->extensions_ + i, proto.extension(i));
   }
   if (message->extension_range_count() > 0) {
-    AddError(message->full_name(), proto,
-             DescriptorPool::ErrorCollector::OTHER,
+    AddError(message->full_name(), proto.extension_range(0),
+             DescriptorPool::ErrorCollector::NUMBER,
              "Extension ranges are not allowed in proto3.");
   }
   if (message->options().message_set_wire_format()) {
     // Using MessageSet doesn't make sense since we disallow extensions.
-    AddError(message->full_name(), proto,
-             DescriptorPool::ErrorCollector::OTHER,
+    AddError(message->full_name(), proto, DescriptorPool::ErrorCollector::NAME,
              "MessageSet is not supported in proto3.");
   }
 
@@ -5889,61 +5833,58 @@
     std::string lowercase_name =
         ToLowercaseWithoutUnderscores(message->field(i)->name());
     if (name_to_field.find(lowercase_name) != name_to_field.end()) {
-      AddError(message->full_name(), proto,
-               DescriptorPool::ErrorCollector::OTHER,
+      AddError(message->full_name(), proto.field(i),
+               DescriptorPool::ErrorCollector::NAME,
                "The JSON camel-case name of field \"" +
-               message->field(i)->name() + "\" conflicts with field \"" +
-               name_to_field[lowercase_name]->name() + "\". This is not " +
-               "allowed in proto3.");
+                   message->field(i)->name() + "\" conflicts with field \"" +
+                   name_to_field[lowercase_name]->name() + "\". This is not " +
+                   "allowed in proto3.");
     } else {
       name_to_field[lowercase_name] = message->field(i);
     }
   }
 }
 
-void DescriptorBuilder::ValidateProto3Field(
-    FieldDescriptor* field, const FieldDescriptorProto& proto) {
+void DescriptorBuilder::ValidateProto3Field(FieldDescriptor* field,
+                                            const FieldDescriptorProto& proto) {
   if (field->is_extension() &&
       !AllowedExtendeeInProto3(field->containing_type()->full_name())) {
     AddError(field->full_name(), proto,
-             DescriptorPool::ErrorCollector::OTHER,
+             DescriptorPool::ErrorCollector::EXTENDEE,
              "Extensions in proto3 are only allowed for defining options.");
   }
   if (field->is_required()) {
-    AddError(field->full_name(), proto,
-             DescriptorPool::ErrorCollector::OTHER,
+    AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
              "Required fields are not allowed in proto3.");
   }
   if (field->has_default_value()) {
-    AddError(
-        field->full_name(), proto, DescriptorPool::ErrorCollector::OTHER,
-        "Explicit default values are not allowed in proto3.");
+    AddError(field->full_name(), proto,
+             DescriptorPool::ErrorCollector::DEFAULT_VALUE,
+             "Explicit default values are not allowed in proto3.");
   }
   if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM &&
       field->enum_type() &&
       field->enum_type()->file()->syntax() != FileDescriptor::SYNTAX_PROTO3) {
     // Proto3 messages can only use Proto3 enum types; otherwise we can't
     // guarantee that the default value is zero.
-    AddError(field->full_name(), proto,
-             DescriptorPool::ErrorCollector::TYPE,
+    AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
              "Enum type \"" + field->enum_type()->full_name() +
-             "\" is not a proto3 enum, but is used in \"" +
-             field->containing_type()->full_name() +
-             "\" which is a proto3 message type.");
+                 "\" is not a proto3 enum, but is used in \"" +
+                 field->containing_type()->full_name() +
+                 "\" which is a proto3 message type.");
   }
   if (field->type() == FieldDescriptor::TYPE_GROUP) {
-    AddError(field->full_name(), proto,
-             DescriptorPool::ErrorCollector::TYPE,
+    AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
              "Groups are not supported in proto3 syntax.");
   }
 }
 
-void DescriptorBuilder::ValidateProto3Enum(
-    EnumDescriptor* enm, const EnumDescriptorProto& proto) {
+void DescriptorBuilder::ValidateProto3Enum(EnumDescriptor* enm,
+                                           const EnumDescriptorProto& proto) {
   if (enm->value_count() > 0 && enm->value(0)->number() != 0) {
-    AddError(
-        enm->full_name(), proto, DescriptorPool::ErrorCollector::OTHER,
-        "The first enum value must be zero in proto3.");
+    AddError(enm->full_name(), proto.value(0),
+             DescriptorPool::ErrorCollector::NUMBER,
+             "The first enum value must be zero in proto3.");
   }
 }
 
@@ -5955,9 +5896,9 @@
   VALIDATE_OPTIONS_FROM_ARRAY(message, extension, Field);
 
   const int64 max_extension_range =
-      static_cast<int64>(message->options().message_set_wire_format() ?
-                         kint32max :
-                         FieldDescriptor::kMaxNumber);
+      static_cast<int64>(message->options().message_set_wire_format()
+                             ? kint32max
+                             : FieldDescriptor::kMaxNumber);
   for (int i = 0; i < message->extension_range_count(); ++i) {
     if (message->extension_range(i)->end > max_extension_range + 1) {
       AddError(
@@ -5970,16 +5911,15 @@
 }
 
 
-void DescriptorBuilder::ValidateFieldOptions(FieldDescriptor* field,
-    const FieldDescriptorProto& proto) {
+void DescriptorBuilder::ValidateFieldOptions(
+    FieldDescriptor* field, const FieldDescriptorProto& proto) {
   if (pool_->lazily_build_dependencies_ && (!field || !field->message_type())) {
     return;
   }
   // Only message type fields may be lazy.
   if (field->options().lazy()) {
     if (field->type() != FieldDescriptor::TYPE_MESSAGE) {
-      AddError(field->full_name(), proto,
-               DescriptorPool::ErrorCollector::TYPE,
+      AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
                "[lazy = true] can only be specified for submessage fields.");
     }
   }
@@ -5987,16 +5927,15 @@
   // Only repeated primitive fields may be packed.
   if (field->options().packed() && !field->is_packable()) {
     AddError(
-      field->full_name(), proto,
-      DescriptorPool::ErrorCollector::TYPE,
-      "[packed = true] can only be specified for repeated primitive fields.");
+        field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
+        "[packed = true] can only be specified for repeated primitive fields.");
   }
 
   // Note:  Default instance may not yet be initialized here, so we have to
   //   avoid reading from it.
   if (field->containing_type_ != NULL &&
       &field->containing_type()->options() !=
-      &MessageOptions::default_instance() &&
+          &MessageOptions::default_instance() &&
       field->containing_type()->options().message_set_wire_format()) {
     if (field->is_extension()) {
       if (!field->is_optional() ||
@@ -6006,15 +5945,13 @@
                  "Extensions of MessageSets must be optional messages.");
       }
     } else {
-      AddError(field->full_name(), proto,
-               DescriptorPool::ErrorCollector::NAME,
+      AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::NAME,
                "MessageSets cannot have fields, only extensions.");
     }
   }
 
   // Lite extensions can only be of Lite types.
-  if (IsLite(field->file()) &&
-      field->containing_type_ != NULL &&
+  if (IsLite(field->file()) && field->containing_type_ != NULL &&
       !IsLite(field->containing_type()->file())) {
     AddError(field->full_name(), proto,
              DescriptorPool::ErrorCollector::EXTENDEE,
@@ -6026,8 +5963,7 @@
   // Validate map types.
   if (field->is_map()) {
     if (!ValidateMapEntry(field, proto)) {
-      AddError(field->full_name(), proto,
-               DescriptorPool::ErrorCollector::OTHER,
+      AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
                "map_entry should not be set explicitly. Use map<KeyType, "
                "ValueType> instead.");
     }
@@ -6070,13 +6006,8 @@
             "'option allow_alias = true;' to the enum definition.";
         if (!enm->options().allow_alias()) {
           // Generate error if duplicated enum values are explicitly disallowed.
-          AddError(enm->full_name(), proto,
-                   DescriptorPool::ErrorCollector::NUMBER,
-                   error);
-        } else {
-          // Generate warning if duplicated values are found but the option
-          // isn't set.
-          GOOGLE_LOG(ERROR) << error;
+          AddError(enm->full_name(), proto.value(i),
+                   DescriptorPool::ErrorCollector::NUMBER, error);
         }
       } else {
         used_values[enum_value->number()] = enum_value->full_name();
@@ -6090,13 +6021,12 @@
     const EnumValueDescriptorProto& /* proto */) {
   // Nothing to do so far.
 }
-void DescriptorBuilder::ValidateServiceOptions(ServiceDescriptor* service,
-    const ServiceDescriptorProto& proto) {
+void DescriptorBuilder::ValidateServiceOptions(
+    ServiceDescriptor* service, const ServiceDescriptorProto& proto) {
   if (IsLite(service->file()) &&
       (service->file()->options().cc_generic_services() ||
        service->file()->options().java_generic_services())) {
-    AddError(service->full_name(), proto,
-             DescriptorPool::ErrorCollector::NAME,
+    AddError(service->full_name(), proto, DescriptorPool::ErrorCollector::NAME,
              "Files with optimize_for = LITE_RUNTIME cannot define services "
              "unless you set both options cc_generic_services and "
              "java_generic_sevices to false.");
@@ -6105,16 +6035,16 @@
   VALIDATE_OPTIONS_FROM_ARRAY(service, method, Method);
 }
 
-void DescriptorBuilder::ValidateMethodOptions(MethodDescriptor* /* method */,
-    const MethodDescriptorProto& /* proto */) {
+void DescriptorBuilder::ValidateMethodOptions(
+    MethodDescriptor* /* method */, const MethodDescriptorProto& /* proto */) {
   // Nothing to do so far.
 }
 
 bool DescriptorBuilder::ValidateMapEntry(FieldDescriptor* field,
                                          const FieldDescriptorProto& proto) {
   const Descriptor* message = field->message_type();
-  if (// Must not contain extensions, extension range or nested message or
-      // enums
+  if (  // Must not contain extensions, extension range or nested message or
+        // enums
       message->extension_count() != 0 ||
       field->label() != FieldDescriptor::LABEL_REPEATED ||
       message->extension_range_count() != 0 ||
@@ -6142,9 +6072,8 @@
   // Check key types are legal.
   switch (key->type()) {
     case FieldDescriptor::TYPE_ENUM:
-      AddError(
-          field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
-          "Key in map fields cannot be enum types.");
+      AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
+               "Key in map fields cannot be enum types.");
       break;
     case FieldDescriptor::TYPE_FLOAT:
     case FieldDescriptor::TYPE_DOUBLE:
@@ -6169,15 +6098,14 @@
     case FieldDescriptor::TYPE_SFIXED64:
       // Legal cases
       break;
-    // Do not add a default, so that the compiler will complain when new types
-    // are added.
+      // Do not add a default, so that the compiler will complain when new types
+      // are added.
   }
 
   if (value->type() == FieldDescriptor::TYPE_ENUM) {
     if (value->enum_type()->value(0)->number() != 0) {
-      AddError(
-          field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
-          "Enum value in map must define 0 as the first value.");
+      AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
+               "Enum value in map must define 0 as the first value.");
     }
   }
 
@@ -6197,7 +6125,7 @@
         AddError(message->full_name(), proto,
                  DescriptorPool::ErrorCollector::NAME,
                  "Expanded map entry type " + nested->name() +
-                 " conflicts with an existing nested message type.");
+                     " conflicts with an existing nested message type.");
       }
     }
     // Recursively test on the nested types.
@@ -6212,7 +6140,7 @@
       AddError(message->full_name(), proto,
                DescriptorPool::ErrorCollector::NAME,
                "Expanded map entry type " + iter->second->name() +
-               " conflicts with an existing field.");
+                   " conflicts with an existing field.");
     }
   }
   // Check for conflicted enum names.
@@ -6224,7 +6152,7 @@
       AddError(message->full_name(), proto,
                DescriptorPool::ErrorCollector::NAME,
                "Expanded map entry type " + iter->second->name() +
-               " conflicts with an existing enum type.");
+                   " conflicts with an existing enum type.");
     }
   }
   // Check for conflicted oneof names.
@@ -6236,7 +6164,7 @@
       AddError(message->full_name(), proto,
                DescriptorPool::ErrorCollector::NAME,
                "Expanded map entry type " + iter->second->name() +
-               " conflicts with an existing oneof type.");
+                   " conflicts with an existing oneof type.");
     }
   }
 }
@@ -6264,7 +6192,7 @@
       AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
                "Illegal jstype for int64, uint64, sint64, fixed64 "
                "or sfixed64 field: " +
-               FieldOptions_JSType_descriptor()->value(jstype)->name());
+                   FieldOptions_JSType_descriptor()->value(jstype)->name());
       break;
 
     // No other types permit a jstype option.
@@ -6281,12 +6209,12 @@
 // -------------------------------------------------------------------
 
 DescriptorBuilder::OptionInterpreter::OptionInterpreter(
-    DescriptorBuilder* builder) : builder_(builder) {
+    DescriptorBuilder* builder)
+    : builder_(builder) {
   GOOGLE_CHECK(builder_);
 }
 
-DescriptorBuilder::OptionInterpreter::~OptionInterpreter() {
-}
+DescriptorBuilder::OptionInterpreter::~OptionInterpreter() {}
 
 bool DescriptorBuilder::OptionInterpreter::InterpretOptions(
     OptionsToInterpret* options_to_interpret) {
@@ -6311,13 +6239,14 @@
 
   // Find the uninterpreted_option field in the original options.
   const FieldDescriptor* original_uninterpreted_options_field =
-      original_options->GetDescriptor()->
-          FindFieldByName("uninterpreted_option");
+      original_options->GetDescriptor()->FindFieldByName(
+          "uninterpreted_option");
   GOOGLE_CHECK(original_uninterpreted_options_field != NULL)
       << "No field named \"uninterpreted_option\" in the Options proto.";
 
-  const int num_uninterpreted_options = original_options->GetReflection()->
-      FieldSize(*original_options, original_uninterpreted_options_field);
+  const int num_uninterpreted_options =
+      original_options->GetReflection()->FieldSize(
+          *original_options, original_uninterpreted_options_field);
   for (int i = 0; i < num_uninterpreted_options; ++i) {
     src_path.push_back(i);
     uninterpreted_option_ = down_cast<const UninterpretedOption*>(
@@ -6357,8 +6286,11 @@
           DescriptorPool::ErrorCollector::OTHER,
           "Some options could not be correctly parsed using the proto "
           "descriptors compiled into this binary.\n"
-          "Unparsed options: " + unparsed_options->ShortDebugString() + "\n"
-          "Parsing attempt:  " + options->ShortDebugString());
+          "Unparsed options: " +
+              unparsed_options->ShortDebugString() +
+              "\n"
+              "Parsing attempt:  " +
+              options->ShortDebugString());
       // Restore the unparsed options.
       options->GetReflection()->Swap(unparsed_options.get(), options);
     }
@@ -6376,8 +6308,9 @@
     return AddNameError("Option must have a name.");
   }
   if (uninterpreted_option_->name(0).name_part() == "uninterpreted_option") {
-    return AddNameError("Option must not use reserved name "
-                        "\"uninterpreted_option\".");
+    return AddNameError(
+        "Option must not use reserved name "
+        "\"uninterpreted_option\".");
   }
 
   const Descriptor* options_descriptor = NULL;
@@ -6392,7 +6325,7 @@
   // FindSymbol() because files that use custom options only need to depend on
   // the file that defines the option, not descriptor.proto itself.
   Symbol symbol = builder_->FindSymbolNotEnforcingDeps(
-    options->GetDescriptor()->full_name());
+      options->GetDescriptor()->full_name());
   if (!symbol.IsNull() && symbol.type == Symbol::MESSAGE) {
     options_descriptor = symbol.descriptor;
   } else {
@@ -6428,8 +6361,8 @@
       // DescriptorPool::FindExtensionByName(), for two reasons: 1) It allows
       // relative lookups, and 2) because we're already holding the pool's
       // mutex, and the latter method locks it again.
-      symbol = builder_->LookupSymbol(name_part,
-                                      options_to_interpret_->name_scope);
+      symbol =
+          builder_->LookupSymbol(name_part, options_to_interpret_->name_scope);
       if (!symbol.IsNull() && symbol.type == Symbol::FIELD) {
         field = symbol.field_descriptor;
       }
@@ -6460,8 +6393,9 @@
             "\") to start from the outermost scope.");
       } else {
         return AddNameError(
-          "Option \"" + debug_msg_name + "\" unknown. Ensure that your proto" +
-          " definition file imports the proto which defines the option.");
+            "Option \"" + debug_msg_name +
+            "\" unknown. Ensure that your proto" +
+            " definition file imports the proto which defines the option.");
       }
     } else if (field->containing_type() != descriptor) {
       if (get_is_placeholder(field->containing_type())) {
@@ -6510,10 +6444,10 @@
   // known will populate them correctly.
 
   // First see if the option is already set.
-  if (!field->is_repeated() && !ExamineIfOptionIsSet(
-          intermediate_fields.begin(),
-          intermediate_fields.end(),
-          field, debug_msg_name,
+  if (!field->is_repeated() &&
+      !ExamineIfOptionIsSet(
+          intermediate_fields.begin(), intermediate_fields.end(), field,
+          debug_msg_name,
           options->GetReflection()->GetUnknownFields(*options))) {
     return false;  // ExamineIfOptionIsSet() already added the error.
   }
@@ -6545,8 +6479,8 @@
       }
 
       case FieldDescriptor::TYPE_GROUP: {
-         parent_unknown_fields->AddGroup((*iter)->number())
-                              ->MergeFrom(*unknown_fields);
+        parent_unknown_fields->AddGroup((*iter)->number())
+            ->MergeFrom(*unknown_fields);
         break;
       }
 
@@ -6669,11 +6603,12 @@
 void DescriptorBuilder::OptionInterpreter::AddWithoutInterpreting(
     const UninterpretedOption& uninterpreted_option, Message* options) {
   const FieldDescriptor* field =
-    options->GetDescriptor()->FindFieldByName("uninterpreted_option");
+      options->GetDescriptor()->FindFieldByName("uninterpreted_option");
   GOOGLE_CHECK(field != NULL);
 
-  options->GetReflection()->AddMessage(options, field)
-    ->CopyFrom(uninterpreted_option);
+  options->GetReflection()
+      ->AddMessage(options, field)
+      ->CopyFrom(uninterpreted_option);
 }
 
 bool DescriptorBuilder::OptionInterpreter::ExamineIfOptionIsSet(
@@ -6710,8 +6645,8 @@
             if (intermediate_unknown_fields.ParseFromString(
                     unknown_field->length_delimited()) &&
                 !ExamineIfOptionIsSet(intermediate_fields_iter + 1,
-                                      intermediate_fields_end,
-                                      innermost_field, debug_msg_name,
+                                      intermediate_fields_end, innermost_field,
+                                      debug_msg_name,
                                       intermediate_unknown_fields)) {
               return false;  // Error already added.
             }
@@ -6721,9 +6656,8 @@
         case FieldDescriptor::TYPE_GROUP:
           if (unknown_field->type() == UnknownField::TYPE_GROUP) {
             if (!ExamineIfOptionIsSet(intermediate_fields_iter + 1,
-                                      intermediate_fields_end,
-                                      innermost_field, debug_msg_name,
-                                      unknown_field->group())) {
+                                      intermediate_fields_end, innermost_field,
+                                      debug_msg_name, unknown_field->group())) {
               return false;  // Error already added.
             }
           }
@@ -6739,11 +6673,9 @@
 }
 
 bool DescriptorBuilder::OptionInterpreter::SetOptionValue(
-    const FieldDescriptor* option_field,
-    UnknownFieldSet* unknown_fields) {
+    const FieldDescriptor* option_field, UnknownFieldSet* unknown_fields) {
   // We switch on the CppType to validate.
   switch (option_field->cpp_type()) {
-
     case FieldDescriptor::CPPTYPE_INT32:
       if (uninterpreted_option_->has_positive_int_value()) {
         if (uninterpreted_option_->positive_int_value() >
@@ -6803,8 +6735,10 @@
                     option_field->type(), unknown_fields);
         }
       } else {
-        return AddValueError("Value must be non-negative integer for uint32 "
-                             "option \"" + option_field->full_name() + "\".");
+        return AddValueError(
+            "Value must be non-negative integer for uint32 "
+            "option \"" +
+            option_field->full_name() + "\".");
       }
       break;
 
@@ -6814,8 +6748,10 @@
                   uninterpreted_option_->positive_int_value(),
                   option_field->type(), unknown_fields);
       } else {
-        return AddValueError("Value must be non-negative integer for uint64 "
-                             "option \"" + option_field->full_name() + "\".");
+        return AddValueError(
+            "Value must be non-negative integer for uint64 "
+            "option \"" +
+            option_field->full_name() + "\".");
       }
       break;
 
@@ -6856,24 +6792,30 @@
     case FieldDescriptor::CPPTYPE_BOOL:
       uint64 value;
       if (!uninterpreted_option_->has_identifier_value()) {
-        return AddValueError("Value must be identifier for boolean option "
-                             "\"" + option_field->full_name() + "\".");
+        return AddValueError(
+            "Value must be identifier for boolean option "
+            "\"" +
+            option_field->full_name() + "\".");
       }
       if (uninterpreted_option_->identifier_value() == "true") {
         value = 1;
       } else if (uninterpreted_option_->identifier_value() == "false") {
         value = 0;
       } else {
-        return AddValueError("Value must be \"true\" or \"false\" for boolean "
-                             "option \"" + option_field->full_name() + "\".");
+        return AddValueError(
+            "Value must be \"true\" or \"false\" for boolean "
+            "option \"" +
+            option_field->full_name() + "\".");
       }
       unknown_fields->AddVarint(option_field->number(), value);
       break;
 
     case FieldDescriptor::CPPTYPE_ENUM: {
       if (!uninterpreted_option_->has_identifier_value()) {
-        return AddValueError("Value must be identifier for enum-valued option "
-                             "\"" + option_field->full_name() + "\".");
+        return AddValueError(
+            "Value must be identifier for enum-valued option "
+            "\"" +
+            option_field->full_name() + "\".");
       }
       const EnumDescriptor* enum_type = option_field->enum_type();
       const std::string& value_name = uninterpreted_option_->identifier_value();
@@ -6892,10 +6834,11 @@
         // DescriptorPool::FindEnumValueByName() because we're already holding
         // the pool's mutex, and the latter method locks it again.
         Symbol symbol =
-          builder_->FindSymbolNotEnforcingDeps(fully_qualified_name);
+            builder_->FindSymbolNotEnforcingDeps(fully_qualified_name);
         if (!symbol.IsNull() && symbol.type == Symbol::ENUM_VALUE) {
           if (symbol.enum_value_descriptor->type() != enum_type) {
-            return AddValueError("Enum type \"" + enum_type->full_name() +
+            return AddValueError(
+                "Enum type \"" + enum_type->full_name() +
                 "\" has no value named \"" + value_name + "\" for option \"" +
                 option_field->full_name() +
                 "\". This appears to be a value from a sibling type.");
@@ -6912,13 +6855,16 @@
       if (enum_value == NULL) {
         return AddValueError("Enum type \"" +
                              option_field->enum_type()->full_name() +
-                             "\" has no value named \"" + value_name + "\" for "
-                             "option \"" + option_field->full_name() + "\".");
+                             "\" has no value named \"" + value_name +
+                             "\" for "
+                             "option \"" +
+                             option_field->full_name() + "\".");
       } else {
         // Sign-extension is not a problem, since we cast directly from int32 to
         // uint64, without first going through uint32.
-        unknown_fields->AddVarint(option_field->number(),
-          static_cast<uint64>(static_cast<int64>(enum_value->number())));
+        unknown_fields->AddVarint(
+            option_field->number(),
+            static_cast<uint64>(static_cast<int64>(enum_value->number())));
       }
       break;
     }
@@ -6932,7 +6878,7 @@
       }
       // The string has already been unquoted and unescaped by the parser.
       unknown_fields->AddLengthDelimited(option_field->number(),
-          uninterpreted_option_->string_value());
+                                         uninterpreted_option_->string_value());
       break;
 
     case FieldDescriptor::CPPTYPE_MESSAGE:
@@ -6954,8 +6900,8 @@
                                        const std::string& name) const override {
     assert_mutex_held(builder_->pool_);
     const Descriptor* descriptor = message->GetDescriptor();
-    Symbol result = builder_->LookupSymbolNoPlaceholder(
-        name, descriptor->full_name());
+    Symbol result =
+        builder_->LookupSymbolNoPlaceholder(name, descriptor->full_name());
     if (result.type == Symbol::FIELD &&
         result.field_descriptor->is_extension()) {
       return result.field_descriptor;
@@ -7007,16 +6953,16 @@
 // option_field, parse the supplied text-format string into this
 // message, and serialize the resulting message to produce the value.
 bool DescriptorBuilder::OptionInterpreter::SetAggregateOption(
-    const FieldDescriptor* option_field,
-    UnknownFieldSet* unknown_fields) {
+    const FieldDescriptor* option_field, UnknownFieldSet* unknown_fields) {
   if (!uninterpreted_option_->has_aggregate_value()) {
     return AddValueError("Option \"" + option_field->full_name() +
                          "\" is a message. To set the entire message, use "
-                         "syntax like \"" + option_field->name() +
+                         "syntax like \"" +
+                         option_field->name() +
                          " = { <proto text format> }\". "
                          "To set fields within it, use "
-                         "syntax like \"" + option_field->name() +
-                         ".foo = value\".");
+                         "syntax like \"" +
+                         option_field->name() + ".foo = value\".");
   }
 
   const Descriptor* type = option_field->message_type();
@@ -7041,7 +6987,7 @@
     if (option_field->type() == FieldDescriptor::TYPE_MESSAGE) {
       unknown_fields->AddLengthDelimited(option_field->number(), serial);
     } else {
-      GOOGLE_CHECK_EQ(option_field->type(),  FieldDescriptor::TYPE_GROUP);
+      GOOGLE_CHECK_EQ(option_field->type(), FieldDescriptor::TYPE_GROUP);
       UnknownFieldSet* group = unknown_fields->AddGroup(option_field->number());
       group->ParseFromString(serial);
     }
@@ -7049,12 +6995,13 @@
   }
 }
 
-void DescriptorBuilder::OptionInterpreter::SetInt32(int number, int32 value,
-    FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) {
+void DescriptorBuilder::OptionInterpreter::SetInt32(
+    int number, int32 value, FieldDescriptor::Type type,
+    UnknownFieldSet* unknown_fields) {
   switch (type) {
     case FieldDescriptor::TYPE_INT32:
       unknown_fields->AddVarint(number,
-        static_cast<uint64>(static_cast<int64>(value)));
+                                static_cast<uint64>(static_cast<int64>(value)));
       break;
 
     case FieldDescriptor::TYPE_SFIXED32:
@@ -7072,8 +7019,9 @@
   }
 }
 
-void DescriptorBuilder::OptionInterpreter::SetInt64(int number, int64 value,
-    FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) {
+void DescriptorBuilder::OptionInterpreter::SetInt64(
+    int number, int64 value, FieldDescriptor::Type type,
+    UnknownFieldSet* unknown_fields) {
   switch (type) {
     case FieldDescriptor::TYPE_INT64:
       unknown_fields->AddVarint(number, static_cast<uint64>(value));
@@ -7094,8 +7042,9 @@
   }
 }
 
-void DescriptorBuilder::OptionInterpreter::SetUInt32(int number, uint32 value,
-    FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) {
+void DescriptorBuilder::OptionInterpreter::SetUInt32(
+    int number, uint32 value, FieldDescriptor::Type type,
+    UnknownFieldSet* unknown_fields) {
   switch (type) {
     case FieldDescriptor::TYPE_UINT32:
       unknown_fields->AddVarint(number, static_cast<uint64>(value));
@@ -7111,8 +7060,9 @@
   }
 }
 
-void DescriptorBuilder::OptionInterpreter::SetUInt64(int number, uint64 value,
-    FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) {
+void DescriptorBuilder::OptionInterpreter::SetUInt64(
+    int number, uint64 value, FieldDescriptor::Type type,
+    UnknownFieldSet* unknown_fields) {
   switch (type) {
     case FieldDescriptor::TYPE_UINT64:
       unknown_fields->AddVarint(number, value);
@@ -7142,15 +7092,15 @@
     annotation_extensions.insert("google.protobuf.ServiceOptions");
     annotation_extensions.insert("google.protobuf.MethodOptions");
     annotation_extensions.insert("google.protobuf.StreamOptions");
-    for (std::set<const FileDescriptor*>::const_iterator
-             it = unused_dependency_.begin();
+    for (std::set<const FileDescriptor*>::const_iterator it =
+             unused_dependency_.begin();
          it != unused_dependency_.end(); ++it) {
       // Do not log warnings for proto files which extend annotations.
       int i;
-      for (i = 0 ; i < (*it)->extension_count(); ++i) {
+      for (i = 0; i < (*it)->extension_count(); ++i) {
         if (annotation_extensions.find(
-                (*it)->extension(i)->containing_type()->full_name())
-            != annotation_extensions.end()) {
+                (*it)->extension(i)->containing_type()->full_name()) !=
+            annotation_extensions.end()) {
           break;
         }
       }
@@ -7158,7 +7108,7 @@
       if (i == (*it)->extension_count()) {
         std::string error_message =
             "Import " + (*it)->name() + " but not used.";
-        AddWarning((*it)->name(), proto, DescriptorPool::ErrorCollector::OTHER,
+        AddWarning((*it)->name(), proto, DescriptorPool::ErrorCollector::IMPORT,
                    error_message);
       }
     }
diff --git a/src/google/protobuf/descriptor.h b/src/google/protobuf/descriptor.h
index add275c..424bd84 100644
--- a/src/google/protobuf/descriptor.h
+++ b/src/google/protobuf/descriptor.h
@@ -174,7 +174,8 @@
   DebugStringOptions()
       : include_comments(false),
         elide_group_body(false),
-        elide_oneof_body(false) {}
+        elide_oneof_body(false) {
+  }
 };
 
 // A class to handle the simplest cases of a lazily linked descriptor
@@ -523,62 +524,62 @@
   // Identifies a field type.  0 is reserved for errors.  The order is weird
   // for historical reasons.  Types 12 and up are new in proto2.
   enum Type {
-    TYPE_DOUBLE         = 1,   // double, exactly eight bytes on the wire.
-    TYPE_FLOAT          = 2,   // float, exactly four bytes on the wire.
-    TYPE_INT64          = 3,   // int64, varint on the wire.  Negative numbers
-                               // take 10 bytes.  Use TYPE_SINT64 if negative
-                               // values are likely.
-    TYPE_UINT64         = 4,   // uint64, varint on the wire.
-    TYPE_INT32          = 5,   // int32, varint on the wire.  Negative numbers
-                               // take 10 bytes.  Use TYPE_SINT32 if negative
-                               // values are likely.
-    TYPE_FIXED64        = 6,   // uint64, exactly eight bytes on the wire.
-    TYPE_FIXED32        = 7,   // uint32, exactly four bytes on the wire.
-    TYPE_BOOL           = 8,   // bool, varint on the wire.
-    TYPE_STRING         = 9,   // UTF-8 text.
-    TYPE_GROUP          = 10,  // Tag-delimited message.  Deprecated.
-    TYPE_MESSAGE        = 11,  // Length-delimited message.
+    TYPE_DOUBLE = 1,    // double, exactly eight bytes on the wire.
+    TYPE_FLOAT = 2,     // float, exactly four bytes on the wire.
+    TYPE_INT64 = 3,     // int64, varint on the wire.  Negative numbers
+                        // take 10 bytes.  Use TYPE_SINT64 if negative
+                        // values are likely.
+    TYPE_UINT64 = 4,    // uint64, varint on the wire.
+    TYPE_INT32 = 5,     // int32, varint on the wire.  Negative numbers
+                        // take 10 bytes.  Use TYPE_SINT32 if negative
+                        // values are likely.
+    TYPE_FIXED64 = 6,   // uint64, exactly eight bytes on the wire.
+    TYPE_FIXED32 = 7,   // uint32, exactly four bytes on the wire.
+    TYPE_BOOL = 8,      // bool, varint on the wire.
+    TYPE_STRING = 9,    // UTF-8 text.
+    TYPE_GROUP = 10,    // Tag-delimited message.  Deprecated.
+    TYPE_MESSAGE = 11,  // Length-delimited message.
 
-    TYPE_BYTES          = 12,  // Arbitrary byte array.
-    TYPE_UINT32         = 13,  // uint32, varint on the wire
-    TYPE_ENUM           = 14,  // Enum, varint on the wire
-    TYPE_SFIXED32       = 15,  // int32, exactly four bytes on the wire
-    TYPE_SFIXED64       = 16,  // int64, exactly eight bytes on the wire
-    TYPE_SINT32         = 17,  // int32, ZigZag-encoded varint on the wire
-    TYPE_SINT64         = 18,  // int64, ZigZag-encoded varint on the wire
+    TYPE_BYTES = 12,     // Arbitrary byte array.
+    TYPE_UINT32 = 13,    // uint32, varint on the wire
+    TYPE_ENUM = 14,      // Enum, varint on the wire
+    TYPE_SFIXED32 = 15,  // int32, exactly four bytes on the wire
+    TYPE_SFIXED64 = 16,  // int64, exactly eight bytes on the wire
+    TYPE_SINT32 = 17,    // int32, ZigZag-encoded varint on the wire
+    TYPE_SINT64 = 18,    // int64, ZigZag-encoded varint on the wire
 
-    MAX_TYPE            = 18,  // Constant useful for defining lookup tables
-                               // indexed by Type.
+    MAX_TYPE = 18,  // Constant useful for defining lookup tables
+                    // indexed by Type.
   };
 
   // Specifies the C++ data type used to represent the field.  There is a
   // fixed mapping from Type to CppType where each Type maps to exactly one
   // CppType.  0 is reserved for errors.
   enum CppType {
-    CPPTYPE_INT32       = 1,     // TYPE_INT32, TYPE_SINT32, TYPE_SFIXED32
-    CPPTYPE_INT64       = 2,     // TYPE_INT64, TYPE_SINT64, TYPE_SFIXED64
-    CPPTYPE_UINT32      = 3,     // TYPE_UINT32, TYPE_FIXED32
-    CPPTYPE_UINT64      = 4,     // TYPE_UINT64, TYPE_FIXED64
-    CPPTYPE_DOUBLE      = 5,     // TYPE_DOUBLE
-    CPPTYPE_FLOAT       = 6,     // TYPE_FLOAT
-    CPPTYPE_BOOL        = 7,     // TYPE_BOOL
-    CPPTYPE_ENUM        = 8,     // TYPE_ENUM
-    CPPTYPE_STRING      = 9,     // TYPE_STRING, TYPE_BYTES
-    CPPTYPE_MESSAGE     = 10,    // TYPE_MESSAGE, TYPE_GROUP
+    CPPTYPE_INT32 = 1,     // TYPE_INT32, TYPE_SINT32, TYPE_SFIXED32
+    CPPTYPE_INT64 = 2,     // TYPE_INT64, TYPE_SINT64, TYPE_SFIXED64
+    CPPTYPE_UINT32 = 3,    // TYPE_UINT32, TYPE_FIXED32
+    CPPTYPE_UINT64 = 4,    // TYPE_UINT64, TYPE_FIXED64
+    CPPTYPE_DOUBLE = 5,    // TYPE_DOUBLE
+    CPPTYPE_FLOAT = 6,     // TYPE_FLOAT
+    CPPTYPE_BOOL = 7,      // TYPE_BOOL
+    CPPTYPE_ENUM = 8,      // TYPE_ENUM
+    CPPTYPE_STRING = 9,    // TYPE_STRING, TYPE_BYTES
+    CPPTYPE_MESSAGE = 10,  // TYPE_MESSAGE, TYPE_GROUP
 
-    MAX_CPPTYPE         = 10,    // Constant useful for defining lookup tables
-                                 // indexed by CppType.
+    MAX_CPPTYPE = 10,  // Constant useful for defining lookup tables
+                       // indexed by CppType.
   };
 
   // Identifies whether the field is optional, required, or repeated.  0 is
   // reserved for errors.
   enum Label {
-    LABEL_OPTIONAL      = 1,    // optional
-    LABEL_REQUIRED      = 2,    // required
-    LABEL_REPEATED      = 3,    // repeated
+    LABEL_OPTIONAL = 1,  // optional
+    LABEL_REQUIRED = 2,  // required
+    LABEL_REPEATED = 3,  // repeated
 
-    MAX_LABEL           = 3,    // Constant useful for defining lookup tables
-                                // indexed by Label.
+    MAX_LABEL = 3,  // Constant useful for defining lookup tables
+                    // indexed by Label.
   };
 
   // Valid field numbers are positive integers up to kMaxNumber.
@@ -589,14 +590,14 @@
   static const int kFirstReservedNumber = 19000;
   // Last field number reserved for the protocol buffer library implementation.
   // Users may not declare fields that use reserved numbers.
-  static const int kLastReservedNumber  = 19999;
+  static const int kLastReservedNumber = 19999;
 
   const std::string& name() const;  // Name of this field within the message.
   const std::string& full_name() const;  // Fully-qualified name of the field.
   const std::string& json_name() const;  // JSON name of this field.
-  const FileDescriptor* file() const;// File in which this field was defined.
-  bool is_extension() const;         // Is this an extension field?
-  int number() const;                // Declared tag number.
+  const FileDescriptor* file() const;  // File in which this field was defined.
+  bool is_extension() const;           // Is this an extension field?
+  int number() const;                  // Declared tag number.
 
   // Same as name() except converted to lower-case.  This (and especially the
   // FindFieldByLowercaseName() method) can be useful when parsing formats
@@ -623,15 +624,15 @@
   const char* cpp_type_name() const;  // Name of the C++ type.
   Label label() const;                // optional/required/repeated
 
-  bool is_required() const;      // shorthand for label() == LABEL_REQUIRED
-  bool is_optional() const;      // shorthand for label() == LABEL_OPTIONAL
-  bool is_repeated() const;      // shorthand for label() == LABEL_REPEATED
-  bool is_packable() const;      // shorthand for is_repeated() &&
-                                 //               IsTypePackable(type())
-  bool is_packed() const;        // shorthand for is_packable() &&
-                                 //               options().packed()
-  bool is_map() const;           // shorthand for type() == TYPE_MESSAGE &&
-                                 // message_type()->options().map_entry()
+  bool is_required() const;  // shorthand for label() == LABEL_REQUIRED
+  bool is_optional() const;  // shorthand for label() == LABEL_OPTIONAL
+  bool is_repeated() const;  // shorthand for label() == LABEL_REPEATED
+  bool is_packable() const;  // shorthand for is_repeated() &&
+                             //               IsTypePackable(type())
+  bool is_packed() const;    // shorthand for is_packable() &&
+                             //               options().packed()
+  bool is_map() const;       // shorthand for type() == TYPE_MESSAGE &&
+                             // message_type()->options().map_entry()
 
   // Index of this field within the message's field array, or the file or
   // extension scope's extensions array.
@@ -798,13 +799,13 @@
   // descriptor.cc and update them to initialize the field.
 
   union {
-    int32  default_value_int32_;
-    int64  default_value_int64_;
+    int32 default_value_int32_;
+    int64 default_value_int64_;
     uint32 default_value_uint32_;
     uint64 default_value_uint64_;
-    float  default_value_float_;
+    float default_value_float_;
     double default_value_double_;
-    bool   default_value_bool_;
+    bool default_value_bool_;
 
     mutable const EnumValueDescriptor* default_value_enum_;
     const std::string* default_value_string_;
@@ -812,11 +813,11 @@
 
   static const CppType kTypeToCppTypeMap[MAX_TYPE + 1];
 
-  static const char * const kTypeToName[MAX_TYPE + 1];
+  static const char* const kTypeToName[MAX_TYPE + 1];
 
-  static const char * const kCppTypeToName[MAX_CPPTYPE + 1];
+  static const char* const kCppTypeToName[MAX_CPPTYPE + 1];
 
-  static const char * const kLabelToName[MAX_LABEL + 1];
+  static const char* const kLabelToName[MAX_LABEL + 1];
 
   // Must be constructed using DescriptorPool.
   FieldDescriptor() {}
@@ -977,8 +978,8 @@
   bool IsReservedNumber(int number) const;
 
   // Returns NULL if no reserved range contains the given number.
-  const EnumDescriptor::ReservedRange*
-      FindReservedRangeContainingNumber(int number) const;
+  const EnumDescriptor::ReservedRange* FindReservedRangeContainingNumber(
+      int number) const;
 
   // The number of reserved field names in this message type.
   int reserved_name_count() const;
@@ -1011,9 +1012,8 @@
   // This is private but is used by GeneratedMessageReflection (which is
   // friended below) to return a valid EnumValueDescriptor from GetEnum() when
   // this feature is enabled.
-  const EnumValueDescriptor*
-      FindValueByNumberCreatingIfUnknown(int number) const;
-
+  const EnumValueDescriptor* FindValueByNumberCreatingIfUnknown(
+      int number) const;
 
   // See Descriptor::DebugString().
   void DebugString(int depth, std::string* contents,
@@ -1068,8 +1068,8 @@
   typedef EnumValueDescriptorProto Proto;
 
   const std::string& name() const;  // Name of this enum constant.
-  int index() const;           // Index within the enums's Descriptor.
-  int number() const;          // Numeric value of this enum constant.
+  int index() const;                // Index within the enums's Descriptor.
+  int number() const;               // Numeric value of this enum constant.
 
   // The full_name of an enum value is a sibling symbol of the enum type.
   // e.g. the full name of FieldDescriptorProto::TYPE_INT32 is actually
@@ -1381,8 +1381,8 @@
   // Syntax of this file.
   enum Syntax {
     SYNTAX_UNKNOWN = 0,
-    SYNTAX_PROTO2  = 2,
-    SYNTAX_PROTO3  = 3,
+    SYNTAX_PROTO2 = 2,
+    SYNTAX_PROTO3 = 3,
   };
   Syntax syntax() const;
   static const char* SyntaxName(Syntax syntax);
@@ -1618,16 +1618,17 @@
     // This is useful e.g. for mapping the error back to an exact location
     // in a .proto file.
     enum ErrorLocation {
-      NAME,              // the symbol name, or the package name for files
-      NUMBER,            // field or extension range number
-      TYPE,              // field type
-      EXTENDEE,          // field extendee
-      DEFAULT_VALUE,     // field default value
-      INPUT_TYPE,        // method input type
-      OUTPUT_TYPE,       // method output type
-      OPTION_NAME,       // name in assignment
-      OPTION_VALUE,      // value in option assignment
-      OTHER              // some other problem
+      NAME,           // the symbol name, or the package name for files
+      NUMBER,         // field or extension range number
+      TYPE,           // field type
+      EXTENDEE,       // field extendee
+      DEFAULT_VALUE,  // field default value
+      INPUT_TYPE,     // method input type
+      OUTPUT_TYPE,    // method output type
+      OPTION_NAME,    // name in assignment
+      OPTION_VALUE,   // value in option assignment
+      IMPORT,         // import error
+      OTHER           // some other problem
     };
 
     // Reports an error in the FileDescriptorProto. Use this function if the
@@ -1665,8 +1666,7 @@
 
   // Same as BuildFile() except errors are sent to the given ErrorCollector.
   const FileDescriptor* BuildFileCollectingErrors(
-    const FileDescriptorProto& proto,
-    ErrorCollector* error_collector);
+      const FileDescriptorProto& proto, ErrorCollector* error_collector);
 
   // By default, it is an error if a FileDescriptorProto contains references
   // to types or other files that are not found in the DescriptorPool (or its
@@ -1721,8 +1721,8 @@
   // Called by generated classes at init time to add their descriptors to
   // generated_pool.  Do NOT call this in your own code!  filename must be a
   // permanent string (e.g. a string literal).
-  static void InternalAddGeneratedFile(
-      const void* encoded_file_descriptor, int size);
+  static void InternalAddGeneratedFile(const void* encoded_file_descriptor,
+                                       int size);
 
   // Disallow [enforce_utf8 = false] in .proto files.
   void DisallowEnforceUtf8() { disallow_enforce_utf8_ = true; }
@@ -1799,7 +1799,7 @@
   // fallback_database_.  Declared const because it is called by (semantically)
   // const methods.
   const FileDescriptor* BuildFileFromDatabase(
-    const FileDescriptorProto& proto) const;
+      const FileDescriptorProto& proto) const;
 
   // Helper for when lazily_build_dependencies_ is set, can look up a symbol
   // after the file's descriptor is built, and can build the file where that
@@ -1886,8 +1886,7 @@
 PROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_count, int)
 PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension_range,
                                const Descriptor::ExtensionRange*)
-PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension,
-                               const FieldDescriptor*)
+PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension, const FieldDescriptor*)
 
 PROTOBUF_DEFINE_ACCESSOR(Descriptor, reserved_range_count, int)
 PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, reserved_range,
@@ -1914,13 +1913,13 @@
 PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FieldDescriptor, FieldOptions)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_default_value, bool)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_json_name, bool)
-PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32 , int32 )
-PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int64 , int64 )
+PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32, int32)
+PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int64, int64)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint32, uint32)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint64, uint64)
-PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_float , float )
+PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_float, float)
 PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_double, double)
-PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_bool  , bool  )
+PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_bool, bool)
 PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, default_value_string)
 
 PROTOBUF_DEFINE_STRING_ACCESSOR(OneofDescriptor, name)
@@ -2151,14 +2150,11 @@
   return dependency(public_dependencies_[index]);
 }
 
-inline const FileDescriptor* FileDescriptor::weak_dependency(
-    int index) const {
+inline const FileDescriptor* FileDescriptor::weak_dependency(int index) const {
   return dependency(weak_dependencies_[index]);
 }
 
-inline FileDescriptor::Syntax FileDescriptor::syntax() const {
-  return syntax_;
-}
+inline FileDescriptor::Syntax FileDescriptor::syntax() const { return syntax_; }
 
 // Can't use PROTOBUF_DEFINE_ARRAY_ACCESSOR because fields_ is actually an array
 // of pointers rather than the usual array of objects.
diff --git a/src/google/protobuf/descriptor.pb.cc b/src/google/protobuf/descriptor.pb.cc
index 06d6ea0..f85087e 100644
--- a/src/google/protobuf/descriptor.pb.cc
+++ b/src/google/protobuf/descriptor.pb.cc
@@ -564,36 +564,6 @@
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsGeneratedCodeInfo_google_2fprotobuf_2fdescriptor_2eproto}, {
       &scc_info_GeneratedCodeInfo_Annotation_google_2fprotobuf_2fdescriptor_2eproto.base,}};
 
-void InitDefaults_google_2fprotobuf_2fdescriptor_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FileDescriptorSet_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FileDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_DescriptorProto_ExtensionRange_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_DescriptorProto_ReservedRange_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_DescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_ExtensionRangeOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FieldDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_OneofDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumDescriptorProto_EnumReservedRange_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumValueDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_ServiceDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_MethodDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FileOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_MessageOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FieldOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_OneofOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumValueOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_ServiceOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_MethodOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_UninterpretedOption_NamePart_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_UninterpretedOption_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_SourceCodeInfo_Location_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_SourceCodeInfo_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_GeneratedCodeInfo_Annotation_google_2fprotobuf_2fdescriptor_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_GeneratedCodeInfo_google_2fprotobuf_2fdescriptor_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2fdescriptor_2eproto[27];
 static const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* file_level_enum_descriptors_google_2fprotobuf_2fdescriptor_2eproto[6];
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fdescriptor_2eproto = nullptr;
@@ -1203,8 +1173,7 @@
   "le.Protobuf.Reflection"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fdescriptor_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2fdescriptor_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2fdescriptor_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2fdescriptor_2eproto,
   "google/protobuf/descriptor.proto", &assign_descriptors_table_google_2fprotobuf_2fdescriptor_2eproto, 6022,
 };
 
@@ -1212,6 +1181,33 @@
   static constexpr ::PROTOBUF_NAMESPACE_ID::internal::InitFunc deps[1] =
   {
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FileDescriptorSet_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FileDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_DescriptorProto_ExtensionRange_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_DescriptorProto_ReservedRange_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_DescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_ExtensionRangeOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FieldDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_OneofDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumDescriptorProto_EnumReservedRange_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumValueDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_ServiceDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_MethodDescriptorProto_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FileOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_MessageOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FieldOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_OneofOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumValueOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_ServiceOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_MethodOptions_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_UninterpretedOption_NamePart_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_UninterpretedOption_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_SourceCodeInfo_Location_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_SourceCodeInfo_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_GeneratedCodeInfo_Annotation_google_2fprotobuf_2fdescriptor_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_GeneratedCodeInfo_google_2fprotobuf_2fdescriptor_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2fdescriptor_2eproto, deps, 0);
 }
 
@@ -1393,6 +1389,7 @@
 }
 class FileDescriptorSet::HasBitSetters {
  public:
+  using HasBits = decltype(std::declval<FileDescriptorSet>()._has_bits_);
 };
 
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
@@ -1463,35 +1460,43 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* FileDescriptorSet::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated .google.protobuf.FileDescriptorProto file = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_file(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 10 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 10) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool FileDescriptorSet::MergePartialFromCodedStream(
@@ -1695,22 +1700,23 @@
 }
 class FileDescriptorProto::HasBitSetters {
  public:
-  static void set_has_name(FileDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<FileDescriptorProto>()._has_bits_);
+  static void set_has_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_package(FileDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_package(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
   static const PROTOBUF_NAMESPACE_ID::FileOptions& options(const FileDescriptorProto* msg);
-  static void set_has_options(FileDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000008u;
+  static void set_has_options(HasBits* has_bits) {
+    (*has_bits)[0] |= 8u;
   }
   static const PROTOBUF_NAMESPACE_ID::SourceCodeInfo& source_code_info(const FileDescriptorProto* msg);
-  static void set_has_source_code_info(FileDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000010u;
+  static void set_has_source_code_info(HasBits* has_bits) {
+    (*has_bits)[0] |= 16u;
   }
-  static void set_has_syntax(FileDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_syntax(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
 };
 
@@ -1901,138 +1907,160 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* FileDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_name(), ptr, ctx, "google.protobuf.FileDescriptorProto.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string package = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_package(), ptr, ctx, "google.protobuf.FileDescriptorProto.package");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated string dependency = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(add_dependency(), ptr, ctx, "google.protobuf.FileDescriptorProto.dependency");
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 26 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 26) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.DescriptorProto message_type = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_message_type(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 34 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 34) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.EnumDescriptorProto enum_type = 5;
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 42) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_enum_type(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 42 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 42) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.ServiceDescriptorProto service = 6;
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 50) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_service(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 50 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 50) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.FieldDescriptorProto extension = 7;
       case 7: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_extension(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 58 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 58) break;
+          ptr += 1;
+        }
         break;
       }
       // optional .google.protobuf.FileOptions options = 8;
       case 8: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 66) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_options(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.SourceCodeInfo source_code_info = 9;
       case 9: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 74) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_source_code_info(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated int32 public_dependency = 10;
       case 10: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 80) {
-          do {
+          while (true) {
             add_public_dependency(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-            GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-            if (ctx->Done(&ptr)) return ptr;
-          } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 80 && (ptr += 1));
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+            if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 80) break;
+            ptr += 1;
+          }
           break;
         } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 82) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedInt32Parser(mutable_public_dependency(), ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated int32 weak_dependency = 11;
       case 11: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 88) {
-          do {
+          while (true) {
             add_weak_dependency(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-            GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-            if (ctx->Done(&ptr)) return ptr;
-          } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 88 && (ptr += 1));
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+            if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 88) break;
+            ptr += 1;
+          }
           break;
         } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 90) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedInt32Parser(mutable_weak_dependency(), ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string syntax = 12;
       case 12: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 98) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_syntax(), ptr, ctx, "google.protobuf.FileDescriptorProto.syntax");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool FileDescriptorProto::MergePartialFromCodedStream(
@@ -2705,15 +2733,16 @@
 }
 class DescriptorProto_ExtensionRange::HasBitSetters {
  public:
-  static void set_has_start(DescriptorProto_ExtensionRange* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  using HasBits = decltype(std::declval<DescriptorProto_ExtensionRange>()._has_bits_);
+  static void set_has_start(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
-  static void set_has_end(DescriptorProto_ExtensionRange* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_end(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
   static const PROTOBUF_NAMESPACE_ID::ExtensionRangeOptions& options(const DescriptorProto_ExtensionRange* msg);
-  static void set_has_options(DescriptorProto_ExtensionRange* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  static void set_has_options(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
 };
 
@@ -2823,46 +2852,56 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* DescriptorProto_ExtensionRange::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional int32 start = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_start(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_start(&has_bits);
+        start_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional int32 end = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_end(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_end(&has_bits);
+        end_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.ExtensionRangeOptions options = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_options(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool DescriptorProto_ExtensionRange::MergePartialFromCodedStream(
@@ -2878,7 +2917,7 @@
       // optional int32 start = 1;
       case 1: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (8 & 0xFF)) {
-          HasBitSetters::set_has_start(this);
+          HasBitSetters::set_has_start(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &start_)));
@@ -2891,7 +2930,7 @@
       // optional int32 end = 2;
       case 2: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) {
-          HasBitSetters::set_has_end(this);
+          HasBitSetters::set_has_end(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &end_)));
@@ -3135,11 +3174,12 @@
 }
 class DescriptorProto_ReservedRange::HasBitSetters {
  public:
-  static void set_has_start(DescriptorProto_ReservedRange* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<DescriptorProto_ReservedRange>()._has_bits_);
+  static void set_has_start(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_end(DescriptorProto_ReservedRange* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_end(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -3219,39 +3259,49 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* DescriptorProto_ReservedRange::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional int32 start = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_start(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_start(&has_bits);
+        start_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional int32 end = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_end(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_end(&has_bits);
+        end_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool DescriptorProto_ReservedRange::MergePartialFromCodedStream(
@@ -3267,7 +3317,7 @@
       // optional int32 start = 1;
       case 1: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (8 & 0xFF)) {
-          HasBitSetters::set_has_start(this);
+          HasBitSetters::set_has_start(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &start_)));
@@ -3280,7 +3330,7 @@
       // optional int32 end = 2;
       case 2: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) {
-          HasBitSetters::set_has_end(this);
+          HasBitSetters::set_has_end(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &end_)));
@@ -3488,12 +3538,13 @@
 }
 class DescriptorProto::HasBitSetters {
  public:
-  static void set_has_name(DescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<DescriptorProto>()._has_bits_);
+  static void set_has_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
   static const PROTOBUF_NAMESPACE_ID::MessageOptions& options(const DescriptorProto* msg);
-  static void set_has_options(DescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_options(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -3636,119 +3687,143 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* DescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_name(), ptr, ctx, "google.protobuf.DescriptorProto.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.FieldDescriptorProto field = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_field(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 18 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 18) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.DescriptorProto nested_type = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_nested_type(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 26 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 26) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.EnumDescriptorProto enum_type = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_enum_type(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 34 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 34) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5;
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 42) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_extension_range(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 42 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 42) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.FieldDescriptorProto extension = 6;
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 50) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_extension(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 50 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 50) break;
+          ptr += 1;
+        }
         break;
       }
       // optional .google.protobuf.MessageOptions options = 7;
       case 7: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_options(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.OneofDescriptorProto oneof_decl = 8;
       case 8: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 66) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_oneof_decl(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 66 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 66) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.DescriptorProto.ReservedRange reserved_range = 9;
       case 9: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 74) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_reserved_range(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 74 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 74) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated string reserved_name = 10;
       case 10: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 82) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(add_reserved_name(), ptr, ctx, "google.protobuf.DescriptorProto.reserved_name");
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 82 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 82) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool DescriptorProto::MergePartialFromCodedStream(
@@ -4339,6 +4414,7 @@
 }
 class ExtensionRangeOptions::HasBitSetters {
  public:
+  using HasBits = decltype(std::declval<ExtensionRangeOptions>()._has_bits_);
 };
 
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
@@ -4412,41 +4488,49 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* ExtensionRangeOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_uninterpreted_option(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 65535) == 16058 && (ptr += 2));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint16>(ptr) != 16058) break;
+          ptr += 2;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
       if ((8000u <= tag)) {
         ptr = _extensions_.ParseField(tag, ptr, 
             internal_default_instance(), &_internal_metadata_, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool ExtensionRangeOptions::MergePartialFromCodedStream(
@@ -4669,36 +4753,37 @@
 }
 class FieldDescriptorProto::HasBitSetters {
  public:
-  static void set_has_name(FieldDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<FieldDescriptorProto>()._has_bits_);
+  static void set_has_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_number(FieldDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000040u;
+  static void set_has_number(HasBits* has_bits) {
+    (*has_bits)[0] |= 64u;
   }
-  static void set_has_label(FieldDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000100u;
+  static void set_has_label(HasBits* has_bits) {
+    (*has_bits)[0] |= 256u;
   }
-  static void set_has_type(FieldDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000200u;
+  static void set_has_type(HasBits* has_bits) {
+    (*has_bits)[0] |= 512u;
   }
-  static void set_has_type_name(FieldDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_type_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
-  static void set_has_extendee(FieldDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_extendee(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
-  static void set_has_default_value(FieldDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000008u;
+  static void set_has_default_value(HasBits* has_bits) {
+    (*has_bits)[0] |= 8u;
   }
-  static void set_has_oneof_index(FieldDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000080u;
+  static void set_has_oneof_index(HasBits* has_bits) {
+    (*has_bits)[0] |= 128u;
   }
-  static void set_has_json_name(FieldDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000010u;
+  static void set_has_json_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 16u;
   }
   static const PROTOBUF_NAMESPACE_ID::FieldOptions& options(const FieldDescriptorProto* msg);
-  static void set_has_options(FieldDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000020u;
+  static void set_has_options(HasBits* has_bits) {
+    (*has_bits)[0] |= 32u;
   }
 };
 
@@ -4873,38 +4958,41 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* FieldDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_name(), ptr, ctx, "google.protobuf.FieldDescriptorProto.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string extendee = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_extendee(), ptr, ctx, "google.protobuf.FieldDescriptorProto.extendee");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional int32 number = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 24) goto handle_unusual;
-        set_number(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_number(&has_bits);
+        number_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.FieldDescriptorProto.Label label = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 32) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         if (!PROTOBUF_NAMESPACE_ID::FieldDescriptorProto_Label_IsValid(val)) {
           ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(4, val, mutable_unknown_fields());
           break;
@@ -4916,7 +5004,7 @@
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 40) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         if (!PROTOBUF_NAMESPACE_ID::FieldDescriptorProto_Type_IsValid(val)) {
           ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(5, val, mutable_unknown_fields());
           break;
@@ -4928,50 +5016,57 @@
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 50) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_type_name(), ptr, ctx, "google.protobuf.FieldDescriptorProto.type_name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string default_value = 7;
       case 7: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_default_value(), ptr, ctx, "google.protobuf.FieldDescriptorProto.default_value");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.FieldOptions options = 8;
       case 8: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 66) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_options(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional int32 oneof_index = 9;
       case 9: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 72) goto handle_unusual;
-        set_oneof_index(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_oneof_index(&has_bits);
+        oneof_index_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional string json_name = 10;
       case 10: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 82) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_json_name(), ptr, ctx, "google.protobuf.FieldDescriptorProto.json_name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool FieldDescriptorProto::MergePartialFromCodedStream(
@@ -5017,7 +5112,7 @@
       // optional int32 number = 3;
       case 3: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (24 & 0xFF)) {
-          HasBitSetters::set_has_number(this);
+          HasBitSetters::set_has_number(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &number_)));
@@ -5109,7 +5204,7 @@
       // optional int32 oneof_index = 9;
       case 9: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (72 & 0xFF)) {
-          HasBitSetters::set_has_oneof_index(this);
+          HasBitSetters::set_has_oneof_index(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &oneof_index_)));
@@ -5573,12 +5668,13 @@
 }
 class OneofDescriptorProto::HasBitSetters {
  public:
-  static void set_has_name(OneofDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<OneofDescriptorProto>()._has_bits_);
+  static void set_has_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
   static const PROTOBUF_NAMESPACE_ID::OneofOptions& options(const OneofDescriptorProto* msg);
-  static void set_has_options(OneofDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_options(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -5689,39 +5785,47 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* OneofDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_name(), ptr, ctx, "google.protobuf.OneofDescriptorProto.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.OneofOptions options = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_options(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool OneofDescriptorProto::MergePartialFromCodedStream(
@@ -5973,11 +6077,12 @@
 }
 class EnumDescriptorProto_EnumReservedRange::HasBitSetters {
  public:
-  static void set_has_start(EnumDescriptorProto_EnumReservedRange* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<EnumDescriptorProto_EnumReservedRange>()._has_bits_);
+  static void set_has_start(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_end(EnumDescriptorProto_EnumReservedRange* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_end(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -6057,39 +6162,49 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* EnumDescriptorProto_EnumReservedRange::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional int32 start = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_start(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_start(&has_bits);
+        start_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional int32 end = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_end(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_end(&has_bits);
+        end_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool EnumDescriptorProto_EnumReservedRange::MergePartialFromCodedStream(
@@ -6105,7 +6220,7 @@
       // optional int32 start = 1;
       case 1: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (8 & 0xFF)) {
-          HasBitSetters::set_has_start(this);
+          HasBitSetters::set_has_start(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &start_)));
@@ -6118,7 +6233,7 @@
       // optional int32 end = 2;
       case 2: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) {
-          HasBitSetters::set_has_end(this);
+          HasBitSetters::set_has_end(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &end_)));
@@ -6326,12 +6441,13 @@
 }
 class EnumDescriptorProto::HasBitSetters {
  public:
-  static void set_has_name(EnumDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<EnumDescriptorProto>()._has_bits_);
+  static void set_has_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
   static const PROTOBUF_NAMESPACE_ID::EnumOptions& options(const EnumDescriptorProto* msg);
-  static void set_has_options(EnumDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_options(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -6454,69 +6570,83 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* EnumDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_name(), ptr, ctx, "google.protobuf.EnumDescriptorProto.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.EnumValueDescriptorProto value = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_value(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 18 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 18) break;
+          ptr += 1;
+        }
         break;
       }
       // optional .google.protobuf.EnumOptions options = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_options(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.EnumDescriptorProto.EnumReservedRange reserved_range = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_reserved_range(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 34 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 34) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated string reserved_name = 5;
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 42) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(add_reserved_name(), ptr, ctx, "google.protobuf.EnumDescriptorProto.reserved_name");
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 42 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 42) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool EnumDescriptorProto::MergePartialFromCodedStream(
@@ -6899,15 +7029,16 @@
 }
 class EnumValueDescriptorProto::HasBitSetters {
  public:
-  static void set_has_name(EnumValueDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<EnumValueDescriptorProto>()._has_bits_);
+  static void set_has_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_number(EnumValueDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_number(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
   static const PROTOBUF_NAMESPACE_ID::EnumValueOptions& options(const EnumValueDescriptorProto* msg);
-  static void set_has_options(EnumValueDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_options(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -7023,46 +7154,55 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* EnumValueDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_name(), ptr, ctx, "google.protobuf.EnumValueDescriptorProto.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional int32 number = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_number(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_number(&has_bits);
+        number_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.EnumValueOptions options = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_options(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool EnumValueDescriptorProto::MergePartialFromCodedStream(
@@ -7093,7 +7233,7 @@
       // optional int32 number = 2;
       case 2: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) {
-          HasBitSetters::set_has_number(this);
+          HasBitSetters::set_has_number(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &number_)));
@@ -7351,12 +7491,13 @@
 }
 class ServiceDescriptorProto::HasBitSetters {
  public:
-  static void set_has_name(ServiceDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<ServiceDescriptorProto>()._has_bits_);
+  static void set_has_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
   static const PROTOBUF_NAMESPACE_ID::ServiceOptions& options(const ServiceDescriptorProto* msg);
-  static void set_has_options(ServiceDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_options(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -7471,49 +7612,59 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* ServiceDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_name(), ptr, ctx, "google.protobuf.ServiceDescriptorProto.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.MethodDescriptorProto method = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_method(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 18 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 18) break;
+          ptr += 1;
+        }
         break;
       }
       // optional .google.protobuf.ServiceOptions options = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_options(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool ServiceDescriptorProto::MergePartialFromCodedStream(
@@ -7809,24 +7960,25 @@
 }
 class MethodDescriptorProto::HasBitSetters {
  public:
-  static void set_has_name(MethodDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<MethodDescriptorProto>()._has_bits_);
+  static void set_has_name(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_input_type(MethodDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_input_type(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
-  static void set_has_output_type(MethodDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_output_type(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
   static const PROTOBUF_NAMESPACE_ID::MethodOptions& options(const MethodDescriptorProto* msg);
-  static void set_has_options(MethodDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000008u;
+  static void set_has_options(HasBits* has_bits) {
+    (*has_bits)[0] |= 8u;
   }
-  static void set_has_client_streaming(MethodDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000010u;
+  static void set_has_client_streaming(HasBits* has_bits) {
+    (*has_bits)[0] |= 16u;
   }
-  static void set_has_server_streaming(MethodDescriptorProto* msg) {
-    msg->_has_bits_[0] |= 0x00000020u;
+  static void set_has_server_streaming(HasBits* has_bits) {
+    (*has_bits)[0] |= 32u;
   }
 };
 
@@ -7969,67 +8121,77 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* MethodDescriptorProto::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_name(), ptr, ctx, "google.protobuf.MethodDescriptorProto.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string input_type = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_input_type(), ptr, ctx, "google.protobuf.MethodDescriptorProto.input_type");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string output_type = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_output_type(), ptr, ctx, "google.protobuf.MethodDescriptorProto.output_type");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.MethodOptions options = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_options(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool client_streaming = 5 [default = false];
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 40) goto handle_unusual;
-        set_client_streaming(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_client_streaming(&has_bits);
+        client_streaming_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool server_streaming = 6 [default = false];
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 48) goto handle_unusual;
-        set_server_streaming(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_server_streaming(&has_bits);
+        server_streaming_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool MethodDescriptorProto::MergePartialFromCodedStream(
@@ -8101,7 +8263,7 @@
       // optional bool client_streaming = 5 [default = false];
       case 5: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (40 & 0xFF)) {
-          HasBitSetters::set_has_client_streaming(this);
+          HasBitSetters::set_has_client_streaming(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &client_streaming_)));
@@ -8114,7 +8276,7 @@
       // optional bool server_streaming = 6 [default = false];
       case 6: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (48 & 0xFF)) {
-          HasBitSetters::set_has_server_streaming(this);
+          HasBitSetters::set_has_server_streaming(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &server_streaming_)));
@@ -8442,65 +8604,66 @@
 }
 class FileOptions::HasBitSetters {
  public:
-  static void set_has_java_package(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<FileOptions>()._has_bits_);
+  static void set_has_java_package(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_java_outer_classname(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_java_outer_classname(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
-  static void set_has_java_multiple_files(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000400u;
+  static void set_has_java_multiple_files(HasBits* has_bits) {
+    (*has_bits)[0] |= 1024u;
   }
-  static void set_has_java_generate_equals_and_hash(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000800u;
+  static void set_has_java_generate_equals_and_hash(HasBits* has_bits) {
+    (*has_bits)[0] |= 2048u;
   }
-  static void set_has_java_string_check_utf8(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00001000u;
+  static void set_has_java_string_check_utf8(HasBits* has_bits) {
+    (*has_bits)[0] |= 4096u;
   }
-  static void set_has_optimize_for(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00080000u;
+  static void set_has_optimize_for(HasBits* has_bits) {
+    (*has_bits)[0] |= 524288u;
   }
-  static void set_has_go_package(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_go_package(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
-  static void set_has_cc_generic_services(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00002000u;
+  static void set_has_cc_generic_services(HasBits* has_bits) {
+    (*has_bits)[0] |= 8192u;
   }
-  static void set_has_java_generic_services(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00004000u;
+  static void set_has_java_generic_services(HasBits* has_bits) {
+    (*has_bits)[0] |= 16384u;
   }
-  static void set_has_py_generic_services(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00008000u;
+  static void set_has_py_generic_services(HasBits* has_bits) {
+    (*has_bits)[0] |= 32768u;
   }
-  static void set_has_php_generic_services(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00010000u;
+  static void set_has_php_generic_services(HasBits* has_bits) {
+    (*has_bits)[0] |= 65536u;
   }
-  static void set_has_deprecated(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00020000u;
+  static void set_has_deprecated(HasBits* has_bits) {
+    (*has_bits)[0] |= 131072u;
   }
-  static void set_has_cc_enable_arenas(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00040000u;
+  static void set_has_cc_enable_arenas(HasBits* has_bits) {
+    (*has_bits)[0] |= 262144u;
   }
-  static void set_has_objc_class_prefix(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000008u;
+  static void set_has_objc_class_prefix(HasBits* has_bits) {
+    (*has_bits)[0] |= 8u;
   }
-  static void set_has_csharp_namespace(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000010u;
+  static void set_has_csharp_namespace(HasBits* has_bits) {
+    (*has_bits)[0] |= 16u;
   }
-  static void set_has_swift_prefix(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000020u;
+  static void set_has_swift_prefix(HasBits* has_bits) {
+    (*has_bits)[0] |= 32u;
   }
-  static void set_has_php_class_prefix(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000040u;
+  static void set_has_php_class_prefix(HasBits* has_bits) {
+    (*has_bits)[0] |= 64u;
   }
-  static void set_has_php_namespace(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000080u;
+  static void set_has_php_namespace(HasBits* has_bits) {
+    (*has_bits)[0] |= 128u;
   }
-  static void set_has_php_metadata_namespace(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000100u;
+  static void set_has_php_metadata_namespace(HasBits* has_bits) {
+    (*has_bits)[0] |= 256u;
   }
-  static void set_has_ruby_package(FileOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000200u;
+  static void set_has_ruby_package(HasBits* has_bits) {
+    (*has_bits)[0] |= 512u;
   }
 };
 
@@ -8718,31 +8881,33 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* FileOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional string java_package = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_java_package(), ptr, ctx, "google.protobuf.FileOptions.java_package");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string java_outer_classname = 8;
       case 8: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 66) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_java_outer_classname(), ptr, ctx, "google.protobuf.FileOptions.java_outer_classname");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED];
       case 9: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 72) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         if (!PROTOBUF_NAMESPACE_ID::FileOptions_OptimizeMode_IsValid(val)) {
           ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(9, val, mutable_unknown_fields());
           break;
@@ -8753,151 +8918,168 @@
       // optional bool java_multiple_files = 10 [default = false];
       case 10: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 80) goto handle_unusual;
-        set_java_multiple_files(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_java_multiple_files(&has_bits);
+        java_multiple_files_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional string go_package = 11;
       case 11: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 90) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_go_package(), ptr, ctx, "google.protobuf.FileOptions.go_package");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool cc_generic_services = 16 [default = false];
       case 16: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 128) goto handle_unusual;
-        set_cc_generic_services(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_cc_generic_services(&has_bits);
+        cc_generic_services_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool java_generic_services = 17 [default = false];
       case 17: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 136) goto handle_unusual;
-        set_java_generic_services(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_java_generic_services(&has_bits);
+        java_generic_services_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool py_generic_services = 18 [default = false];
       case 18: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 144) goto handle_unusual;
-        set_py_generic_services(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_py_generic_services(&has_bits);
+        py_generic_services_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool java_generate_equals_and_hash = 20 [deprecated = true];
       case 20: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 160) goto handle_unusual;
-        set_java_generate_equals_and_hash(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_java_generate_equals_and_hash(&has_bits);
+        java_generate_equals_and_hash_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool deprecated = 23 [default = false];
       case 23: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 184) goto handle_unusual;
-        set_deprecated(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_deprecated(&has_bits);
+        deprecated_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool java_string_check_utf8 = 27 [default = false];
       case 27: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 216) goto handle_unusual;
-        set_java_string_check_utf8(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_java_string_check_utf8(&has_bits);
+        java_string_check_utf8_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool cc_enable_arenas = 31 [default = false];
       case 31: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 248) goto handle_unusual;
-        set_cc_enable_arenas(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_cc_enable_arenas(&has_bits);
+        cc_enable_arenas_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional string objc_class_prefix = 36;
       case 36: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_objc_class_prefix(), ptr, ctx, "google.protobuf.FileOptions.objc_class_prefix");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string csharp_namespace = 37;
       case 37: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 42) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_csharp_namespace(), ptr, ctx, "google.protobuf.FileOptions.csharp_namespace");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string swift_prefix = 39;
       case 39: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_swift_prefix(), ptr, ctx, "google.protobuf.FileOptions.swift_prefix");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string php_class_prefix = 40;
       case 40: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 66) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_php_class_prefix(), ptr, ctx, "google.protobuf.FileOptions.php_class_prefix");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string php_namespace = 41;
       case 41: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 74) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_php_namespace(), ptr, ctx, "google.protobuf.FileOptions.php_namespace");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool php_generic_services = 42 [default = false];
       case 42: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 80) goto handle_unusual;
-        set_php_generic_services(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_php_generic_services(&has_bits);
+        php_generic_services_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional string php_metadata_namespace = 44;
       case 44: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 98) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_php_metadata_namespace(), ptr, ctx, "google.protobuf.FileOptions.php_metadata_namespace");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string ruby_package = 45;
       case 45: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 106) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_ruby_package(), ptr, ctx, "google.protobuf.FileOptions.ruby_package");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_uninterpreted_option(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 65535) == 16058 && (ptr += 2));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint16>(ptr) != 16058) break;
+          ptr += 2;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
       if ((8000u <= tag)) {
         ptr = _extensions_.ParseField(tag, ptr, 
             internal_default_instance(), &_internal_metadata_, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool FileOptions::MergePartialFromCodedStream(
@@ -8962,7 +9144,7 @@
       // optional bool java_multiple_files = 10 [default = false];
       case 10: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (80 & 0xFF)) {
-          HasBitSetters::set_has_java_multiple_files(this);
+          HasBitSetters::set_has_java_multiple_files(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &java_multiple_files_)));
@@ -8990,7 +9172,7 @@
       // optional bool cc_generic_services = 16 [default = false];
       case 16: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (128 & 0xFF)) {
-          HasBitSetters::set_has_cc_generic_services(this);
+          HasBitSetters::set_has_cc_generic_services(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &cc_generic_services_)));
@@ -9003,7 +9185,7 @@
       // optional bool java_generic_services = 17 [default = false];
       case 17: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (136 & 0xFF)) {
-          HasBitSetters::set_has_java_generic_services(this);
+          HasBitSetters::set_has_java_generic_services(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &java_generic_services_)));
@@ -9016,7 +9198,7 @@
       // optional bool py_generic_services = 18 [default = false];
       case 18: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (144 & 0xFF)) {
-          HasBitSetters::set_has_py_generic_services(this);
+          HasBitSetters::set_has_py_generic_services(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &py_generic_services_)));
@@ -9029,7 +9211,7 @@
       // optional bool java_generate_equals_and_hash = 20 [deprecated = true];
       case 20: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (160 & 0xFF)) {
-          HasBitSetters::set_has_java_generate_equals_and_hash(this);
+          HasBitSetters::set_has_java_generate_equals_and_hash(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &java_generate_equals_and_hash_)));
@@ -9042,7 +9224,7 @@
       // optional bool deprecated = 23 [default = false];
       case 23: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (184 & 0xFF)) {
-          HasBitSetters::set_has_deprecated(this);
+          HasBitSetters::set_has_deprecated(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
@@ -9055,7 +9237,7 @@
       // optional bool java_string_check_utf8 = 27 [default = false];
       case 27: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (216 & 0xFF)) {
-          HasBitSetters::set_has_java_string_check_utf8(this);
+          HasBitSetters::set_has_java_string_check_utf8(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &java_string_check_utf8_)));
@@ -9068,7 +9250,7 @@
       // optional bool cc_enable_arenas = 31 [default = false];
       case 31: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (248 & 0xFF)) {
-          HasBitSetters::set_has_cc_enable_arenas(this);
+          HasBitSetters::set_has_cc_enable_arenas(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &cc_enable_arenas_)));
@@ -9156,7 +9338,7 @@
       // optional bool php_generic_services = 42 [default = false];
       case 42: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (336 & 0xFF)) {
-          HasBitSetters::set_has_php_generic_services(this);
+          HasBitSetters::set_has_php_generic_services(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &php_generic_services_)));
@@ -9945,17 +10127,18 @@
 }
 class MessageOptions::HasBitSetters {
  public:
-  static void set_has_message_set_wire_format(MessageOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<MessageOptions>()._has_bits_);
+  static void set_has_message_set_wire_format(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_no_standard_descriptor_accessor(MessageOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_no_standard_descriptor_accessor(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
-  static void set_has_deprecated(MessageOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_deprecated(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
-  static void set_has_map_entry(MessageOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000008u;
+  static void set_has_map_entry(HasBits* has_bits) {
+    (*has_bits)[0] |= 8u;
   }
 };
 
@@ -10043,69 +10226,83 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* MessageOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional bool message_set_wire_format = 1 [default = false];
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_message_set_wire_format(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_message_set_wire_format(&has_bits);
+        message_set_wire_format_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool no_standard_descriptor_accessor = 2 [default = false];
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_no_standard_descriptor_accessor(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_no_standard_descriptor_accessor(&has_bits);
+        no_standard_descriptor_accessor_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool deprecated = 3 [default = false];
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 24) goto handle_unusual;
-        set_deprecated(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_deprecated(&has_bits);
+        deprecated_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool map_entry = 7;
       case 7: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 56) goto handle_unusual;
-        set_map_entry(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_map_entry(&has_bits);
+        map_entry_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_uninterpreted_option(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 65535) == 16058 && (ptr += 2));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint16>(ptr) != 16058) break;
+          ptr += 2;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
       if ((8000u <= tag)) {
         ptr = _extensions_.ParseField(tag, ptr, 
             internal_default_instance(), &_internal_metadata_, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool MessageOptions::MergePartialFromCodedStream(
@@ -10121,7 +10318,7 @@
       // optional bool message_set_wire_format = 1 [default = false];
       case 1: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (8 & 0xFF)) {
-          HasBitSetters::set_has_message_set_wire_format(this);
+          HasBitSetters::set_has_message_set_wire_format(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &message_set_wire_format_)));
@@ -10134,7 +10331,7 @@
       // optional bool no_standard_descriptor_accessor = 2 [default = false];
       case 2: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) {
-          HasBitSetters::set_has_no_standard_descriptor_accessor(this);
+          HasBitSetters::set_has_no_standard_descriptor_accessor(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &no_standard_descriptor_accessor_)));
@@ -10147,7 +10344,7 @@
       // optional bool deprecated = 3 [default = false];
       case 3: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (24 & 0xFF)) {
-          HasBitSetters::set_has_deprecated(this);
+          HasBitSetters::set_has_deprecated(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
@@ -10160,7 +10357,7 @@
       // optional bool map_entry = 7;
       case 7: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (56 & 0xFF)) {
-          HasBitSetters::set_has_map_entry(this);
+          HasBitSetters::set_has_map_entry(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &map_entry_)));
@@ -10463,23 +10660,24 @@
 }
 class FieldOptions::HasBitSetters {
  public:
-  static void set_has_ctype(FieldOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<FieldOptions>()._has_bits_);
+  static void set_has_ctype(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_packed(FieldOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_packed(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
-  static void set_has_jstype(FieldOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000020u;
+  static void set_has_jstype(HasBits* has_bits) {
+    (*has_bits)[0] |= 32u;
   }
-  static void set_has_lazy(FieldOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_lazy(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
-  static void set_has_deprecated(FieldOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000008u;
+  static void set_has_deprecated(HasBits* has_bits) {
+    (*has_bits)[0] |= 8u;
   }
-  static void set_has_weak(FieldOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000010u;
+  static void set_has_weak(HasBits* has_bits) {
+    (*has_bits)[0] |= 16u;
   }
 };
 
@@ -10572,17 +10770,19 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* FieldOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING];
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         if (!PROTOBUF_NAMESPACE_ID::FieldOptions_CType_IsValid(val)) {
           ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(1, val, mutable_unknown_fields());
           break;
@@ -10593,29 +10793,32 @@
       // optional bool packed = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_packed(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_packed(&has_bits);
+        packed_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool deprecated = 3 [default = false];
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 24) goto handle_unusual;
-        set_deprecated(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_deprecated(&has_bits);
+        deprecated_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool lazy = 5 [default = false];
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 40) goto handle_unusual;
-        set_lazy(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_lazy(&has_bits);
+        lazy_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.FieldOptions.JSType jstype = 6 [default = JS_NORMAL];
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 48) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         if (!PROTOBUF_NAMESPACE_ID::FieldOptions_JSType_IsValid(val)) {
           ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(6, val, mutable_unknown_fields());
           break;
@@ -10626,39 +10829,48 @@
       // optional bool weak = 10 [default = false];
       case 10: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 80) goto handle_unusual;
-        set_weak(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_weak(&has_bits);
+        weak_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_uninterpreted_option(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 65535) == 16058 && (ptr += 2));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint16>(ptr) != 16058) break;
+          ptr += 2;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
       if ((8000u <= tag)) {
         ptr = _extensions_.ParseField(tag, ptr, 
             internal_default_instance(), &_internal_metadata_, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool FieldOptions::MergePartialFromCodedStream(
@@ -10693,7 +10905,7 @@
       // optional bool packed = 2;
       case 2: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) {
-          HasBitSetters::set_has_packed(this);
+          HasBitSetters::set_has_packed(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &packed_)));
@@ -10706,7 +10918,7 @@
       // optional bool deprecated = 3 [default = false];
       case 3: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (24 & 0xFF)) {
-          HasBitSetters::set_has_deprecated(this);
+          HasBitSetters::set_has_deprecated(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
@@ -10719,7 +10931,7 @@
       // optional bool lazy = 5 [default = false];
       case 5: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (40 & 0xFF)) {
-          HasBitSetters::set_has_lazy(this);
+          HasBitSetters::set_has_lazy(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &lazy_)));
@@ -10751,7 +10963,7 @@
       // optional bool weak = 10 [default = false];
       case 10: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (80 & 0xFF)) {
-          HasBitSetters::set_has_weak(this);
+          HasBitSetters::set_has_weak(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &weak_)));
@@ -11098,6 +11310,7 @@
 }
 class OneofOptions::HasBitSetters {
  public:
+  using HasBits = decltype(std::declval<OneofOptions>()._has_bits_);
 };
 
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
@@ -11171,41 +11384,49 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* OneofOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_uninterpreted_option(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 65535) == 16058 && (ptr += 2));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint16>(ptr) != 16058) break;
+          ptr += 2;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
       if ((8000u <= tag)) {
         ptr = _extensions_.ParseField(tag, ptr, 
             internal_default_instance(), &_internal_metadata_, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool OneofOptions::MergePartialFromCodedStream(
@@ -11426,11 +11647,12 @@
 }
 class EnumOptions::HasBitSetters {
  public:
-  static void set_has_allow_alias(EnumOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<EnumOptions>()._has_bits_);
+  static void set_has_allow_alias(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_deprecated(EnumOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_deprecated(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -11516,55 +11738,67 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* EnumOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional bool allow_alias = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_allow_alias(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_allow_alias(&has_bits);
+        allow_alias_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional bool deprecated = 3 [default = false];
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 24) goto handle_unusual;
-        set_deprecated(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_deprecated(&has_bits);
+        deprecated_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_uninterpreted_option(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 65535) == 16058 && (ptr += 2));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint16>(ptr) != 16058) break;
+          ptr += 2;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
       if ((8000u <= tag)) {
         ptr = _extensions_.ParseField(tag, ptr, 
             internal_default_instance(), &_internal_metadata_, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool EnumOptions::MergePartialFromCodedStream(
@@ -11580,7 +11814,7 @@
       // optional bool allow_alias = 2;
       case 2: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) {
-          HasBitSetters::set_has_allow_alias(this);
+          HasBitSetters::set_has_allow_alias(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &allow_alias_)));
@@ -11593,7 +11827,7 @@
       // optional bool deprecated = 3 [default = false];
       case 3: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (24 & 0xFF)) {
-          HasBitSetters::set_has_deprecated(this);
+          HasBitSetters::set_has_deprecated(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
@@ -11858,8 +12092,9 @@
 }
 class EnumValueOptions::HasBitSetters {
  public:
-  static void set_has_deprecated(EnumValueOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<EnumValueOptions>()._has_bits_);
+  static void set_has_deprecated(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
 };
 
@@ -11938,48 +12173,59 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* EnumValueOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional bool deprecated = 1 [default = false];
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_deprecated(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_deprecated(&has_bits);
+        deprecated_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_uninterpreted_option(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 65535) == 16058 && (ptr += 2));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint16>(ptr) != 16058) break;
+          ptr += 2;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
       if ((8000u <= tag)) {
         ptr = _extensions_.ParseField(tag, ptr, 
             internal_default_instance(), &_internal_metadata_, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool EnumValueOptions::MergePartialFromCodedStream(
@@ -11995,7 +12241,7 @@
       // optional bool deprecated = 1 [default = false];
       case 1: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (8 & 0xFF)) {
-          HasBitSetters::set_has_deprecated(this);
+          HasBitSetters::set_has_deprecated(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
@@ -12235,8 +12481,9 @@
 }
 class ServiceOptions::HasBitSetters {
  public:
-  static void set_has_deprecated(ServiceOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<ServiceOptions>()._has_bits_);
+  static void set_has_deprecated(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
 };
 
@@ -12315,48 +12562,59 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* ServiceOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional bool deprecated = 33 [default = false];
       case 33: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_deprecated(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_deprecated(&has_bits);
+        deprecated_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_uninterpreted_option(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 65535) == 16058 && (ptr += 2));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint16>(ptr) != 16058) break;
+          ptr += 2;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
       if ((8000u <= tag)) {
         ptr = _extensions_.ParseField(tag, ptr, 
             internal_default_instance(), &_internal_metadata_, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool ServiceOptions::MergePartialFromCodedStream(
@@ -12372,7 +12630,7 @@
       // optional bool deprecated = 33 [default = false];
       case 33: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (264 & 0xFF)) {
-          HasBitSetters::set_has_deprecated(this);
+          HasBitSetters::set_has_deprecated(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
@@ -12612,11 +12870,12 @@
 }
 class MethodOptions::HasBitSetters {
  public:
-  static void set_has_deprecated(MethodOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<MethodOptions>()._has_bits_);
+  static void set_has_deprecated(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_idempotency_level(MethodOptions* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_idempotency_level(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -12705,24 +12964,27 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* MethodOptions::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // optional bool deprecated = 33 [default = false];
       case 33: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_deprecated(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_deprecated(&has_bits);
+        deprecated_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional .google.protobuf.MethodOptions.IdempotencyLevel idempotency_level = 34 [default = IDEMPOTENCY_UNKNOWN];
       case 34: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         if (!PROTOBUF_NAMESPACE_ID::MethodOptions_IdempotencyLevel_IsValid(val)) {
           ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(34, val, mutable_unknown_fields());
           break;
@@ -12733,32 +12995,40 @@
       // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999;
       case 999: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_uninterpreted_option(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 65535) == 16058 && (ptr += 2));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint16>(ptr) != 16058) break;
+          ptr += 2;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
       if ((8000u <= tag)) {
         ptr = _extensions_.ParseField(tag, ptr, 
             internal_default_instance(), &_internal_metadata_, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool MethodOptions::MergePartialFromCodedStream(
@@ -12774,7 +13044,7 @@
       // optional bool deprecated = 33 [default = false];
       case 33: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (264 & 0xFF)) {
-          HasBitSetters::set_has_deprecated(this);
+          HasBitSetters::set_has_deprecated(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &deprecated_)));
@@ -13061,11 +13331,12 @@
 }
 class UninterpretedOption_NamePart::HasBitSetters {
  public:
-  static void set_has_name_part(UninterpretedOption_NamePart* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<UninterpretedOption_NamePart>()._has_bits_);
+  static void set_has_name_part(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_is_extension(UninterpretedOption_NamePart* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_is_extension(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -13149,39 +13420,48 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* UninterpretedOption_NamePart::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // required string name_part = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_name_part(), ptr, ctx, "google.protobuf.UninterpretedOption.NamePart.name_part");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // required bool is_extension = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_is_extension(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_is_extension(&has_bits);
+        is_extension_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool UninterpretedOption_NamePart::MergePartialFromCodedStream(
@@ -13212,7 +13492,7 @@
       // required bool is_extension = 2;
       case 2: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (16 & 0xFF)) {
-          HasBitSetters::set_has_is_extension(this);
+          HasBitSetters::set_has_is_extension(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    bool, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_BOOL>(
                  input, &is_extension_)));
@@ -13444,23 +13724,24 @@
 }
 class UninterpretedOption::HasBitSetters {
  public:
-  static void set_has_identifier_value(UninterpretedOption* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<UninterpretedOption>()._has_bits_);
+  static void set_has_identifier_value(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_positive_int_value(UninterpretedOption* msg) {
-    msg->_has_bits_[0] |= 0x00000008u;
+  static void set_has_positive_int_value(HasBits* has_bits) {
+    (*has_bits)[0] |= 8u;
   }
-  static void set_has_negative_int_value(UninterpretedOption* msg) {
-    msg->_has_bits_[0] |= 0x00000010u;
+  static void set_has_negative_int_value(HasBits* has_bits) {
+    (*has_bits)[0] |= 16u;
   }
-  static void set_has_double_value(UninterpretedOption* msg) {
-    msg->_has_bits_[0] |= 0x00000020u;
+  static void set_has_double_value(HasBits* has_bits) {
+    (*has_bits)[0] |= 32u;
   }
-  static void set_has_string_value(UninterpretedOption* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_string_value(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
-  static void set_has_aggregate_value(UninterpretedOption* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_aggregate_value(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
 };
 
@@ -13582,47 +13863,54 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* UninterpretedOption::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated .google.protobuf.UninterpretedOption.NamePart name = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_name(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 18 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 18) break;
+          ptr += 1;
+        }
         break;
       }
       // optional string identifier_value = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_identifier_value(), ptr, ctx, "google.protobuf.UninterpretedOption.identifier_value");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional uint64 positive_int_value = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 32) goto handle_unusual;
-        set_positive_int_value(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_positive_int_value(&has_bits);
+        positive_int_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional int64 negative_int_value = 5;
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 40) goto handle_unusual;
-        set_negative_int_value(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_negative_int_value(&has_bits);
+        negative_int_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional double double_value = 6;
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 49) goto handle_unusual;
-        set_double_value(::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<double>(ptr));
+        HasBitSetters::set_has_double_value(&has_bits);
+        double_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<double>(ptr);
         ptr += sizeof(double);
         break;
       }
@@ -13630,29 +13918,35 @@
       case 7: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 58) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(mutable_string_value(), ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string aggregate_value = 8;
       case 8: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 66) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_aggregate_value(), ptr, ctx, "google.protobuf.UninterpretedOption.aggregate_value");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool UninterpretedOption::MergePartialFromCodedStream(
@@ -13694,7 +13988,7 @@
       // optional uint64 positive_int_value = 4;
       case 4: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (32 & 0xFF)) {
-          HasBitSetters::set_has_positive_int_value(this);
+          HasBitSetters::set_has_positive_int_value(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::uint64, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_UINT64>(
                  input, &positive_int_value_)));
@@ -13707,7 +14001,7 @@
       // optional int64 negative_int_value = 5;
       case 5: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (40 & 0xFF)) {
-          HasBitSetters::set_has_negative_int_value(this);
+          HasBitSetters::set_has_negative_int_value(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int64, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT64>(
                  input, &negative_int_value_)));
@@ -13720,7 +14014,7 @@
       // optional double double_value = 6;
       case 6: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (49 & 0xFF)) {
-          HasBitSetters::set_has_double_value(this);
+          HasBitSetters::set_has_double_value(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    double, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_DOUBLE>(
                  input, &double_value_)));
@@ -14093,11 +14387,12 @@
 }
 class SourceCodeInfo_Location::HasBitSetters {
  public:
-  static void set_has_leading_comments(SourceCodeInfo_Location* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<SourceCodeInfo_Location>()._has_bits_);
+  static void set_has_leading_comments(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_trailing_comments(SourceCodeInfo_Location* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_trailing_comments(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
 };
 
@@ -14202,77 +14497,91 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* SourceCodeInfo_Location::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated int32 path = 1 [packed = true];
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10) {
           ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedInt32Parser(mutable_path(), ptr, ctx);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+          CHK_(ptr);
           break;
         } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        do {
+        while (true) {
           add_path(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 8 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 8) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated int32 span = 2 [packed = true];
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 18) {
           ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedInt32Parser(mutable_span(), ptr, ctx);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+          CHK_(ptr);
           break;
         } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        do {
+        while (true) {
           add_span(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 16 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 16) break;
+          ptr += 1;
+        }
         break;
       }
       // optional string leading_comments = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_leading_comments(), ptr, ctx, "google.protobuf.SourceCodeInfo.Location.leading_comments");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional string trailing_comments = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_trailing_comments(), ptr, ctx, "google.protobuf.SourceCodeInfo.Location.trailing_comments");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated string leading_detached_comments = 6;
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 50) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(add_leading_detached_comments(), ptr, ctx, "google.protobuf.SourceCodeInfo.Location.leading_detached_comments");
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 50 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 50) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool SourceCodeInfo_Location::MergePartialFromCodedStream(
@@ -14694,6 +15003,7 @@
 }
 class SourceCodeInfo::HasBitSetters {
  public:
+  using HasBits = decltype(std::declval<SourceCodeInfo>()._has_bits_);
 };
 
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
@@ -14764,35 +15074,43 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* SourceCodeInfo::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated .google.protobuf.SourceCodeInfo.Location location = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_location(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 10 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 10) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool SourceCodeInfo::MergePartialFromCodedStream(
@@ -14991,14 +15309,15 @@
 }
 class GeneratedCodeInfo_Annotation::HasBitSetters {
  public:
-  static void set_has_source_file(GeneratedCodeInfo_Annotation* msg) {
-    msg->_has_bits_[0] |= 0x00000001u;
+  using HasBits = decltype(std::declval<GeneratedCodeInfo_Annotation>()._has_bits_);
+  static void set_has_source_file(HasBits* has_bits) {
+    (*has_bits)[0] |= 1u;
   }
-  static void set_has_begin(GeneratedCodeInfo_Annotation* msg) {
-    msg->_has_bits_[0] |= 0x00000002u;
+  static void set_has_begin(HasBits* has_bits) {
+    (*has_bits)[0] |= 2u;
   }
-  static void set_has_end(GeneratedCodeInfo_Annotation* msg) {
-    msg->_has_bits_[0] |= 0x00000004u;
+  static void set_has_end(HasBits* has_bits) {
+    (*has_bits)[0] |= 4u;
   }
 };
 
@@ -15095,60 +15414,72 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* GeneratedCodeInfo_Annotation::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  HasBitSetters::HasBits has_bits{};
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated int32 path = 1 [packed = true];
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10) {
           ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedInt32Parser(mutable_path(), ptr, ctx);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+          CHK_(ptr);
           break;
         } else if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        do {
+        while (true) {
           add_path(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 8 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 8) break;
+          ptr += 1;
+        }
         break;
       }
       // optional string source_file = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8Verify(mutable_source_file(), ptr, ctx, "google.protobuf.GeneratedCodeInfo.Annotation.source_file");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // optional int32 begin = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 24) goto handle_unusual;
-        set_begin(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_begin(&has_bits);
+        begin_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // optional int32 end = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 32) goto handle_unusual;
-        set_end(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        HasBitSetters::set_has_end(&has_bits);
+        end_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
+  _has_bits_.Or(has_bits);
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool GeneratedCodeInfo_Annotation::MergePartialFromCodedStream(
@@ -15195,7 +15526,7 @@
       // optional int32 begin = 3;
       case 3: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (24 & 0xFF)) {
-          HasBitSetters::set_has_begin(this);
+          HasBitSetters::set_has_begin(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &begin_)));
@@ -15208,7 +15539,7 @@
       // optional int32 end = 4;
       case 4: {
         if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (32 & 0xFF)) {
-          HasBitSetters::set_has_end(this);
+          HasBitSetters::set_has_end(&_has_bits_);
           DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive<
                    ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>(
                  input, &end_)));
@@ -15488,6 +15819,7 @@
 }
 class GeneratedCodeInfo::HasBitSetters {
  public:
+  using HasBits = decltype(std::declval<GeneratedCodeInfo>()._has_bits_);
 };
 
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
@@ -15558,35 +15890,43 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* GeneratedCodeInfo::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated .google.protobuf.GeneratedCodeInfo.Annotation annotation = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_annotation(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 10 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 10) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool GeneratedCodeInfo::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/descriptor.pb.h b/src/google/protobuf/descriptor.pb.h
index bff027e..5fb18b8 100644
--- a/src/google/protobuf/descriptor.pb.h
+++ b/src/google/protobuf/descriptor.pb.h
@@ -168,7 +168,7 @@
 PROTOBUF_NAMESPACE_CLOSE
 PROTOBUF_NAMESPACE_OPEN
 
-enum FieldDescriptorProto_Type {
+enum FieldDescriptorProto_Type : int {
   FieldDescriptorProto_Type_TYPE_DOUBLE = 1,
   FieldDescriptorProto_Type_TYPE_FLOAT = 2,
   FieldDescriptorProto_Type_TYPE_INT64 = 3,
@@ -194,16 +194,20 @@
 constexpr int FieldDescriptorProto_Type_Type_ARRAYSIZE = FieldDescriptorProto_Type_Type_MAX + 1;
 
 PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* FieldDescriptorProto_Type_descriptor();
-inline const std::string& FieldDescriptorProto_Type_Name(FieldDescriptorProto_Type value) {
+template<typename T>
+inline const std::string& FieldDescriptorProto_Type_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, FieldDescriptorProto_Type>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function FieldDescriptorProto_Type_Name.");
   return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    FieldDescriptorProto_Type_descriptor(), value);
+    FieldDescriptorProto_Type_descriptor(), enum_t_value);
 }
 inline bool FieldDescriptorProto_Type_Parse(
     const std::string& name, FieldDescriptorProto_Type* value) {
   return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FieldDescriptorProto_Type>(
     FieldDescriptorProto_Type_descriptor(), name, value);
 }
-enum FieldDescriptorProto_Label {
+enum FieldDescriptorProto_Label : int {
   FieldDescriptorProto_Label_LABEL_OPTIONAL = 1,
   FieldDescriptorProto_Label_LABEL_REQUIRED = 2,
   FieldDescriptorProto_Label_LABEL_REPEATED = 3
@@ -214,16 +218,20 @@
 constexpr int FieldDescriptorProto_Label_Label_ARRAYSIZE = FieldDescriptorProto_Label_Label_MAX + 1;
 
 PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* FieldDescriptorProto_Label_descriptor();
-inline const std::string& FieldDescriptorProto_Label_Name(FieldDescriptorProto_Label value) {
+template<typename T>
+inline const std::string& FieldDescriptorProto_Label_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, FieldDescriptorProto_Label>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function FieldDescriptorProto_Label_Name.");
   return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    FieldDescriptorProto_Label_descriptor(), value);
+    FieldDescriptorProto_Label_descriptor(), enum_t_value);
 }
 inline bool FieldDescriptorProto_Label_Parse(
     const std::string& name, FieldDescriptorProto_Label* value) {
   return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FieldDescriptorProto_Label>(
     FieldDescriptorProto_Label_descriptor(), name, value);
 }
-enum FileOptions_OptimizeMode {
+enum FileOptions_OptimizeMode : int {
   FileOptions_OptimizeMode_SPEED = 1,
   FileOptions_OptimizeMode_CODE_SIZE = 2,
   FileOptions_OptimizeMode_LITE_RUNTIME = 3
@@ -234,16 +242,20 @@
 constexpr int FileOptions_OptimizeMode_OptimizeMode_ARRAYSIZE = FileOptions_OptimizeMode_OptimizeMode_MAX + 1;
 
 PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* FileOptions_OptimizeMode_descriptor();
-inline const std::string& FileOptions_OptimizeMode_Name(FileOptions_OptimizeMode value) {
+template<typename T>
+inline const std::string& FileOptions_OptimizeMode_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, FileOptions_OptimizeMode>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function FileOptions_OptimizeMode_Name.");
   return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    FileOptions_OptimizeMode_descriptor(), value);
+    FileOptions_OptimizeMode_descriptor(), enum_t_value);
 }
 inline bool FileOptions_OptimizeMode_Parse(
     const std::string& name, FileOptions_OptimizeMode* value) {
   return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FileOptions_OptimizeMode>(
     FileOptions_OptimizeMode_descriptor(), name, value);
 }
-enum FieldOptions_CType {
+enum FieldOptions_CType : int {
   FieldOptions_CType_STRING = 0,
   FieldOptions_CType_CORD = 1,
   FieldOptions_CType_STRING_PIECE = 2
@@ -254,16 +266,20 @@
 constexpr int FieldOptions_CType_CType_ARRAYSIZE = FieldOptions_CType_CType_MAX + 1;
 
 PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* FieldOptions_CType_descriptor();
-inline const std::string& FieldOptions_CType_Name(FieldOptions_CType value) {
+template<typename T>
+inline const std::string& FieldOptions_CType_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, FieldOptions_CType>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function FieldOptions_CType_Name.");
   return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    FieldOptions_CType_descriptor(), value);
+    FieldOptions_CType_descriptor(), enum_t_value);
 }
 inline bool FieldOptions_CType_Parse(
     const std::string& name, FieldOptions_CType* value) {
   return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FieldOptions_CType>(
     FieldOptions_CType_descriptor(), name, value);
 }
-enum FieldOptions_JSType {
+enum FieldOptions_JSType : int {
   FieldOptions_JSType_JS_NORMAL = 0,
   FieldOptions_JSType_JS_STRING = 1,
   FieldOptions_JSType_JS_NUMBER = 2
@@ -274,16 +290,20 @@
 constexpr int FieldOptions_JSType_JSType_ARRAYSIZE = FieldOptions_JSType_JSType_MAX + 1;
 
 PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* FieldOptions_JSType_descriptor();
-inline const std::string& FieldOptions_JSType_Name(FieldOptions_JSType value) {
+template<typename T>
+inline const std::string& FieldOptions_JSType_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, FieldOptions_JSType>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function FieldOptions_JSType_Name.");
   return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    FieldOptions_JSType_descriptor(), value);
+    FieldOptions_JSType_descriptor(), enum_t_value);
 }
 inline bool FieldOptions_JSType_Parse(
     const std::string& name, FieldOptions_JSType* value) {
   return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<FieldOptions_JSType>(
     FieldOptions_JSType_descriptor(), name, value);
 }
-enum MethodOptions_IdempotencyLevel {
+enum MethodOptions_IdempotencyLevel : int {
   MethodOptions_IdempotencyLevel_IDEMPOTENCY_UNKNOWN = 0,
   MethodOptions_IdempotencyLevel_NO_SIDE_EFFECTS = 1,
   MethodOptions_IdempotencyLevel_IDEMPOTENT = 2
@@ -294,9 +314,13 @@
 constexpr int MethodOptions_IdempotencyLevel_IdempotencyLevel_ARRAYSIZE = MethodOptions_IdempotencyLevel_IdempotencyLevel_MAX + 1;
 
 PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* MethodOptions_IdempotencyLevel_descriptor();
-inline const std::string& MethodOptions_IdempotencyLevel_Name(MethodOptions_IdempotencyLevel value) {
+template<typename T>
+inline const std::string& MethodOptions_IdempotencyLevel_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, MethodOptions_IdempotencyLevel>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function MethodOptions_IdempotencyLevel_Name.");
   return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    MethodOptions_IdempotencyLevel_descriptor(), value);
+    MethodOptions_IdempotencyLevel_descriptor(), enum_t_value);
 }
 inline bool MethodOptions_IdempotencyLevel_Parse(
     const std::string& name, MethodOptions_IdempotencyLevel* value) {
@@ -1657,8 +1681,12 @@
   Type_descriptor() {
     return FieldDescriptorProto_Type_descriptor();
   }
-  static inline const std::string& Type_Name(Type value) {
-    return FieldDescriptorProto_Type_Name(value);
+  template<typename T>
+  static inline const std::string& Type_Name(T enum_t_value) {
+    static_assert(::std::is_same<T, Type>::value ||
+      ::std::is_integral<T>::value,
+      "Incorrect type passed to function Type_Name.");
+    return FieldDescriptorProto_Type_Name(enum_t_value);
   }
   static inline bool Type_Parse(const std::string& name,
       Type* value) {
@@ -1685,8 +1713,12 @@
   Label_descriptor() {
     return FieldDescriptorProto_Label_descriptor();
   }
-  static inline const std::string& Label_Name(Label value) {
-    return FieldDescriptorProto_Label_Name(value);
+  template<typename T>
+  static inline const std::string& Label_Name(T enum_t_value) {
+    static_assert(::std::is_same<T, Label>::value ||
+      ::std::is_integral<T>::value,
+      "Incorrect type passed to function Label_Name.");
+    return FieldDescriptorProto_Label_Name(enum_t_value);
   }
   static inline bool Label_Parse(const std::string& name,
       Label* value) {
@@ -3102,8 +3134,12 @@
   OptimizeMode_descriptor() {
     return FileOptions_OptimizeMode_descriptor();
   }
-  static inline const std::string& OptimizeMode_Name(OptimizeMode value) {
-    return FileOptions_OptimizeMode_Name(value);
+  template<typename T>
+  static inline const std::string& OptimizeMode_Name(T enum_t_value) {
+    static_assert(::std::is_same<T, OptimizeMode>::value ||
+      ::std::is_integral<T>::value,
+      "Incorrect type passed to function OptimizeMode_Name.");
+    return FileOptions_OptimizeMode_Name(enum_t_value);
   }
   static inline bool OptimizeMode_Parse(const std::string& name,
       OptimizeMode* value) {
@@ -3762,8 +3798,12 @@
   CType_descriptor() {
     return FieldOptions_CType_descriptor();
   }
-  static inline const std::string& CType_Name(CType value) {
-    return FieldOptions_CType_Name(value);
+  template<typename T>
+  static inline const std::string& CType_Name(T enum_t_value) {
+    static_assert(::std::is_same<T, CType>::value ||
+      ::std::is_integral<T>::value,
+      "Incorrect type passed to function CType_Name.");
+    return FieldOptions_CType_Name(enum_t_value);
   }
   static inline bool CType_Parse(const std::string& name,
       CType* value) {
@@ -3790,8 +3830,12 @@
   JSType_descriptor() {
     return FieldOptions_JSType_descriptor();
   }
-  static inline const std::string& JSType_Name(JSType value) {
-    return FieldOptions_JSType_Name(value);
+  template<typename T>
+  static inline const std::string& JSType_Name(T enum_t_value) {
+    static_assert(::std::is_same<T, JSType>::value ||
+      ::std::is_integral<T>::value,
+      "Incorrect type passed to function JSType_Name.");
+    return FieldOptions_JSType_Name(enum_t_value);
   }
   static inline bool JSType_Parse(const std::string& name,
       JSType* value) {
@@ -4623,8 +4667,12 @@
   IdempotencyLevel_descriptor() {
     return MethodOptions_IdempotencyLevel_descriptor();
   }
-  static inline const std::string& IdempotencyLevel_Name(IdempotencyLevel value) {
-    return MethodOptions_IdempotencyLevel_Name(value);
+  template<typename T>
+  static inline const std::string& IdempotencyLevel_Name(T enum_t_value) {
+    static_assert(::std::is_same<T, IdempotencyLevel>::value ||
+      ::std::is_integral<T>::value,
+      "Incorrect type passed to function IdempotencyLevel_Name.");
+    return MethodOptions_IdempotencyLevel_Name(enum_t_value);
   }
   static inline bool IdempotencyLevel_Parse(const std::string& name,
       IdempotencyLevel* value) {
diff --git a/src/google/protobuf/descriptor_database.cc b/src/google/protobuf/descriptor_database.cc
index 55d6bb1..dbd0f4a 100644
--- a/src/google/protobuf/descriptor_database.cc
+++ b/src/google/protobuf/descriptor_database.cc
@@ -51,8 +51,7 @@
 
 template <typename Value>
 bool SimpleDescriptorDatabase::DescriptorIndex<Value>::AddFile(
-    const FileDescriptorProto& file,
-    Value value) {
+    const FileDescriptorProto& file, Value value) {
   if (!InsertIfNotPresent(&by_name_, file.name(), value)) {
     GOOGLE_LOG(ERROR) << "File already exists in database: " << file.name();
     return false;
@@ -108,8 +107,10 @@
   }
 
   if (IsSubSymbol(iter->first, name)) {
-    GOOGLE_LOG(ERROR) << "Symbol name \"" << name << "\" conflicts with the existing "
-                  "symbol \"" << iter->first << "\".";
+    GOOGLE_LOG(ERROR) << "Symbol name \"" << name
+               << "\" conflicts with the existing "
+                  "symbol \""
+               << iter->first << "\".";
     return false;
   }
 
@@ -121,8 +122,10 @@
   ++iter;
 
   if (iter != by_symbol_.end() && IsSubSymbol(name, iter->first)) {
-    GOOGLE_LOG(ERROR) << "Symbol name \"" << name << "\" conflicts with the existing "
-                  "symbol \"" << iter->first << "\".";
+    GOOGLE_LOG(ERROR) << "Symbol name \"" << name
+               << "\" conflicts with the existing "
+                  "symbol \""
+               << iter->first << "\".";
     return false;
   }
 
@@ -138,8 +141,7 @@
 
 template <typename Value>
 bool SimpleDescriptorDatabase::DescriptorIndex<Value>::AddNestedExtensions(
-    const DescriptorProto& message_type,
-    Value value) {
+    const DescriptorProto& message_type, Value value) {
   for (int i = 0; i < message_type.nested_type_size(); i++) {
     if (!AddNestedExtensions(message_type.nested_type(i), value)) return false;
   }
@@ -151,8 +153,7 @@
 
 template <typename Value>
 bool SimpleDescriptorDatabase::DescriptorIndex<Value>::AddExtension(
-    const FieldDescriptorProto& field,
-    Value value) {
+    const FieldDescriptorProto& field, Value value) {
   if (!field.extendee().empty() && field.extendee()[0] == '.') {
     // The extension is fully-qualified.  We can use it as a lookup key in
     // the by_symbol_ table.
@@ -161,8 +162,9 @@
             std::make_pair(field.extendee().substr(1), field.number()),
             value)) {
       GOOGLE_LOG(ERROR) << "Extension conflicts with extension already in database: "
-                    "extend " << field.extendee() << " { "
-                 << field.name() << " = " << field.number() << " }";
+                    "extend "
+                 << field.extendee() << " { " << field.name() << " = "
+                 << field.number() << " }";
       return false;
     }
   } else {
@@ -185,8 +187,9 @@
   typename std::map<std::string, Value>::iterator iter =
       FindLastLessOrEqual(name);
 
-  return (iter != by_symbol_.end() && IsSubSymbol(iter->first, name)) ?
-         iter->second : Value();
+  return (iter != by_symbol_.end() && IsSubSymbol(iter->first, name))
+             ? iter->second
+             : Value();
 }
 
 template <typename Value>
@@ -249,10 +252,8 @@
     const std::string& name) {
   for (int i = 0; i < name.size(); i++) {
     // I don't trust ctype.h due to locales.  :(
-    if (name[i] != '.' && name[i] != '_' &&
-        (name[i] < '0' || name[i] > '9') &&
-        (name[i] < 'A' || name[i] > 'Z') &&
-        (name[i] < 'a' || name[i] > 'z')) {
+    if (name[i] != '.' && name[i] != '_' && (name[i] < '0' || name[i] > '9') &&
+        (name[i] < 'A' || name[i] > 'Z') && (name[i] < 'a' || name[i] > 'z')) {
       return false;
     }
   }
@@ -321,8 +322,8 @@
   }
 }
 
-bool EncodedDescriptorDatabase::Add(
-    const void* encoded_file_descriptor, int size) {
+bool EncodedDescriptorDatabase::Add(const void* encoded_file_descriptor,
+                                    int size) {
   FileDescriptorProto file;
   if (file.ParseFromArray(encoded_file_descriptor, size)) {
     return index_.AddFile(file, std::make_pair(encoded_file_descriptor, size));
@@ -333,8 +334,8 @@
   }
 }
 
-bool EncodedDescriptorDatabase::AddCopy(
-    const void* encoded_file_descriptor, int size) {
+bool EncodedDescriptorDatabase::AddCopy(const void* encoded_file_descriptor,
+                                        int size) {
   void* copy = operator new(size);
   memcpy(copy, encoded_file_descriptor, size);
   files_to_delete_.push_back(copy);
@@ -392,8 +393,7 @@
 }
 
 bool EncodedDescriptorDatabase::MaybeParse(
-    std::pair<const void*, int> encoded_file,
-    FileDescriptorProto* output) {
+    std::pair<const void*, int> encoded_file, FileDescriptorProto* output) {
   if (encoded_file.first == NULL) return false;
   return output->ParseFromArray(encoded_file.first, encoded_file.second);
 }
@@ -401,7 +401,7 @@
 // ===================================================================
 
 DescriptorPoolDatabase::DescriptorPoolDatabase(const DescriptorPool& pool)
-  : pool_(pool) {}
+    : pool_(pool) {}
 DescriptorPoolDatabase::~DescriptorPoolDatabase() {}
 
 bool DescriptorPoolDatabase::FindFileByName(const std::string& filename,
@@ -429,7 +429,7 @@
   if (extendee == NULL) return false;
 
   const FieldDescriptor* extension =
-    pool_.FindExtensionByNumber(extendee, field_number);
+      pool_.FindExtensionByNumber(extendee, field_number);
   if (extension == NULL) return false;
 
   output->Clear();
@@ -455,14 +455,13 @@
 // ===================================================================
 
 MergedDescriptorDatabase::MergedDescriptorDatabase(
-    DescriptorDatabase* source1,
-    DescriptorDatabase* source2) {
+    DescriptorDatabase* source1, DescriptorDatabase* source2) {
   sources_.push_back(source1);
   sources_.push_back(source2);
 }
 MergedDescriptorDatabase::MergedDescriptorDatabase(
     const std::vector<DescriptorDatabase*>& sources)
-  : sources_(sources) {}
+    : sources_(sources) {}
 MergedDescriptorDatabase::~MergedDescriptorDatabase() {}
 
 bool MergedDescriptorDatabase::FindFileByName(const std::string& filename,
@@ -500,8 +499,8 @@
     const std::string& containing_type, int field_number,
     FileDescriptorProto* output) {
   for (int i = 0; i < sources_.size(); i++) {
-    if (sources_[i]->FindFileContainingExtension(
-          containing_type, field_number, output)) {
+    if (sources_[i]->FindFileContainingExtension(containing_type, field_number,
+                                                 output)) {
       // The symbol was found in source i.  However, if one of the previous
       // sources defines a file with the same name (which presumably doesn't
       // contain the symbol, since it wasn't found in that source), then we
diff --git a/src/google/protobuf/descriptor_database.h b/src/google/protobuf/descriptor_database.h
index 5ac0383..8fc8ae3 100644
--- a/src/google/protobuf/descriptor_database.h
+++ b/src/google/protobuf/descriptor_database.h
@@ -183,13 +183,10 @@
    public:
     // Helpers to recursively add particular descriptors and all their contents
     // to the index.
-    bool AddFile(const FileDescriptorProto& file,
-                 Value value);
+    bool AddFile(const FileDescriptorProto& file, Value value);
     bool AddSymbol(const std::string& name, Value value);
-    bool AddNestedExtensions(const DescriptorProto& message_type,
-                             Value value);
-    bool AddExtension(const FieldDescriptorProto& field,
-                      Value value);
+    bool AddNestedExtensions(const DescriptorProto& message_type, Value value);
+    bool AddExtension(const FieldDescriptorProto& field, Value value);
 
     Value FindFile(const std::string& filename);
     Value FindSymbol(const std::string& name);
@@ -270,14 +267,12 @@
     bool ValidateSymbolName(const std::string& name);
   };
 
-
   DescriptorIndex<const FileDescriptorProto*> index_;
   std::vector<const FileDescriptorProto*> files_to_delete_;
 
   // If file is non-NULL, copy it into *output and return true, otherwise
   // return false.
-  bool MaybeCopy(const FileDescriptorProto* file,
-                 FileDescriptorProto* output);
+  bool MaybeCopy(const FileDescriptorProto* file, FileDescriptorProto* output);
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SimpleDescriptorDatabase);
 };
diff --git a/src/google/protobuf/descriptor_database_unittest.cc b/src/google/protobuf/descriptor_database_unittest.cc
index 423a700..58ccf4e 100644
--- a/src/google/protobuf/descriptor_database_unittest.cc
+++ b/src/google/protobuf/descriptor_database_unittest.cc
@@ -64,8 +64,7 @@
   for (int i = 0; i < proto.message_type_size(); i++) {
     if (proto.message_type(i).name() == type_name) return;
   }
-  ADD_FAILURE() << "\"" << proto.name()
-                << "\" did not contain expected type \""
+  ADD_FAILURE() << "\"" << proto.name() << "\" did not contain expected type \""
                 << type_name << "\".";
 }
 
@@ -100,9 +99,7 @@
 
   virtual ~SimpleDescriptorDatabaseTestCase() {}
 
-  virtual DescriptorDatabase* GetDatabase() {
-    return &database_;
-  }
+  virtual DescriptorDatabase* GetDatabase() { return &database_; }
   virtual bool AddToDatabase(const FileDescriptorProto& file) {
     return database_.Add(file);
   }
@@ -120,9 +117,7 @@
 
   virtual ~EncodedDescriptorDatabaseTestCase() {}
 
-  virtual DescriptorDatabase* GetDatabase() {
-    return &database_;
-  }
+  virtual DescriptorDatabase* GetDatabase() { return &database_; }
   virtual bool AddToDatabase(const FileDescriptorProto& file) {
     std::string data;
     file.SerializeToString(&data);
@@ -143,9 +138,7 @@
   DescriptorPoolDatabaseTestCase() : database_(pool_) {}
   virtual ~DescriptorPoolDatabaseTestCase() {}
 
-  virtual DescriptorDatabase* GetDatabase() {
-    return &database_;
-  }
+  virtual DescriptorDatabase* GetDatabase() { return &database_; }
   virtual bool AddToDatabase(const FileDescriptorProto& file) {
     return pool_.BuildFile(file);
   }
@@ -183,11 +176,11 @@
 
 TEST_P(DescriptorDatabaseTest, FindFileByName) {
   AddToDatabase(
-    "name: \"foo.proto\" "
-    "message_type { name:\"Foo\" }");
+      "name: \"foo.proto\" "
+      "message_type { name:\"Foo\" }");
   AddToDatabase(
-    "name: \"bar.proto\" "
-    "message_type { name:\"Bar\" }");
+      "name: \"bar.proto\" "
+      "message_type { name:\"Bar\" }");
 
   {
     FileDescriptorProto file;
@@ -212,27 +205,26 @@
 
 TEST_P(DescriptorDatabaseTest, FindFileContainingSymbol) {
   AddToDatabase(
-    "name: \"foo.proto\" "
-    "message_type { "
-    "  name: \"Foo\" "
-    "  field { name:\"qux\" }"
-    "  nested_type { name: \"Grault\" } "
-    "  enum_type { name: \"Garply\" } "
-    "} "
-    "enum_type { "
-    "  name: \"Waldo\" "
-    "  value { name:\"FRED\" } "
-    "} "
-    "extension { name: \"plugh\" } "
-    "service { "
-    "  name: \"Xyzzy\" "
-    "  method { name: \"Thud\" } "
-    "}"
-    );
+      "name: \"foo.proto\" "
+      "message_type { "
+      "  name: \"Foo\" "
+      "  field { name:\"qux\" }"
+      "  nested_type { name: \"Grault\" } "
+      "  enum_type { name: \"Garply\" } "
+      "} "
+      "enum_type { "
+      "  name: \"Waldo\" "
+      "  value { name:\"FRED\" } "
+      "} "
+      "extension { name: \"plugh\" } "
+      "service { "
+      "  name: \"Xyzzy\" "
+      "  method { name: \"Thud\" } "
+      "}");
   AddToDatabase(
-    "name: \"bar.proto\" "
-    "package: \"corge\" "
-    "message_type { name: \"Bar\" }");
+      "name: \"bar.proto\" "
+      "package: \"corge\" "
+      "message_type { name: \"Bar\" }");
 
   {
     FileDescriptorProto file;
@@ -247,8 +239,8 @@
     EXPECT_EQ("foo.proto", file.name());
     // Non-existent field under a valid top level symbol can also be
     // found.
-    EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.none_field.none",
-                                                    &file));
+    EXPECT_TRUE(
+        database_->FindFileContainingSymbol("Foo.none_field.none", &file));
   }
 
   {
@@ -322,24 +314,25 @@
 
 TEST_P(DescriptorDatabaseTest, FindFileContainingExtension) {
   AddToDatabase(
-    "name: \"foo.proto\" "
-    "message_type { "
-    "  name: \"Foo\" "
-    "  extension_range { start: 1 end: 1000 } "
-    "  extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
-    "              extendee: \".Foo\" }"
-    "}");
+      "name: \"foo.proto\" "
+      "message_type { "
+      "  name: \"Foo\" "
+      "  extension_range { start: 1 end: 1000 } "
+      "  extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "number:5 "
+      "              extendee: \".Foo\" }"
+      "}");
   AddToDatabase(
-    "name: \"bar.proto\" "
-    "package: \"corge\" "
-    "dependency: \"foo.proto\" "
-    "message_type { "
-    "  name: \"Bar\" "
-    "  extension_range { start: 1 end: 1000 } "
-    "} "
-    "extension { name:\"grault\" extendee: \".Foo\"       number:32 } "
-    "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } "
-    "extension { name:\"waldo\"  extendee: \"Bar\"        number:56 } ");
+      "name: \"bar.proto\" "
+      "package: \"corge\" "
+      "dependency: \"foo.proto\" "
+      "message_type { "
+      "  name: \"Bar\" "
+      "  extension_range { start: 1 end: 1000 } "
+      "} "
+      "extension { name:\"grault\" extendee: \".Foo\"       number:32 } "
+      "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } "
+      "extension { name:\"waldo\"  extendee: \"Bar\"        number:56 } ");
 
   {
     FileDescriptorProto file;
@@ -391,24 +384,25 @@
 
 TEST_P(DescriptorDatabaseTest, FindAllExtensionNumbers) {
   AddToDatabase(
-    "name: \"foo.proto\" "
-    "message_type { "
-    "  name: \"Foo\" "
-    "  extension_range { start: 1 end: 1000 } "
-    "  extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
-    "              extendee: \".Foo\" }"
-    "}");
+      "name: \"foo.proto\" "
+      "message_type { "
+      "  name: \"Foo\" "
+      "  extension_range { start: 1 end: 1000 } "
+      "  extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "number:5 "
+      "              extendee: \".Foo\" }"
+      "}");
   AddToDatabase(
-    "name: \"bar.proto\" "
-    "package: \"corge\" "
-    "dependency: \"foo.proto\" "
-    "message_type { "
-    "  name: \"Bar\" "
-    "  extension_range { start: 1 end: 1000 } "
-    "} "
-    "extension { name:\"grault\" extendee: \".Foo\"       number:32 } "
-    "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } "
-    "extension { name:\"waldo\"  extendee: \"Bar\"        number:56 } ");
+      "name: \"bar.proto\" "
+      "package: \"corge\" "
+      "dependency: \"foo.proto\" "
+      "message_type { "
+      "  name: \"Bar\" "
+      "  extension_range { start: 1 end: 1000 } "
+      "} "
+      "extension { name:\"grault\" extendee: \".Foo\"       number:32 } "
+      "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } "
+      "extension { name:\"waldo\"  extendee: \"Bar\"        number:56 } ");
 
   {
     std::vector<int> numbers;
@@ -442,47 +436,49 @@
 
 TEST_P(DescriptorDatabaseTest, ConflictingFileError) {
   AddToDatabase(
-    "name: \"foo.proto\" "
-    "message_type { "
-    "  name: \"Foo\" "
-    "}");
+      "name: \"foo.proto\" "
+      "message_type { "
+      "  name: \"Foo\" "
+      "}");
   AddToDatabaseWithError(
-    "name: \"foo.proto\" "
-    "message_type { "
-    "  name: \"Bar\" "
-    "}");
+      "name: \"foo.proto\" "
+      "message_type { "
+      "  name: \"Bar\" "
+      "}");
 }
 
 TEST_P(DescriptorDatabaseTest, ConflictingTypeError) {
   AddToDatabase(
-    "name: \"foo.proto\" "
-    "message_type { "
-    "  name: \"Foo\" "
-    "}");
+      "name: \"foo.proto\" "
+      "message_type { "
+      "  name: \"Foo\" "
+      "}");
   AddToDatabaseWithError(
-    "name: \"bar.proto\" "
-    "message_type { "
-    "  name: \"Foo\" "
-    "}");
+      "name: \"bar.proto\" "
+      "message_type { "
+      "  name: \"Foo\" "
+      "}");
 }
 
 TEST_P(DescriptorDatabaseTest, ConflictingExtensionError) {
   AddToDatabase(
-    "name: \"foo.proto\" "
-    "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
-    "            extendee: \".Foo\" }");
+      "name: \"foo.proto\" "
+      "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
+      "            extendee: \".Foo\" }");
   AddToDatabaseWithError(
-    "name: \"bar.proto\" "
-    "extension { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
-    "            extendee: \".Foo\" }");
+      "name: \"bar.proto\" "
+      "extension { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 "
+      "            extendee: \".Foo\" }");
 }
 
-INSTANTIATE_TEST_CASE_P(Simple, DescriptorDatabaseTest,
+INSTANTIATE_TEST_CASE_P(
+    Simple, DescriptorDatabaseTest,
     testing::Values(&SimpleDescriptorDatabaseTestCase::New));
-INSTANTIATE_TEST_CASE_P(MemoryConserving, DescriptorDatabaseTest,
+INSTANTIATE_TEST_CASE_P(
+    MemoryConserving, DescriptorDatabaseTest,
     testing::Values(&EncodedDescriptorDatabaseTestCase::New));
 INSTANTIATE_TEST_CASE_P(Pool, DescriptorDatabaseTest,
-    testing::Values(&DescriptorPoolDatabaseTestCase::New));
+                        testing::Values(&DescriptorPoolDatabaseTestCase::New));
 
 #endif  // GTEST_HAS_PARAM_TEST
 
@@ -540,36 +536,40 @@
 class MergedDescriptorDatabaseTest : public testing::Test {
  protected:
   MergedDescriptorDatabaseTest()
-    : forward_merged_(&database1_, &database2_),
-      reverse_merged_(&database2_, &database1_) {}
+      : forward_merged_(&database1_, &database2_),
+        reverse_merged_(&database2_, &database1_) {}
 
   virtual void SetUp() {
-    AddToDatabase(&database1_,
-      "name: \"foo.proto\" "
-      "message_type { name:\"Foo\" extension_range { start: 1 end: 100 } } "
-      "extension { name:\"foo_ext\" extendee: \".Foo\" number:3 "
-      "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
-    AddToDatabase(&database2_,
-      "name: \"bar.proto\" "
-      "message_type { name:\"Bar\" extension_range { start: 1 end: 100 } } "
-      "extension { name:\"bar_ext\" extendee: \".Bar\" number:5 "
-      "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
+    AddToDatabase(
+        &database1_,
+        "name: \"foo.proto\" "
+        "message_type { name:\"Foo\" extension_range { start: 1 end: 100 } } "
+        "extension { name:\"foo_ext\" extendee: \".Foo\" number:3 "
+        "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
+    AddToDatabase(
+        &database2_,
+        "name: \"bar.proto\" "
+        "message_type { name:\"Bar\" extension_range { start: 1 end: 100 } } "
+        "extension { name:\"bar_ext\" extendee: \".Bar\" number:5 "
+        "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
 
     // baz.proto exists in both pools, with different definitions.
-    AddToDatabase(&database1_,
-      "name: \"baz.proto\" "
-      "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } "
-      "message_type { name:\"FromPool1\" } "
-      "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 "
-      "            label:LABEL_OPTIONAL type:TYPE_INT32 } "
-      "extension { name:\"database1_only_ext\" extendee: \".Baz\" number:13 "
-      "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
-    AddToDatabase(&database2_,
-      "name: \"baz.proto\" "
-      "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } "
-      "message_type { name:\"FromPool2\" } "
-      "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 "
-      "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
+    AddToDatabase(
+        &database1_,
+        "name: \"baz.proto\" "
+        "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } "
+        "message_type { name:\"FromPool1\" } "
+        "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 "
+        "            label:LABEL_OPTIONAL type:TYPE_INT32 } "
+        "extension { name:\"database1_only_ext\" extendee: \".Baz\" number:13 "
+        "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
+    AddToDatabase(
+        &database2_,
+        "name: \"baz.proto\" "
+        "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } "
+        "message_type { name:\"FromPool2\" } "
+        "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 "
+        "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
   }
 
   SimpleDescriptorDatabase database1_;
@@ -663,8 +663,7 @@
   {
     // Can't find non-existent symbol.
     FileDescriptorProto file;
-    EXPECT_FALSE(
-      forward_merged_.FindFileContainingSymbol("NoSuchType", &file));
+    EXPECT_FALSE(forward_merged_.FindFileContainingSymbol("NoSuchType", &file));
   }
 }
 
@@ -672,8 +671,7 @@
   {
     // Can find file that is only in database1_.
     FileDescriptorProto file;
-    EXPECT_TRUE(
-      forward_merged_.FindFileContainingExtension("Foo", 3, &file));
+    EXPECT_TRUE(forward_merged_.FindFileContainingExtension("Foo", 3, &file));
     EXPECT_EQ("foo.proto", file.name());
     ExpectContainsType(file, "Foo");
   }
@@ -681,8 +679,7 @@
   {
     // Can find file that is only in database2_.
     FileDescriptorProto file;
-    EXPECT_TRUE(
-      forward_merged_.FindFileContainingExtension("Bar", 5, &file));
+    EXPECT_TRUE(forward_merged_.FindFileContainingExtension("Bar", 5, &file));
     EXPECT_EQ("bar.proto", file.name());
     ExpectContainsType(file, "Bar");
   }
@@ -690,8 +687,7 @@
   {
     // In forward_merged_, database1_'s baz.proto takes precedence.
     FileDescriptorProto file;
-    EXPECT_TRUE(
-      forward_merged_.FindFileContainingExtension("Baz", 12, &file));
+    EXPECT_TRUE(forward_merged_.FindFileContainingExtension("Baz", 12, &file));
     EXPECT_EQ("baz.proto", file.name());
     ExpectContainsType(file, "FromPool1");
   }
@@ -699,8 +695,7 @@
   {
     // In reverse_merged_, database2_'s baz.proto takes precedence.
     FileDescriptorProto file;
-    EXPECT_TRUE(
-      reverse_merged_.FindFileContainingExtension("Baz", 12, &file));
+    EXPECT_TRUE(reverse_merged_.FindFileContainingExtension("Baz", 12, &file));
     EXPECT_EQ("baz.proto", file.name());
     ExpectContainsType(file, "FromPool2");
   }
@@ -716,8 +711,7 @@
   {
     // Can't find non-existent extension.
     FileDescriptorProto file;
-    EXPECT_FALSE(
-      forward_merged_.FindFileContainingExtension("Foo", 6, &file));
+    EXPECT_FALSE(forward_merged_.FindFileContainingExtension("Foo", 6, &file));
   }
 }
 
diff --git a/src/google/protobuf/descriptor_unittest.cc b/src/google/protobuf/descriptor_unittest.cc
index e93d01b..f87947f 100644
--- a/src/google/protobuf/descriptor_unittest.cc
+++ b/src/google/protobuf/descriptor_unittest.cc
@@ -208,21 +208,43 @@
                 const std::string& message) {
     const char* location_name = NULL;
     switch (location) {
-      case NAME         : location_name = "NAME"         ; break;
-      case NUMBER       : location_name = "NUMBER"       ; break;
-      case TYPE         : location_name = "TYPE"         ; break;
-      case EXTENDEE     : location_name = "EXTENDEE"     ; break;
-      case DEFAULT_VALUE: location_name = "DEFAULT_VALUE"; break;
-      case OPTION_NAME  : location_name = "OPTION_NAME"  ; break;
-      case OPTION_VALUE : location_name = "OPTION_VALUE" ; break;
-      case INPUT_TYPE   : location_name = "INPUT_TYPE"   ; break;
-      case OUTPUT_TYPE  : location_name = "OUTPUT_TYPE"  ; break;
-      case OTHER        : location_name = "OTHER"        ; break;
+      case NAME:
+        location_name = "NAME";
+        break;
+      case NUMBER:
+        location_name = "NUMBER";
+        break;
+      case TYPE:
+        location_name = "TYPE";
+        break;
+      case EXTENDEE:
+        location_name = "EXTENDEE";
+        break;
+      case DEFAULT_VALUE:
+        location_name = "DEFAULT_VALUE";
+        break;
+      case OPTION_NAME:
+        location_name = "OPTION_NAME";
+        break;
+      case OPTION_VALUE:
+        location_name = "OPTION_VALUE";
+        break;
+      case INPUT_TYPE:
+        location_name = "INPUT_TYPE";
+        break;
+      case OUTPUT_TYPE:
+        location_name = "OUTPUT_TYPE";
+        break;
+      case IMPORT:
+        location_name = "IMPORT";
+        break;
+      case OTHER:
+        location_name = "OTHER";
+        break;
     }
 
-    strings::SubstituteAndAppend(
-      &text_, "$0: $1: $2: $3\n",
-      filename, element_name, location_name, message);
+    strings::SubstituteAndAppend(&text_, "$0: $1: $2: $3\n", filename,
+                                 element_name, location_name, message);
   }
 
   // implements ErrorCollector ---------------------------------------
@@ -231,21 +253,43 @@
                   const std::string& message) {
     const char* location_name = NULL;
     switch (location) {
-      case NAME         : location_name = "NAME"         ; break;
-      case NUMBER       : location_name = "NUMBER"       ; break;
-      case TYPE         : location_name = "TYPE"         ; break;
-      case EXTENDEE     : location_name = "EXTENDEE"     ; break;
-      case DEFAULT_VALUE: location_name = "DEFAULT_VALUE"; break;
-      case OPTION_NAME  : location_name = "OPTION_NAME"  ; break;
-      case OPTION_VALUE : location_name = "OPTION_VALUE" ; break;
-      case INPUT_TYPE   : location_name = "INPUT_TYPE"   ; break;
-      case OUTPUT_TYPE  : location_name = "OUTPUT_TYPE"  ; break;
-      case OTHER        : location_name = "OTHER"        ; break;
+      case NAME:
+        location_name = "NAME";
+        break;
+      case NUMBER:
+        location_name = "NUMBER";
+        break;
+      case TYPE:
+        location_name = "TYPE";
+        break;
+      case EXTENDEE:
+        location_name = "EXTENDEE";
+        break;
+      case DEFAULT_VALUE:
+        location_name = "DEFAULT_VALUE";
+        break;
+      case OPTION_NAME:
+        location_name = "OPTION_NAME";
+        break;
+      case OPTION_VALUE:
+        location_name = "OPTION_VALUE";
+        break;
+      case INPUT_TYPE:
+        location_name = "INPUT_TYPE";
+        break;
+      case OUTPUT_TYPE:
+        location_name = "OUTPUT_TYPE";
+        break;
+      case IMPORT:
+        location_name = "IMPORT";
+        break;
+      case OTHER:
+        location_name = "OTHER";
+        break;
     }
 
-    strings::SubstituteAndAppend(
-      &warning_text_, "$0: $1: $2: $3\n",
-      filename, element_name, location_name, message);
+    strings::SubstituteAndAppend(&warning_text_, "$0: $1: $2: $3\n", filename,
+                                 element_name, location_name, message);
   }
 };
 
@@ -336,17 +380,17 @@
   const FileDescriptor* bar_file_;
   const FileDescriptor* baz_file_;
 
-  const Descriptor*          foo_message_;
-  const EnumDescriptor*      foo_enum_;
+  const Descriptor* foo_message_;
+  const EnumDescriptor* foo_enum_;
   const EnumValueDescriptor* foo_enum_value_;
-  const ServiceDescriptor*   foo_service_;
-  const FieldDescriptor*     foo_extension_;
+  const ServiceDescriptor* foo_service_;
+  const FieldDescriptor* foo_extension_;
 
-  const Descriptor*          bar_message_;
-  const EnumDescriptor*      bar_enum_;
+  const Descriptor* bar_message_;
+  const EnumDescriptor* bar_enum_;
   const EnumValueDescriptor* bar_enum_value_;
-  const ServiceDescriptor*   bar_service_;
-  const FieldDescriptor*     bar_extension_;
+  const ServiceDescriptor* bar_service_;
+  const FieldDescriptor* bar_extension_;
 };
 
 TEST_F(FileDescriptorTest, Name) {
@@ -622,35 +666,28 @@
     AddEmptyEnum(&foo_file, "TestEnum");
 
     DescriptorProto* message = AddMessage(&foo_file, "TestMessage");
-    AddField(message, "foo", 1,
-             FieldDescriptorProto::LABEL_REQUIRED,
+    AddField(message, "foo", 1, FieldDescriptorProto::LABEL_REQUIRED,
              FieldDescriptorProto::TYPE_STRING);
-    AddField(message, "bar", 6,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(message, "bar", 6, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_ENUM)
-      ->set_type_name("TestEnum");
-    AddField(message, "baz", 500000000,
-             FieldDescriptorProto::LABEL_REPEATED,
+        ->set_type_name("TestEnum");
+    AddField(message, "baz", 500000000, FieldDescriptorProto::LABEL_REPEATED,
              FieldDescriptorProto::TYPE_MESSAGE)
-      ->set_type_name("TestForeign");
-    AddField(message, "qux", 15,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+        ->set_type_name("TestForeign");
+    AddField(message, "qux", 15, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_GROUP)
-      ->set_type_name("TestForeign");
+        ->set_type_name("TestForeign");
 
     FileDescriptorProto bar_file;
     bar_file.set_name("bar.proto");
     bar_file.set_package("corge.grault");
 
     DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2");
-    AddField(message2, "foo", 1,
-             FieldDescriptorProto::LABEL_REQUIRED,
+    AddField(message2, "foo", 1, FieldDescriptorProto::LABEL_REQUIRED,
              FieldDescriptorProto::TYPE_STRING);
-    AddField(message2, "bar", 2,
-             FieldDescriptorProto::LABEL_REQUIRED,
+    AddField(message2, "bar", 2, FieldDescriptorProto::LABEL_REQUIRED,
              FieldDescriptorProto::TYPE_STRING);
-    AddField(message2, "quux", 6,
-             FieldDescriptorProto::LABEL_REQUIRED,
+    AddField(message2, "quux", 6, FieldDescriptorProto::LABEL_REQUIRED,
              FieldDescriptorProto::TYPE_STRING);
 
     FileDescriptorProto map_file;
@@ -658,11 +695,9 @@
     DescriptorProto* message3 = AddMessage(&map_file, "TestMessage3");
 
     DescriptorProto* entry = AddNestedMessage(message3, "MapInt32Int32Entry");
-    AddField(entry, "key", 1,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(entry, "key", 1, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
-    AddField(entry, "value", 2,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(entry, "value", 2, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
     entry->mutable_options()->set_map_entry(true);
 
@@ -675,23 +710,17 @@
     json_file.set_name("json.proto");
     json_file.set_syntax("proto3");
     DescriptorProto* message4 = AddMessage(&json_file, "TestMessage4");
-    AddField(message4, "field_name1", 1,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(message4, "field_name1", 1, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
-    AddField(message4, "fieldName2", 2,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(message4, "fieldName2", 2, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
-    AddField(message4, "FieldName3", 3,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(message4, "FieldName3", 3, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
-    AddField(message4, "_field_name4", 4,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(message4, "_field_name4", 4, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
-    AddField(message4, "FIELD_NAME5", 5,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(message4, "FIELD_NAME5", 5, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
-    AddField(message4, "field_name6", 6,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(message4, "field_name6", 6, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32)
         ->set_json_name("@type");
 
@@ -725,15 +754,15 @@
     message2_ = bar_file_->message_type(0);
 
     ASSERT_EQ(3, message2_->field_count());
-    foo2_  = message2_->field(0);
-    bar2_  = message2_->field(1);
+    foo2_ = message2_->field(0);
+    bar2_ = message2_->field(1);
     quux2_ = message2_->field(2);
 
     ASSERT_EQ(1, map_file_->message_type_count());
     message3_ = map_file_->message_type(0);
 
     ASSERT_EQ(1, message3_->field_count());
-    map_  = message3_->field(0);
+    map_ = message3_->field(0);
 
     ASSERT_EQ(1, json_file_->message_type_count());
     message4_ = json_file_->message_type(0);
@@ -806,8 +835,8 @@
   EXPECT_TRUE(message_->FindFieldByName("no_such_field") == NULL);
   EXPECT_TRUE(message_->FindFieldByName("quux") == NULL);
 
-  EXPECT_EQ(foo2_ , message2_->FindFieldByName("foo" ));
-  EXPECT_EQ(bar2_ , message2_->FindFieldByName("bar" ));
+  EXPECT_EQ(foo2_, message2_->FindFieldByName("foo"));
+  EXPECT_EQ(bar2_, message2_->FindFieldByName("bar"));
   EXPECT_EQ(quux2_, message2_->FindFieldByName("quux"));
   EXPECT_TRUE(message2_->FindFieldByName("baz") == NULL);
   EXPECT_TRUE(message2_->FindFieldByName("qux") == NULL);
@@ -821,8 +850,8 @@
   EXPECT_TRUE(message_->FindFieldByNumber(837592) == NULL);
   EXPECT_TRUE(message_->FindFieldByNumber(2) == NULL);
 
-  EXPECT_EQ(foo2_ , message2_->FindFieldByNumber(1));
-  EXPECT_EQ(bar2_ , message2_->FindFieldByNumber(2));
+  EXPECT_EQ(foo2_, message2_->FindFieldByNumber(1));
+  EXPECT_EQ(bar2_, message2_->FindFieldByNumber(2));
   EXPECT_EQ(quux2_, message2_->FindFieldByNumber(6));
   EXPECT_TRUE(message2_->FindFieldByNumber(15) == NULL);
   EXPECT_TRUE(message2_->FindFieldByNumber(500000000) == NULL);
@@ -904,17 +933,17 @@
 }
 
 TEST_F(DescriptorTest, FieldNumber) {
-  EXPECT_EQ(        1, foo_->number());
-  EXPECT_EQ(        6, bar_->number());
+  EXPECT_EQ(1, foo_->number());
+  EXPECT_EQ(6, bar_->number());
   EXPECT_EQ(500000000, baz_->number());
-  EXPECT_EQ(       15, qux_->number());
+  EXPECT_EQ(15, qux_->number());
 }
 
 TEST_F(DescriptorTest, FieldType) {
-  EXPECT_EQ(FieldDescriptor::TYPE_STRING , foo_->type());
-  EXPECT_EQ(FieldDescriptor::TYPE_ENUM   , bar_->type());
+  EXPECT_EQ(FieldDescriptor::TYPE_STRING, foo_->type());
+  EXPECT_EQ(FieldDescriptor::TYPE_ENUM, bar_->type());
   EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_->type());
-  EXPECT_EQ(FieldDescriptor::TYPE_GROUP  , qux_->type());
+  EXPECT_EQ(FieldDescriptor::TYPE_GROUP, qux_->type());
 }
 
 TEST_F(DescriptorTest, FieldLabel) {
@@ -923,17 +952,17 @@
   EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, baz_->label());
   EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, qux_->label());
 
-  EXPECT_TRUE (foo_->is_required());
+  EXPECT_TRUE(foo_->is_required());
   EXPECT_FALSE(foo_->is_optional());
   EXPECT_FALSE(foo_->is_repeated());
 
   EXPECT_FALSE(bar_->is_required());
-  EXPECT_TRUE (bar_->is_optional());
+  EXPECT_TRUE(bar_->is_optional());
   EXPECT_FALSE(bar_->is_repeated());
 
   EXPECT_FALSE(baz_->is_required());
   EXPECT_FALSE(baz_->is_optional());
-  EXPECT_TRUE (baz_->is_repeated());
+  EXPECT_TRUE(baz_->is_repeated());
 }
 
 TEST_F(DescriptorTest, IsMap) {
@@ -955,8 +984,8 @@
   EXPECT_EQ(message_, baz_->containing_type());
   EXPECT_EQ(message_, qux_->containing_type());
 
-  EXPECT_EQ(message2_, foo2_ ->containing_type());
-  EXPECT_EQ(message2_, bar2_ ->containing_type());
+  EXPECT_EQ(message2_, foo2_->containing_type());
+  EXPECT_EQ(message2_, bar2_->containing_type());
   EXPECT_EQ(message2_, quux2_->containing_type());
 }
 
@@ -1005,21 +1034,17 @@
     oneof_message->add_oneof_decl()->set_name("foo");
     oneof_message->add_oneof_decl()->set_name("bar");
 
-    AddField(oneof_message, "a", 1,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(oneof_message, "a", 1, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
-    AddField(oneof_message, "b", 2,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(oneof_message, "b", 2, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_STRING);
     oneof_message->mutable_field(1)->set_oneof_index(0);
-    AddField(oneof_message, "c", 3,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(oneof_message, "c", 3, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_MESSAGE);
     oneof_message->mutable_field(2)->set_oneof_index(0);
     oneof_message->mutable_field(2)->set_type_name("TestOneof");
 
-    AddField(oneof_message, "d", 4,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(oneof_message, "d", 4, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_FLOAT);
     oneof_message->mutable_field(3)->set_oneof_index(1);
 
@@ -1086,14 +1111,11 @@
     AddExtensionRange(AddMessage(&file, "ExtendableMessage"), 1, 1000);
 
     DescriptorProto* message = AddMessage(&file, "TestMessage");
-    AddField(message, "foo_foo", 1,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(message, "foo_foo", 1, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
-    AddField(message, "FooBar", 2,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(message, "FooBar", 2, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
-    AddField(message, "fooBaz", 3,
-             FieldDescriptorProto::LABEL_OPTIONAL,
+    AddField(message, "fooBaz", 3, FieldDescriptorProto::LABEL_OPTIONAL,
              FieldDescriptorProto::TYPE_INT32);
     AddField(message, "fooFoo", 4,  // Camel-case conflict with foo_foo.
              FieldDescriptorProto::LABEL_OPTIONAL,
@@ -1151,22 +1173,22 @@
 
 TEST_F(StylizedFieldNamesTest, LowercaseName) {
   EXPECT_EQ("foo_foo", message_->field(0)->lowercase_name());
-  EXPECT_EQ("foobar" , message_->field(1)->lowercase_name());
-  EXPECT_EQ("foobaz" , message_->field(2)->lowercase_name());
-  EXPECT_EQ("foofoo" , message_->field(3)->lowercase_name());
-  EXPECT_EQ("foobar" , message_->field(4)->lowercase_name());
+  EXPECT_EQ("foobar", message_->field(1)->lowercase_name());
+  EXPECT_EQ("foobaz", message_->field(2)->lowercase_name());
+  EXPECT_EQ("foofoo", message_->field(3)->lowercase_name());
+  EXPECT_EQ("foobar", message_->field(4)->lowercase_name());
 
   EXPECT_EQ("bar_foo", message_->extension(0)->lowercase_name());
-  EXPECT_EQ("barbar" , message_->extension(1)->lowercase_name());
-  EXPECT_EQ("barbaz" , message_->extension(2)->lowercase_name());
-  EXPECT_EQ("barfoo" , message_->extension(3)->lowercase_name());
-  EXPECT_EQ("barbar" , message_->extension(4)->lowercase_name());
+  EXPECT_EQ("barbar", message_->extension(1)->lowercase_name());
+  EXPECT_EQ("barbaz", message_->extension(2)->lowercase_name());
+  EXPECT_EQ("barfoo", message_->extension(3)->lowercase_name());
+  EXPECT_EQ("barbar", message_->extension(4)->lowercase_name());
 
   EXPECT_EQ("baz_foo", file_->extension(0)->lowercase_name());
-  EXPECT_EQ("bazbar" , file_->extension(1)->lowercase_name());
-  EXPECT_EQ("bazbaz" , file_->extension(2)->lowercase_name());
-  EXPECT_EQ("bazfoo" , file_->extension(3)->lowercase_name());
-  EXPECT_EQ("bazbar" , file_->extension(4)->lowercase_name());
+  EXPECT_EQ("bazbar", file_->extension(1)->lowercase_name());
+  EXPECT_EQ("bazbaz", file_->extension(2)->lowercase_name());
+  EXPECT_EQ("bazfoo", file_->extension(3)->lowercase_name());
+  EXPECT_EQ("bazbar", file_->extension(4)->lowercase_name());
 }
 
 TEST_F(StylizedFieldNamesTest, CamelcaseName) {
@@ -1190,12 +1212,9 @@
 }
 
 TEST_F(StylizedFieldNamesTest, FindByLowercaseName) {
-  EXPECT_EQ(message_->field(0),
-            message_->FindFieldByLowercaseName("foo_foo"));
-  EXPECT_EQ(message_->field(1),
-            message_->FindFieldByLowercaseName("foobar"));
-  EXPECT_EQ(message_->field(2),
-            message_->FindFieldByLowercaseName("foobaz"));
+  EXPECT_EQ(message_->field(0), message_->FindFieldByLowercaseName("foo_foo"));
+  EXPECT_EQ(message_->field(1), message_->FindFieldByLowercaseName("foobar"));
+  EXPECT_EQ(message_->field(2), message_->FindFieldByLowercaseName("foobaz"));
   EXPECT_TRUE(message_->FindFieldByLowercaseName("FooBar") == NULL);
   EXPECT_TRUE(message_->FindFieldByLowercaseName("fooBaz") == NULL);
   EXPECT_TRUE(message_->FindFieldByLowercaseName("bar_foo") == NULL);
@@ -1214,22 +1233,17 @@
 
   EXPECT_EQ(file_->extension(0),
             file_->FindExtensionByLowercaseName("baz_foo"));
-  EXPECT_EQ(file_->extension(1),
-            file_->FindExtensionByLowercaseName("bazbar"));
-  EXPECT_EQ(file_->extension(2),
-            file_->FindExtensionByLowercaseName("bazbaz"));
+  EXPECT_EQ(file_->extension(1), file_->FindExtensionByLowercaseName("bazbar"));
+  EXPECT_EQ(file_->extension(2), file_->FindExtensionByLowercaseName("bazbaz"));
   EXPECT_TRUE(file_->FindExtensionByLowercaseName("BazBar") == NULL);
   EXPECT_TRUE(file_->FindExtensionByLowercaseName("bazBaz") == NULL);
   EXPECT_TRUE(file_->FindExtensionByLowercaseName("nosuchfield") == NULL);
 }
 
 TEST_F(StylizedFieldNamesTest, FindByCamelcaseName) {
-  EXPECT_EQ(message_->field(0),
-            message_->FindFieldByCamelcaseName("fooFoo"));
-  EXPECT_EQ(message_->field(1),
-            message_->FindFieldByCamelcaseName("fooBar"));
-  EXPECT_EQ(message_->field(2),
-            message_->FindFieldByCamelcaseName("fooBaz"));
+  EXPECT_EQ(message_->field(0), message_->FindFieldByCamelcaseName("fooFoo"));
+  EXPECT_EQ(message_->field(1), message_->FindFieldByCamelcaseName("fooBar"));
+  EXPECT_EQ(message_->field(2), message_->FindFieldByCamelcaseName("fooBaz"));
   EXPECT_TRUE(message_->FindFieldByCamelcaseName("foo_foo") == NULL);
   EXPECT_TRUE(message_->FindFieldByCamelcaseName("FooBar") == NULL);
   EXPECT_TRUE(message_->FindFieldByCamelcaseName("barFoo") == NULL);
@@ -1246,12 +1260,9 @@
   EXPECT_TRUE(message_->FindExtensionByCamelcaseName("fooFoo") == NULL);
   EXPECT_TRUE(message_->FindExtensionByCamelcaseName("nosuchfield") == NULL);
 
-  EXPECT_EQ(file_->extension(0),
-            file_->FindExtensionByCamelcaseName("bazFoo"));
-  EXPECT_EQ(file_->extension(1),
-            file_->FindExtensionByCamelcaseName("bazBar"));
-  EXPECT_EQ(file_->extension(2),
-            file_->FindExtensionByCamelcaseName("bazBaz"));
+  EXPECT_EQ(file_->extension(0), file_->FindExtensionByCamelcaseName("bazFoo"));
+  EXPECT_EQ(file_->extension(1), file_->FindExtensionByCamelcaseName("bazBar"));
+  EXPECT_EQ(file_->extension(2), file_->FindExtensionByCamelcaseName("bazBaz"));
   EXPECT_TRUE(file_->FindExtensionByCamelcaseName("baz_foo") == NULL);
   EXPECT_TRUE(file_->FindExtensionByCamelcaseName("BazBar") == NULL);
   EXPECT_TRUE(file_->FindExtensionByCamelcaseName("nosuchfield") == NULL);
@@ -1358,24 +1369,24 @@
 }
 
 TEST_F(EnumDescriptorTest, FindValueByName) {
-  EXPECT_EQ(foo_ , enum_ ->FindValueByName("FOO"));
-  EXPECT_EQ(bar_ , enum_ ->FindValueByName("BAR"));
+  EXPECT_EQ(foo_, enum_->FindValueByName("FOO"));
+  EXPECT_EQ(bar_, enum_->FindValueByName("BAR"));
   EXPECT_EQ(foo2_, enum2_->FindValueByName("FOO"));
   EXPECT_EQ(baz2_, enum2_->FindValueByName("BAZ"));
 
-  EXPECT_TRUE(enum_ ->FindValueByName("NO_SUCH_VALUE") == NULL);
-  EXPECT_TRUE(enum_ ->FindValueByName("BAZ"          ) == NULL);
-  EXPECT_TRUE(enum2_->FindValueByName("BAR"          ) == NULL);
+  EXPECT_TRUE(enum_->FindValueByName("NO_SUCH_VALUE") == NULL);
+  EXPECT_TRUE(enum_->FindValueByName("BAZ") == NULL);
+  EXPECT_TRUE(enum2_->FindValueByName("BAR") == NULL);
 }
 
 TEST_F(EnumDescriptorTest, FindValueByNumber) {
-  EXPECT_EQ(foo_ , enum_ ->FindValueByNumber(1));
-  EXPECT_EQ(bar_ , enum_ ->FindValueByNumber(2));
+  EXPECT_EQ(foo_, enum_->FindValueByNumber(1));
+  EXPECT_EQ(bar_, enum_->FindValueByNumber(2));
   EXPECT_EQ(foo2_, enum2_->FindValueByNumber(1));
   EXPECT_EQ(baz2_, enum2_->FindValueByNumber(3));
 
-  EXPECT_TRUE(enum_ ->FindValueByNumber(416) == NULL);
-  EXPECT_TRUE(enum_ ->FindValueByNumber(3) == NULL);
+  EXPECT_TRUE(enum_->FindValueByNumber(416) == NULL);
+  EXPECT_TRUE(enum_->FindValueByNumber(3) == NULL);
   EXPECT_TRUE(enum2_->FindValueByNumber(2) == NULL);
 }
 
@@ -1402,8 +1413,8 @@
 }
 
 TEST_F(EnumDescriptorTest, ValueType) {
-  EXPECT_EQ(enum_ , foo_ ->type());
-  EXPECT_EQ(enum_ , bar_ ->type());
+  EXPECT_EQ(enum_, foo_->type());
+  EXPECT_EQ(enum_, bar_->type());
   EXPECT_EQ(enum2_, foo2_->type());
   EXPECT_EQ(enum2_, baz2_->type());
 }
@@ -1466,11 +1477,11 @@
     ASSERT_TRUE(bar_file_ != NULL);
 
     ASSERT_EQ(6, foo_file_->message_type_count());
-    foo_request_  = foo_file_->message_type(0);
+    foo_request_ = foo_file_->message_type(0);
     foo_response_ = foo_file_->message_type(1);
-    bar_request_  = foo_file_->message_type(2);
+    bar_request_ = foo_file_->message_type(2);
     bar_response_ = foo_file_->message_type(3);
-    baz_request_  = foo_file_->message_type(4);
+    baz_request_ = foo_file_->message_type(4);
     baz_response_ = foo_file_->message_type(5);
 
     ASSERT_EQ(1, foo_file_->service_count());
@@ -1527,14 +1538,14 @@
 }
 
 TEST_F(ServiceDescriptorTest, FindMethodByName) {
-  EXPECT_EQ(foo_ , service_ ->FindMethodByName("Foo"));
-  EXPECT_EQ(bar_ , service_ ->FindMethodByName("Bar"));
+  EXPECT_EQ(foo_, service_->FindMethodByName("Foo"));
+  EXPECT_EQ(bar_, service_->FindMethodByName("Bar"));
   EXPECT_EQ(foo2_, service2_->FindMethodByName("Foo"));
   EXPECT_EQ(baz2_, service2_->FindMethodByName("Baz"));
 
-  EXPECT_TRUE(service_ ->FindMethodByName("NoSuchMethod") == NULL);
-  EXPECT_TRUE(service_ ->FindMethodByName("Baz"         ) == NULL);
-  EXPECT_TRUE(service2_->FindMethodByName("Bar"         ) == NULL);
+  EXPECT_TRUE(service_->FindMethodByName("NoSuchMethod") == NULL);
+  EXPECT_TRUE(service_->FindMethodByName("Baz") == NULL);
+  EXPECT_TRUE(service2_->FindMethodByName("Bar") == NULL);
 }
 
 TEST_F(ServiceDescriptorTest, MethodName) {
@@ -1688,8 +1699,8 @@
 };
 
 TEST_F(NestedDescriptorTest, MessageName) {
-  EXPECT_EQ("Foo", foo_ ->name());
-  EXPECT_EQ("Bar", bar_ ->name());
+  EXPECT_EQ("Foo", foo_->name());
+  EXPECT_EQ("Bar", bar_->name());
   EXPECT_EQ("Foo", foo2_->name());
   EXPECT_EQ("Baz", baz2_->name());
 
@@ -1700,8 +1711,8 @@
 }
 
 TEST_F(NestedDescriptorTest, MessageContainingType) {
-  EXPECT_EQ(message_ , foo_ ->containing_type());
-  EXPECT_EQ(message_ , bar_ ->containing_type());
+  EXPECT_EQ(message_, foo_->containing_type());
+  EXPECT_EQ(message_, bar_->containing_type());
   EXPECT_EQ(message2_, foo2_->containing_type());
   EXPECT_EQ(message2_, baz2_->containing_type());
 }
@@ -1720,34 +1731,34 @@
 }
 
 TEST_F(NestedDescriptorTest, FindNestedTypeByName) {
-  EXPECT_EQ(foo_ , message_ ->FindNestedTypeByName("Foo"));
-  EXPECT_EQ(bar_ , message_ ->FindNestedTypeByName("Bar"));
+  EXPECT_EQ(foo_, message_->FindNestedTypeByName("Foo"));
+  EXPECT_EQ(bar_, message_->FindNestedTypeByName("Bar"));
   EXPECT_EQ(foo2_, message2_->FindNestedTypeByName("Foo"));
   EXPECT_EQ(baz2_, message2_->FindNestedTypeByName("Baz"));
 
-  EXPECT_TRUE(message_ ->FindNestedTypeByName("NoSuchType") == NULL);
-  EXPECT_TRUE(message_ ->FindNestedTypeByName("Baz"       ) == NULL);
-  EXPECT_TRUE(message2_->FindNestedTypeByName("Bar"       ) == NULL);
+  EXPECT_TRUE(message_->FindNestedTypeByName("NoSuchType") == NULL);
+  EXPECT_TRUE(message_->FindNestedTypeByName("Baz") == NULL);
+  EXPECT_TRUE(message2_->FindNestedTypeByName("Bar") == NULL);
 
   EXPECT_TRUE(message_->FindNestedTypeByName("Qux") == NULL);
 }
 
 TEST_F(NestedDescriptorTest, EnumName) {
-  EXPECT_EQ("Baz" , baz_ ->name());
-  EXPECT_EQ("Qux" , qux_ ->name());
-  EXPECT_EQ("Qux" , qux2_->name());
+  EXPECT_EQ("Baz", baz_->name());
+  EXPECT_EQ("Qux", qux_->name());
+  EXPECT_EQ("Qux", qux2_->name());
   EXPECT_EQ("Quux", quux2_->name());
 
   EXPECT_EQ("TestMessage.Baz", baz_->full_name());
   EXPECT_EQ("TestMessage.Qux", qux_->full_name());
-  EXPECT_EQ("corge.grault.TestMessage2.Qux" , qux2_ ->full_name());
+  EXPECT_EQ("corge.grault.TestMessage2.Qux", qux2_->full_name());
   EXPECT_EQ("corge.grault.TestMessage2.Quux", quux2_->full_name());
 }
 
 TEST_F(NestedDescriptorTest, EnumContainingType) {
-  EXPECT_EQ(message_ , baz_  ->containing_type());
-  EXPECT_EQ(message_ , qux_  ->containing_type());
-  EXPECT_EQ(message2_, qux2_ ->containing_type());
+  EXPECT_EQ(message_, baz_->containing_type());
+  EXPECT_EQ(message_, qux_->containing_type());
+  EXPECT_EQ(message2_, qux2_->containing_type());
   EXPECT_EQ(message2_, quux2_->containing_type());
 }
 
@@ -1758,27 +1769,27 @@
 }
 
 TEST_F(NestedDescriptorTest, FindEnumTypeByName) {
-  EXPECT_EQ(baz_  , message_ ->FindEnumTypeByName("Baz" ));
-  EXPECT_EQ(qux_  , message_ ->FindEnumTypeByName("Qux" ));
-  EXPECT_EQ(qux2_ , message2_->FindEnumTypeByName("Qux" ));
+  EXPECT_EQ(baz_, message_->FindEnumTypeByName("Baz"));
+  EXPECT_EQ(qux_, message_->FindEnumTypeByName("Qux"));
+  EXPECT_EQ(qux2_, message2_->FindEnumTypeByName("Qux"));
   EXPECT_EQ(quux2_, message2_->FindEnumTypeByName("Quux"));
 
-  EXPECT_TRUE(message_ ->FindEnumTypeByName("NoSuchType") == NULL);
-  EXPECT_TRUE(message_ ->FindEnumTypeByName("Quux"      ) == NULL);
-  EXPECT_TRUE(message2_->FindEnumTypeByName("Baz"       ) == NULL);
+  EXPECT_TRUE(message_->FindEnumTypeByName("NoSuchType") == NULL);
+  EXPECT_TRUE(message_->FindEnumTypeByName("Quux") == NULL);
+  EXPECT_TRUE(message2_->FindEnumTypeByName("Baz") == NULL);
 
   EXPECT_TRUE(message_->FindEnumTypeByName("Foo") == NULL);
 }
 
 TEST_F(NestedDescriptorTest, FindEnumValueByName) {
-  EXPECT_EQ(a_ , message_ ->FindEnumValueByName("A"));
-  EXPECT_EQ(b_ , message_ ->FindEnumValueByName("B"));
+  EXPECT_EQ(a_, message_->FindEnumValueByName("A"));
+  EXPECT_EQ(b_, message_->FindEnumValueByName("B"));
   EXPECT_EQ(a2_, message2_->FindEnumValueByName("A"));
   EXPECT_EQ(c2_, message2_->FindEnumValueByName("C"));
 
-  EXPECT_TRUE(message_ ->FindEnumValueByName("NO_SUCH_VALUE") == NULL);
-  EXPECT_TRUE(message_ ->FindEnumValueByName("C"            ) == NULL);
-  EXPECT_TRUE(message2_->FindEnumValueByName("B"            ) == NULL);
+  EXPECT_TRUE(message_->FindEnumValueByName("NO_SUCH_VALUE") == NULL);
+  EXPECT_TRUE(message_->FindEnumValueByName("C") == NULL);
+  EXPECT_TRUE(message2_->FindEnumValueByName("B") == NULL);
 
   EXPECT_TRUE(message_->FindEnumValueByName("Foo") == NULL);
 }
@@ -1822,17 +1833,17 @@
     AddExtension(&foo_file, "Foo", "foo_enum", 19,
                  FieldDescriptorProto::LABEL_REPEATED,
                  FieldDescriptorProto::TYPE_ENUM)
-      ->set_type_name("Baz");
+        ->set_type_name("Baz");
 
     DescriptorProto* bar = AddMessage(&foo_file, "Bar");
     AddNestedExtension(bar, "Foo", "foo_message", 30,
                        FieldDescriptorProto::LABEL_OPTIONAL,
                        FieldDescriptorProto::TYPE_MESSAGE)
-      ->set_type_name("Qux");
+        ->set_type_name("Qux");
     AddNestedExtension(bar, "Foo", "foo_group", 39,
                        FieldDescriptorProto::LABEL_REPEATED,
                        FieldDescriptorProto::TYPE_GROUP)
-      ->set_type_name("Qux");
+        ->set_type_name("Qux");
 
     // Build the descriptors and get the pointers.
     foo_file_ = pool_.BuildFile(foo_file);
@@ -1878,20 +1889,20 @@
   EXPECT_TRUE(bar_->extension(0)->is_extension());
   EXPECT_TRUE(bar_->extension(1)->is_extension());
 
-  EXPECT_EQ("foo_int32"  , foo_file_->extension(0)->name());
-  EXPECT_EQ("foo_enum"   , foo_file_->extension(1)->name());
+  EXPECT_EQ("foo_int32", foo_file_->extension(0)->name());
+  EXPECT_EQ("foo_enum", foo_file_->extension(1)->name());
   EXPECT_EQ("foo_message", bar_->extension(0)->name());
-  EXPECT_EQ("foo_group"  , bar_->extension(1)->name());
+  EXPECT_EQ("foo_group", bar_->extension(1)->name());
 
   EXPECT_EQ(10, foo_file_->extension(0)->number());
   EXPECT_EQ(19, foo_file_->extension(1)->number());
   EXPECT_EQ(30, bar_->extension(0)->number());
   EXPECT_EQ(39, bar_->extension(1)->number());
 
-  EXPECT_EQ(FieldDescriptor::TYPE_INT32  , foo_file_->extension(0)->type());
-  EXPECT_EQ(FieldDescriptor::TYPE_ENUM   , foo_file_->extension(1)->type());
+  EXPECT_EQ(FieldDescriptor::TYPE_INT32, foo_file_->extension(0)->type());
+  EXPECT_EQ(FieldDescriptor::TYPE_ENUM, foo_file_->extension(1)->type());
   EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_->extension(0)->type());
-  EXPECT_EQ(FieldDescriptor::TYPE_GROUP  , bar_->extension(1)->type());
+  EXPECT_EQ(FieldDescriptor::TYPE_GROUP, bar_->extension(1)->type());
 
   EXPECT_EQ(baz_, foo_file_->extension(1)->enum_type());
   EXPECT_EQ(qux_, bar_->extension(0)->message_type());
@@ -1914,13 +1925,13 @@
 };
 
 TEST_F(ExtensionDescriptorTest, IsExtensionNumber) {
-  EXPECT_FALSE(foo_->IsExtensionNumber( 9));
-  EXPECT_TRUE (foo_->IsExtensionNumber(10));
-  EXPECT_TRUE (foo_->IsExtensionNumber(19));
+  EXPECT_FALSE(foo_->IsExtensionNumber(9));
+  EXPECT_TRUE(foo_->IsExtensionNumber(10));
+  EXPECT_TRUE(foo_->IsExtensionNumber(19));
   EXPECT_FALSE(foo_->IsExtensionNumber(20));
   EXPECT_FALSE(foo_->IsExtensionNumber(29));
-  EXPECT_TRUE (foo_->IsExtensionNumber(30));
-  EXPECT_TRUE (foo_->IsExtensionNumber(39));
+  EXPECT_TRUE(foo_->IsExtensionNumber(30));
+  EXPECT_TRUE(foo_->IsExtensionNumber(39));
   EXPECT_FALSE(foo_->IsExtensionNumber(40));
 }
 
@@ -1930,7 +1941,7 @@
   ASSERT_EQ(2, bar_->extension_count());
 
   EXPECT_EQ(bar_->extension(0), bar_->FindExtensionByName("foo_message"));
-  EXPECT_EQ(bar_->extension(1), bar_->FindExtensionByName("foo_group"  ));
+  EXPECT_EQ(bar_->extension(1), bar_->FindExtensionByName("foo_group"));
 
   EXPECT_TRUE(bar_->FindExtensionByName("no_such_extension") == NULL);
   EXPECT_TRUE(foo_->FindExtensionByName("foo_int32") == NULL);
@@ -2034,16 +2045,16 @@
 
 TEST_F(ReservedDescriptorTest, IsReservedNumber) {
   EXPECT_FALSE(foo_->IsReservedNumber(1));
-  EXPECT_TRUE (foo_->IsReservedNumber(2));
+  EXPECT_TRUE(foo_->IsReservedNumber(2));
   EXPECT_FALSE(foo_->IsReservedNumber(3));
   EXPECT_FALSE(foo_->IsReservedNumber(8));
-  EXPECT_TRUE (foo_->IsReservedNumber(9));
-  EXPECT_TRUE (foo_->IsReservedNumber(10));
-  EXPECT_TRUE (foo_->IsReservedNumber(11));
+  EXPECT_TRUE(foo_->IsReservedNumber(9));
+  EXPECT_TRUE(foo_->IsReservedNumber(10));
+  EXPECT_TRUE(foo_->IsReservedNumber(11));
   EXPECT_FALSE(foo_->IsReservedNumber(12));
   EXPECT_FALSE(foo_->IsReservedNumber(13));
   EXPECT_FALSE(foo_->IsReservedNumber(14));
-  EXPECT_TRUE (foo_->IsReservedNumber(15));
+  EXPECT_TRUE(foo_->IsReservedNumber(15));
   EXPECT_FALSE(foo_->IsReservedNumber(16));
 };
 
@@ -2055,8 +2066,8 @@
 };
 
 TEST_F(ReservedDescriptorTest, IsReservedName) {
-  EXPECT_TRUE (foo_->IsReservedName("foo"));
-  EXPECT_TRUE (foo_->IsReservedName("bar"));
+  EXPECT_TRUE(foo_->IsReservedName("foo"));
+  EXPECT_TRUE(foo_->IsReservedName("bar"));
   EXPECT_FALSE(foo_->IsReservedName("baz"));
 };
 
@@ -2153,17 +2164,17 @@
   EXPECT_TRUE(foo_->IsReservedNumber(-1));
   EXPECT_TRUE(foo_->IsReservedNumber(0));
   EXPECT_TRUE(foo_->IsReservedNumber(1));
-  EXPECT_TRUE (foo_->IsReservedNumber(2));
+  EXPECT_TRUE(foo_->IsReservedNumber(2));
   EXPECT_TRUE(foo_->IsReservedNumber(3));
   EXPECT_FALSE(foo_->IsReservedNumber(8));
-  EXPECT_TRUE (foo_->IsReservedNumber(9));
-  EXPECT_TRUE (foo_->IsReservedNumber(10));
-  EXPECT_TRUE (foo_->IsReservedNumber(11));
+  EXPECT_TRUE(foo_->IsReservedNumber(9));
+  EXPECT_TRUE(foo_->IsReservedNumber(10));
+  EXPECT_TRUE(foo_->IsReservedNumber(11));
   EXPECT_TRUE(foo_->IsReservedNumber(12));
   EXPECT_FALSE(foo_->IsReservedNumber(13));
   EXPECT_FALSE(foo_->IsReservedNumber(13));
   EXPECT_FALSE(foo_->IsReservedNumber(14));
-  EXPECT_TRUE (foo_->IsReservedNumber(15));
+  EXPECT_TRUE(foo_->IsReservedNumber(15));
   EXPECT_TRUE(foo_->IsReservedNumber(16));
   EXPECT_FALSE(foo_->IsReservedNumber(17));
 
@@ -2186,8 +2197,8 @@
 }
 
 TEST_F(ReservedEnumDescriptorTest, IsReservedName) {
-  EXPECT_TRUE (foo_->IsReservedName("foo"));
-  EXPECT_TRUE (foo_->IsReservedName("bar"));
+  EXPECT_TRUE(foo_->IsReservedName("foo"));
+  EXPECT_TRUE(foo_->IsReservedName("bar"));
   EXPECT_FALSE(foo_->IsReservedName("baz"));
 }
 
@@ -2202,9 +2213,9 @@
     AddEmptyEnum(&file_proto, "DummyEnum");
 
     DescriptorProto* message = AddMessage(&file_proto, "TestMessage");
-    FieldDescriptorProto* field =
-      AddField(message, "foo", 1, FieldDescriptorProto::LABEL_OPTIONAL,
-               static_cast<FieldDescriptorProto::Type>(static_cast<int>(type)));
+    FieldDescriptorProto* field = AddField(
+        message, "foo", 1, FieldDescriptorProto::LABEL_OPTIONAL,
+        static_cast<FieldDescriptorProto::Type>(static_cast<int>(type)));
 
     if (type == FieldDescriptor::TYPE_MESSAGE ||
         type == FieldDescriptor::TYPE_GROUP) {
@@ -2217,8 +2228,7 @@
     pool_.reset(new DescriptorPool());
     const FileDescriptor* file = pool_->BuildFile(file_proto);
 
-    if (file != NULL &&
-        file->message_type_count() == 1 &&
+    if (file != NULL && file->message_type_count() == 1 &&
         file->message_type(0)->field_count() == 1) {
       return file->message_type(0)->field(0);
     } else {
@@ -2233,8 +2243,8 @@
 
   FieldDescriptor::CppType GetCppTypeForFieldType(FieldDescriptor::Type type) {
     const FieldDescriptor* field = GetFieldDescriptorOfType(type);
-    return field != NULL ? field->cpp_type() :
-        static_cast<FieldDescriptor::CppType>(0);
+    return field != NULL ? field->cpp_type()
+                         : static_cast<FieldDescriptor::CppType>(0);
   }
 
   const char* GetCppTypeNameForFieldType(FieldDescriptor::Type type) {
@@ -2249,7 +2259,7 @@
   }
 
   const EnumDescriptor* GetEnumDescriptorForFieldType(
-    FieldDescriptor::Type type) {
+      FieldDescriptor::Type type) {
     const FieldDescriptor* field = GetFieldDescriptorOfType(type);
     return field != NULL ? field->enum_type() : NULL;
   }
@@ -2262,24 +2272,24 @@
 
   typedef FieldDescriptor FD;  // avoid ugly line wrapping
 
-  EXPECT_STREQ("double"  , GetTypeNameForFieldType(FD::TYPE_DOUBLE  ));
-  EXPECT_STREQ("float"   , GetTypeNameForFieldType(FD::TYPE_FLOAT   ));
-  EXPECT_STREQ("int64"   , GetTypeNameForFieldType(FD::TYPE_INT64   ));
-  EXPECT_STREQ("uint64"  , GetTypeNameForFieldType(FD::TYPE_UINT64  ));
-  EXPECT_STREQ("int32"   , GetTypeNameForFieldType(FD::TYPE_INT32   ));
-  EXPECT_STREQ("fixed64" , GetTypeNameForFieldType(FD::TYPE_FIXED64 ));
-  EXPECT_STREQ("fixed32" , GetTypeNameForFieldType(FD::TYPE_FIXED32 ));
-  EXPECT_STREQ("bool"    , GetTypeNameForFieldType(FD::TYPE_BOOL    ));
+  EXPECT_STREQ("double", GetTypeNameForFieldType(FD::TYPE_DOUBLE));
+  EXPECT_STREQ("float", GetTypeNameForFieldType(FD::TYPE_FLOAT));
+  EXPECT_STREQ("int64", GetTypeNameForFieldType(FD::TYPE_INT64));
+  EXPECT_STREQ("uint64", GetTypeNameForFieldType(FD::TYPE_UINT64));
+  EXPECT_STREQ("int32", GetTypeNameForFieldType(FD::TYPE_INT32));
+  EXPECT_STREQ("fixed64", GetTypeNameForFieldType(FD::TYPE_FIXED64));
+  EXPECT_STREQ("fixed32", GetTypeNameForFieldType(FD::TYPE_FIXED32));
+  EXPECT_STREQ("bool", GetTypeNameForFieldType(FD::TYPE_BOOL));
   EXPECT_STREQ("string", GetTypeNameForFieldType(FD::TYPE_STRING));
-  EXPECT_STREQ("group"   , GetTypeNameForFieldType(FD::TYPE_GROUP   ));
-  EXPECT_STREQ("message" , GetTypeNameForFieldType(FD::TYPE_MESSAGE ));
-  EXPECT_STREQ("bytes"   , GetTypeNameForFieldType(FD::TYPE_BYTES   ));
-  EXPECT_STREQ("uint32"  , GetTypeNameForFieldType(FD::TYPE_UINT32  ));
-  EXPECT_STREQ("enum"    , GetTypeNameForFieldType(FD::TYPE_ENUM    ));
+  EXPECT_STREQ("group", GetTypeNameForFieldType(FD::TYPE_GROUP));
+  EXPECT_STREQ("message", GetTypeNameForFieldType(FD::TYPE_MESSAGE));
+  EXPECT_STREQ("bytes", GetTypeNameForFieldType(FD::TYPE_BYTES));
+  EXPECT_STREQ("uint32", GetTypeNameForFieldType(FD::TYPE_UINT32));
+  EXPECT_STREQ("enum", GetTypeNameForFieldType(FD::TYPE_ENUM));
   EXPECT_STREQ("sfixed32", GetTypeNameForFieldType(FD::TYPE_SFIXED32));
   EXPECT_STREQ("sfixed64", GetTypeNameForFieldType(FD::TYPE_SFIXED64));
-  EXPECT_STREQ("sint32"  , GetTypeNameForFieldType(FD::TYPE_SINT32  ));
-  EXPECT_STREQ("sint64"  , GetTypeNameForFieldType(FD::TYPE_SINT64  ));
+  EXPECT_STREQ("sint32", GetTypeNameForFieldType(FD::TYPE_SINT32));
+  EXPECT_STREQ("sint64", GetTypeNameForFieldType(FD::TYPE_SINT64));
 }
 
 TEST_F(MiscTest, StaticTypeNames) {
@@ -2287,24 +2297,24 @@
 
   typedef FieldDescriptor FD;  // avoid ugly line wrapping
 
-  EXPECT_STREQ("double"  , FD::TypeName(FD::TYPE_DOUBLE  ));
-  EXPECT_STREQ("float"   , FD::TypeName(FD::TYPE_FLOAT   ));
-  EXPECT_STREQ("int64"   , FD::TypeName(FD::TYPE_INT64   ));
-  EXPECT_STREQ("uint64"  , FD::TypeName(FD::TYPE_UINT64  ));
-  EXPECT_STREQ("int32"   , FD::TypeName(FD::TYPE_INT32   ));
-  EXPECT_STREQ("fixed64" , FD::TypeName(FD::TYPE_FIXED64 ));
-  EXPECT_STREQ("fixed32" , FD::TypeName(FD::TYPE_FIXED32 ));
-  EXPECT_STREQ("bool"    , FD::TypeName(FD::TYPE_BOOL    ));
+  EXPECT_STREQ("double", FD::TypeName(FD::TYPE_DOUBLE));
+  EXPECT_STREQ("float", FD::TypeName(FD::TYPE_FLOAT));
+  EXPECT_STREQ("int64", FD::TypeName(FD::TYPE_INT64));
+  EXPECT_STREQ("uint64", FD::TypeName(FD::TYPE_UINT64));
+  EXPECT_STREQ("int32", FD::TypeName(FD::TYPE_INT32));
+  EXPECT_STREQ("fixed64", FD::TypeName(FD::TYPE_FIXED64));
+  EXPECT_STREQ("fixed32", FD::TypeName(FD::TYPE_FIXED32));
+  EXPECT_STREQ("bool", FD::TypeName(FD::TYPE_BOOL));
   EXPECT_STREQ("string", FD::TypeName(FD::TYPE_STRING));
-  EXPECT_STREQ("group"   , FD::TypeName(FD::TYPE_GROUP   ));
-  EXPECT_STREQ("message" , FD::TypeName(FD::TYPE_MESSAGE ));
-  EXPECT_STREQ("bytes"   , FD::TypeName(FD::TYPE_BYTES   ));
-  EXPECT_STREQ("uint32"  , FD::TypeName(FD::TYPE_UINT32  ));
-  EXPECT_STREQ("enum"    , FD::TypeName(FD::TYPE_ENUM    ));
+  EXPECT_STREQ("group", FD::TypeName(FD::TYPE_GROUP));
+  EXPECT_STREQ("message", FD::TypeName(FD::TYPE_MESSAGE));
+  EXPECT_STREQ("bytes", FD::TypeName(FD::TYPE_BYTES));
+  EXPECT_STREQ("uint32", FD::TypeName(FD::TYPE_UINT32));
+  EXPECT_STREQ("enum", FD::TypeName(FD::TYPE_ENUM));
   EXPECT_STREQ("sfixed32", FD::TypeName(FD::TYPE_SFIXED32));
   EXPECT_STREQ("sfixed64", FD::TypeName(FD::TYPE_SFIXED64));
-  EXPECT_STREQ("sint32"  , FD::TypeName(FD::TYPE_SINT32  ));
-  EXPECT_STREQ("sint64"  , FD::TypeName(FD::TYPE_SINT64  ));
+  EXPECT_STREQ("sint32", FD::TypeName(FD::TYPE_SINT32));
+  EXPECT_STREQ("sint64", FD::TypeName(FD::TYPE_SINT64));
 }
 
 TEST_F(MiscTest, CppTypes) {
@@ -2312,24 +2322,24 @@
 
   typedef FieldDescriptor FD;  // avoid ugly line wrapping
 
-  EXPECT_EQ(FD::CPPTYPE_DOUBLE , GetCppTypeForFieldType(FD::TYPE_DOUBLE  ));
-  EXPECT_EQ(FD::CPPTYPE_FLOAT  , GetCppTypeForFieldType(FD::TYPE_FLOAT   ));
-  EXPECT_EQ(FD::CPPTYPE_INT64  , GetCppTypeForFieldType(FD::TYPE_INT64   ));
-  EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_UINT64  ));
-  EXPECT_EQ(FD::CPPTYPE_INT32  , GetCppTypeForFieldType(FD::TYPE_INT32   ));
-  EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_FIXED64 ));
-  EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_FIXED32 ));
-  EXPECT_EQ(FD::CPPTYPE_BOOL   , GetCppTypeForFieldType(FD::TYPE_BOOL    ));
-  EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_STRING  ));
-  EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_GROUP   ));
-  EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_MESSAGE ));
-  EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_BYTES   ));
-  EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_UINT32  ));
-  EXPECT_EQ(FD::CPPTYPE_ENUM   , GetCppTypeForFieldType(FD::TYPE_ENUM    ));
-  EXPECT_EQ(FD::CPPTYPE_INT32  , GetCppTypeForFieldType(FD::TYPE_SFIXED32));
-  EXPECT_EQ(FD::CPPTYPE_INT64  , GetCppTypeForFieldType(FD::TYPE_SFIXED64));
-  EXPECT_EQ(FD::CPPTYPE_INT32  , GetCppTypeForFieldType(FD::TYPE_SINT32  ));
-  EXPECT_EQ(FD::CPPTYPE_INT64  , GetCppTypeForFieldType(FD::TYPE_SINT64  ));
+  EXPECT_EQ(FD::CPPTYPE_DOUBLE, GetCppTypeForFieldType(FD::TYPE_DOUBLE));
+  EXPECT_EQ(FD::CPPTYPE_FLOAT, GetCppTypeForFieldType(FD::TYPE_FLOAT));
+  EXPECT_EQ(FD::CPPTYPE_INT64, GetCppTypeForFieldType(FD::TYPE_INT64));
+  EXPECT_EQ(FD::CPPTYPE_UINT64, GetCppTypeForFieldType(FD::TYPE_UINT64));
+  EXPECT_EQ(FD::CPPTYPE_INT32, GetCppTypeForFieldType(FD::TYPE_INT32));
+  EXPECT_EQ(FD::CPPTYPE_UINT64, GetCppTypeForFieldType(FD::TYPE_FIXED64));
+  EXPECT_EQ(FD::CPPTYPE_UINT32, GetCppTypeForFieldType(FD::TYPE_FIXED32));
+  EXPECT_EQ(FD::CPPTYPE_BOOL, GetCppTypeForFieldType(FD::TYPE_BOOL));
+  EXPECT_EQ(FD::CPPTYPE_STRING, GetCppTypeForFieldType(FD::TYPE_STRING));
+  EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_GROUP));
+  EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_MESSAGE));
+  EXPECT_EQ(FD::CPPTYPE_STRING, GetCppTypeForFieldType(FD::TYPE_BYTES));
+  EXPECT_EQ(FD::CPPTYPE_UINT32, GetCppTypeForFieldType(FD::TYPE_UINT32));
+  EXPECT_EQ(FD::CPPTYPE_ENUM, GetCppTypeForFieldType(FD::TYPE_ENUM));
+  EXPECT_EQ(FD::CPPTYPE_INT32, GetCppTypeForFieldType(FD::TYPE_SFIXED32));
+  EXPECT_EQ(FD::CPPTYPE_INT64, GetCppTypeForFieldType(FD::TYPE_SFIXED64));
+  EXPECT_EQ(FD::CPPTYPE_INT32, GetCppTypeForFieldType(FD::TYPE_SINT32));
+  EXPECT_EQ(FD::CPPTYPE_INT64, GetCppTypeForFieldType(FD::TYPE_SINT64));
 }
 
 TEST_F(MiscTest, CppTypeNames) {
@@ -2337,24 +2347,24 @@
 
   typedef FieldDescriptor FD;  // avoid ugly line wrapping
 
-  EXPECT_STREQ("double" , GetCppTypeNameForFieldType(FD::TYPE_DOUBLE  ));
-  EXPECT_STREQ("float"  , GetCppTypeNameForFieldType(FD::TYPE_FLOAT   ));
-  EXPECT_STREQ("int64"  , GetCppTypeNameForFieldType(FD::TYPE_INT64   ));
-  EXPECT_STREQ("uint64" , GetCppTypeNameForFieldType(FD::TYPE_UINT64  ));
-  EXPECT_STREQ("int32"  , GetCppTypeNameForFieldType(FD::TYPE_INT32   ));
-  EXPECT_STREQ("uint64" , GetCppTypeNameForFieldType(FD::TYPE_FIXED64 ));
-  EXPECT_STREQ("uint32" , GetCppTypeNameForFieldType(FD::TYPE_FIXED32 ));
-  EXPECT_STREQ("bool"   , GetCppTypeNameForFieldType(FD::TYPE_BOOL    ));
+  EXPECT_STREQ("double", GetCppTypeNameForFieldType(FD::TYPE_DOUBLE));
+  EXPECT_STREQ("float", GetCppTypeNameForFieldType(FD::TYPE_FLOAT));
+  EXPECT_STREQ("int64", GetCppTypeNameForFieldType(FD::TYPE_INT64));
+  EXPECT_STREQ("uint64", GetCppTypeNameForFieldType(FD::TYPE_UINT64));
+  EXPECT_STREQ("int32", GetCppTypeNameForFieldType(FD::TYPE_INT32));
+  EXPECT_STREQ("uint64", GetCppTypeNameForFieldType(FD::TYPE_FIXED64));
+  EXPECT_STREQ("uint32", GetCppTypeNameForFieldType(FD::TYPE_FIXED32));
+  EXPECT_STREQ("bool", GetCppTypeNameForFieldType(FD::TYPE_BOOL));
   EXPECT_STREQ("string", GetCppTypeNameForFieldType(FD::TYPE_STRING));
-  EXPECT_STREQ("message", GetCppTypeNameForFieldType(FD::TYPE_GROUP   ));
-  EXPECT_STREQ("message", GetCppTypeNameForFieldType(FD::TYPE_MESSAGE ));
+  EXPECT_STREQ("message", GetCppTypeNameForFieldType(FD::TYPE_GROUP));
+  EXPECT_STREQ("message", GetCppTypeNameForFieldType(FD::TYPE_MESSAGE));
   EXPECT_STREQ("string", GetCppTypeNameForFieldType(FD::TYPE_BYTES));
-  EXPECT_STREQ("uint32" , GetCppTypeNameForFieldType(FD::TYPE_UINT32  ));
-  EXPECT_STREQ("enum"   , GetCppTypeNameForFieldType(FD::TYPE_ENUM    ));
-  EXPECT_STREQ("int32"  , GetCppTypeNameForFieldType(FD::TYPE_SFIXED32));
-  EXPECT_STREQ("int64"  , GetCppTypeNameForFieldType(FD::TYPE_SFIXED64));
-  EXPECT_STREQ("int32"  , GetCppTypeNameForFieldType(FD::TYPE_SINT32  ));
-  EXPECT_STREQ("int64"  , GetCppTypeNameForFieldType(FD::TYPE_SINT64  ));
+  EXPECT_STREQ("uint32", GetCppTypeNameForFieldType(FD::TYPE_UINT32));
+  EXPECT_STREQ("enum", GetCppTypeNameForFieldType(FD::TYPE_ENUM));
+  EXPECT_STREQ("int32", GetCppTypeNameForFieldType(FD::TYPE_SFIXED32));
+  EXPECT_STREQ("int64", GetCppTypeNameForFieldType(FD::TYPE_SFIXED64));
+  EXPECT_STREQ("int32", GetCppTypeNameForFieldType(FD::TYPE_SINT32));
+  EXPECT_STREQ("int64", GetCppTypeNameForFieldType(FD::TYPE_SINT64));
 }
 
 TEST_F(MiscTest, StaticCppTypeNames) {
@@ -2362,14 +2372,14 @@
 
   typedef FieldDescriptor FD;  // avoid ugly line wrapping
 
-  EXPECT_STREQ("int32"  , FD::CppTypeName(FD::CPPTYPE_INT32  ));
-  EXPECT_STREQ("int64"  , FD::CppTypeName(FD::CPPTYPE_INT64  ));
-  EXPECT_STREQ("uint32" , FD::CppTypeName(FD::CPPTYPE_UINT32 ));
-  EXPECT_STREQ("uint64" , FD::CppTypeName(FD::CPPTYPE_UINT64 ));
-  EXPECT_STREQ("double" , FD::CppTypeName(FD::CPPTYPE_DOUBLE ));
-  EXPECT_STREQ("float"  , FD::CppTypeName(FD::CPPTYPE_FLOAT  ));
-  EXPECT_STREQ("bool"   , FD::CppTypeName(FD::CPPTYPE_BOOL   ));
-  EXPECT_STREQ("enum"   , FD::CppTypeName(FD::CPPTYPE_ENUM   ));
+  EXPECT_STREQ("int32", FD::CppTypeName(FD::CPPTYPE_INT32));
+  EXPECT_STREQ("int64", FD::CppTypeName(FD::CPPTYPE_INT64));
+  EXPECT_STREQ("uint32", FD::CppTypeName(FD::CPPTYPE_UINT32));
+  EXPECT_STREQ("uint64", FD::CppTypeName(FD::CPPTYPE_UINT64));
+  EXPECT_STREQ("double", FD::CppTypeName(FD::CPPTYPE_DOUBLE));
+  EXPECT_STREQ("float", FD::CppTypeName(FD::CPPTYPE_FLOAT));
+  EXPECT_STREQ("bool", FD::CppTypeName(FD::CPPTYPE_BOOL));
+  EXPECT_STREQ("enum", FD::CppTypeName(FD::CPPTYPE_ENUM));
   EXPECT_STREQ("string", FD::CppTypeName(FD::CPPTYPE_STRING));
   EXPECT_STREQ("message", FD::CppTypeName(FD::CPPTYPE_MESSAGE));
 }
@@ -2379,24 +2389,24 @@
 
   typedef FieldDescriptor FD;  // avoid ugly line wrapping
 
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_DOUBLE  ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FLOAT   ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_INT64   ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_UINT64  ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_INT32   ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FIXED64 ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FIXED32 ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_BOOL    ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_STRING  ));
-  EXPECT_TRUE(NULL != GetMessageDescriptorForFieldType(FD::TYPE_GROUP   ));
-  EXPECT_TRUE(NULL != GetMessageDescriptorForFieldType(FD::TYPE_MESSAGE ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_BYTES   ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_UINT32  ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_ENUM    ));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_DOUBLE));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FLOAT));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_INT64));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_UINT64));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_INT32));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FIXED64));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_FIXED32));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_BOOL));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_STRING));
+  EXPECT_TRUE(NULL != GetMessageDescriptorForFieldType(FD::TYPE_GROUP));
+  EXPECT_TRUE(NULL != GetMessageDescriptorForFieldType(FD::TYPE_MESSAGE));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_BYTES));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_UINT32));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_ENUM));
   EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SFIXED32));
   EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SFIXED64));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SINT32  ));
-  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SINT64  ));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SINT32));
+  EXPECT_TRUE(NULL == GetMessageDescriptorForFieldType(FD::TYPE_SINT64));
 }
 
 TEST_F(MiscTest, EnumType) {
@@ -2404,27 +2414,26 @@
 
   typedef FieldDescriptor FD;  // avoid ugly line wrapping
 
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_DOUBLE  ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FLOAT   ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_INT64   ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_UINT64  ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_INT32   ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FIXED64 ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FIXED32 ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_BOOL    ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_STRING  ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_GROUP   ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_MESSAGE ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_BYTES   ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_UINT32  ));
-  EXPECT_TRUE(NULL != GetEnumDescriptorForFieldType(FD::TYPE_ENUM    ));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_DOUBLE));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FLOAT));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_INT64));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_UINT64));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_INT32));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FIXED64));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_FIXED32));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_BOOL));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_STRING));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_GROUP));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_MESSAGE));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_BYTES));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_UINT32));
+  EXPECT_TRUE(NULL != GetEnumDescriptorForFieldType(FD::TYPE_ENUM));
   EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SFIXED32));
   EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SFIXED64));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SINT32  ));
-  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SINT64  ));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SINT32));
+  EXPECT_TRUE(NULL == GetEnumDescriptorForFieldType(FD::TYPE_SINT64));
 }
 
-
 TEST_F(MiscTest, DefaultValues) {
   // Test that setting default values works.
   FileDescriptorProto file_proto;
@@ -2440,47 +2449,47 @@
   const FD::Label label = FD::LABEL_OPTIONAL;
 
   // Create fields of every CPP type with default values.
-  AddField(message_proto, "int32" , 1, label, FD::TYPE_INT32 )
-    ->set_default_value("-1");
-  AddField(message_proto, "int64" , 2, label, FD::TYPE_INT64 )
-    ->set_default_value("-1000000000000");
+  AddField(message_proto, "int32", 1, label, FD::TYPE_INT32)
+      ->set_default_value("-1");
+  AddField(message_proto, "int64", 2, label, FD::TYPE_INT64)
+      ->set_default_value("-1000000000000");
   AddField(message_proto, "uint32", 3, label, FD::TYPE_UINT32)
-    ->set_default_value("42");
+      ->set_default_value("42");
   AddField(message_proto, "uint64", 4, label, FD::TYPE_UINT64)
-    ->set_default_value("2000000000000");
-  AddField(message_proto, "float" , 5, label, FD::TYPE_FLOAT )
-    ->set_default_value("4.5");
+      ->set_default_value("2000000000000");
+  AddField(message_proto, "float", 5, label, FD::TYPE_FLOAT)
+      ->set_default_value("4.5");
   AddField(message_proto, "double", 6, label, FD::TYPE_DOUBLE)
-    ->set_default_value("10e100");
-  AddField(message_proto, "bool"  , 7, label, FD::TYPE_BOOL  )
-    ->set_default_value("true");
+      ->set_default_value("10e100");
+  AddField(message_proto, "bool", 7, label, FD::TYPE_BOOL)
+      ->set_default_value("true");
   AddField(message_proto, "string", 8, label, FD::TYPE_STRING)
       ->set_default_value("hello");
-  AddField(message_proto, "data"  , 9, label, FD::TYPE_BYTES )
-    ->set_default_value("\\001\\002\\003");
+  AddField(message_proto, "data", 9, label, FD::TYPE_BYTES)
+      ->set_default_value("\\001\\002\\003");
 
   FieldDescriptorProto* enum_field =
-    AddField(message_proto, "enum", 10, label, FD::TYPE_ENUM);
+      AddField(message_proto, "enum", 10, label, FD::TYPE_ENUM);
   enum_field->set_type_name("DummyEnum");
   enum_field->set_default_value("B");
 
   // Strings are allowed to have empty defaults.  (At one point, due to
   // a bug, empty defaults for strings were rejected.  Oops.)
   AddField(message_proto, "empty_string", 11, label, FD::TYPE_STRING)
-    ->set_default_value("");
+      ->set_default_value("");
 
   // Add a second set of fields with implicit defalut values.
-  AddField(message_proto, "implicit_int32" , 21, label, FD::TYPE_INT32 );
-  AddField(message_proto, "implicit_int64" , 22, label, FD::TYPE_INT64 );
+  AddField(message_proto, "implicit_int32", 21, label, FD::TYPE_INT32);
+  AddField(message_proto, "implicit_int64", 22, label, FD::TYPE_INT64);
   AddField(message_proto, "implicit_uint32", 23, label, FD::TYPE_UINT32);
   AddField(message_proto, "implicit_uint64", 24, label, FD::TYPE_UINT64);
-  AddField(message_proto, "implicit_float" , 25, label, FD::TYPE_FLOAT );
+  AddField(message_proto, "implicit_float", 25, label, FD::TYPE_FLOAT);
   AddField(message_proto, "implicit_double", 26, label, FD::TYPE_DOUBLE);
-  AddField(message_proto, "implicit_bool"  , 27, label, FD::TYPE_BOOL  );
+  AddField(message_proto, "implicit_bool", 27, label, FD::TYPE_BOOL);
   AddField(message_proto, "implicit_string", 28, label, FD::TYPE_STRING);
-  AddField(message_proto, "implicit_data"  , 29, label, FD::TYPE_BYTES );
-  AddField(message_proto, "implicit_enum"  , 30, label, FD::TYPE_ENUM)
-    ->set_type_name("DummyEnum");
+  AddField(message_proto, "implicit_data", 29, label, FD::TYPE_BYTES);
+  AddField(message_proto, "implicit_enum", 30, label, FD::TYPE_ENUM)
+      ->set_type_name("DummyEnum");
 
   // Build it.
   DescriptorPool pool;
@@ -2517,13 +2526,13 @@
   EXPECT_EQ(42, message->field(2)->default_value_uint32());
   EXPECT_EQ(PROTOBUF_ULONGLONG(2000000000000),
             message->field(3)->default_value_uint64());
-  EXPECT_EQ(4.5             , message->field(4)->default_value_float ());
-  EXPECT_EQ(10e100          , message->field(5)->default_value_double());
-  EXPECT_TRUE(                message->field(6)->default_value_bool  ());
-  EXPECT_EQ("hello"         , message->field(7)->default_value_string());
-  EXPECT_EQ("\001\002\003"  , message->field(8)->default_value_string());
-  EXPECT_EQ(enum_value_b    , message->field(9)->default_value_enum  ());
-  EXPECT_EQ(""              , message->field(10)->default_value_string());
+  EXPECT_EQ(4.5, message->field(4)->default_value_float());
+  EXPECT_EQ(10e100, message->field(5)->default_value_double());
+  EXPECT_TRUE(message->field(6)->default_value_bool());
+  EXPECT_EQ("hello", message->field(7)->default_value_string());
+  EXPECT_EQ("\001\002\003", message->field(8)->default_value_string());
+  EXPECT_EQ(enum_value_b, message->field(9)->default_value_enum());
+  EXPECT_EQ("", message->field(10)->default_value_string());
 
   ASSERT_FALSE(message->field(11)->has_default_value());
   ASSERT_FALSE(message->field(12)->has_default_value());
@@ -2536,15 +2545,15 @@
   ASSERT_FALSE(message->field(19)->has_default_value());
   ASSERT_FALSE(message->field(20)->has_default_value());
 
-  EXPECT_EQ(0    , message->field(11)->default_value_int32 ());
-  EXPECT_EQ(0    , message->field(12)->default_value_int64 ());
-  EXPECT_EQ(0    , message->field(13)->default_value_uint32());
-  EXPECT_EQ(0    , message->field(14)->default_value_uint64());
-  EXPECT_EQ(0.0f , message->field(15)->default_value_float ());
-  EXPECT_EQ(0.0  , message->field(16)->default_value_double());
-  EXPECT_FALSE(    message->field(17)->default_value_bool  ());
-  EXPECT_EQ(""   , message->field(18)->default_value_string());
-  EXPECT_EQ(""   , message->field(19)->default_value_string());
+  EXPECT_EQ(0, message->field(11)->default_value_int32());
+  EXPECT_EQ(0, message->field(12)->default_value_int64());
+  EXPECT_EQ(0, message->field(13)->default_value_uint32());
+  EXPECT_EQ(0, message->field(14)->default_value_uint64());
+  EXPECT_EQ(0.0f, message->field(15)->default_value_float());
+  EXPECT_EQ(0.0, message->field(16)->default_value_double());
+  EXPECT_FALSE(message->field(17)->default_value_bool());
+  EXPECT_EQ("", message->field(18)->default_value_string());
+  EXPECT_EQ("", message->field(19)->default_value_string());
   EXPECT_EQ(enum_value_a, message->field(20)->default_value_enum());
 }
 
@@ -2555,13 +2564,11 @@
   file_proto.set_name("foo.proto");
 
   DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage");
-  AddField(message_proto, "foo", 1,
-           FieldDescriptorProto::LABEL_OPTIONAL,
+  AddField(message_proto, "foo", 1, FieldDescriptorProto::LABEL_OPTIONAL,
            FieldDescriptorProto::TYPE_INT32);
   FieldDescriptorProto* bar_proto =
-    AddField(message_proto, "bar", 2,
-             FieldDescriptorProto::LABEL_OPTIONAL,
-             FieldDescriptorProto::TYPE_INT32);
+      AddField(message_proto, "bar", 2, FieldDescriptorProto::LABEL_OPTIONAL,
+               FieldDescriptorProto::TYPE_INT32);
 
   FieldOptions* options = bar_proto->mutable_options();
   options->set_ctype(FieldOptions::CORD);
@@ -2588,17 +2595,12 @@
 }
 
 // ===================================================================
-enum DescriptorPoolMode {
-  NO_DATABASE,
-  FALLBACK_DATABASE
-};
+enum DescriptorPoolMode { NO_DATABASE, FALLBACK_DATABASE };
 
 class AllowUnknownDependenciesTest
     : public testing::TestWithParam<DescriptorPoolMode> {
  protected:
-  DescriptorPoolMode mode() {
-    return GetParam();
-   }
+  DescriptorPoolMode mode() { return GetParam(); }
 
   virtual void SetUp() {
     FileDescriptorProto foo_proto, bar_proto;
@@ -2615,32 +2617,32 @@
     pool_->AllowUnknownDependencies();
 
     ASSERT_TRUE(TextFormat::ParseFromString(
-      "name: 'foo.proto'"
-      "dependency: 'bar.proto'"
-      "dependency: 'baz.proto'"
-      "message_type {"
-      "  name: 'Foo'"
-      "  field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'Bar' }"
-      "  field { name:'baz' number:2 label:LABEL_OPTIONAL type_name:'Baz' }"
-      "  field { name:'qux' number:3 label:LABEL_OPTIONAL"
-      "    type_name: '.corge.Qux'"
-      "    type: TYPE_ENUM"
-      "    options {"
-      "      uninterpreted_option {"
-      "        name {"
-      "          name_part: 'grault'"
-      "          is_extension: true"
-      "        }"
-      "        positive_int_value: 1234"
-      "      }"
-      "    }"
-      "  }"
-      "}",
-      &foo_proto));
-    ASSERT_TRUE(TextFormat::ParseFromString(
-      "name: 'bar.proto'"
-      "message_type { name: 'Bar' }",
-      &bar_proto));
+        "name: 'foo.proto'"
+        "dependency: 'bar.proto'"
+        "dependency: 'baz.proto'"
+        "message_type {"
+        "  name: 'Foo'"
+        "  field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'Bar' }"
+        "  field { name:'baz' number:2 label:LABEL_OPTIONAL type_name:'Baz' }"
+        "  field { name:'qux' number:3 label:LABEL_OPTIONAL"
+        "    type_name: '.corge.Qux'"
+        "    type: TYPE_ENUM"
+        "    options {"
+        "      uninterpreted_option {"
+        "        name {"
+        "          name_part: 'grault'"
+        "          is_extension: true"
+        "        }"
+        "        positive_int_value: 1234"
+        "      }"
+        "    }"
+        "  }"
+        "}",
+        &foo_proto));
+    ASSERT_TRUE(
+        TextFormat::ParseFromString("name: 'bar.proto'"
+                                    "message_type { name: 'Bar' }",
+                                    &bar_proto));
 
     // Collect pointers to stuff.
     bar_file_ = BuildFile(bar_proto);
@@ -2683,7 +2685,7 @@
   const FieldDescriptor* baz_field_;
   const FieldDescriptor* qux_field_;
 
-  SimpleDescriptorDatabase db_;        // used if in FALLBACK_DATABASE mode.
+  SimpleDescriptorDatabase db_;  // used if in FALLBACK_DATABASE mode.
   std::unique_ptr<DescriptorPool> pool_;
 };
 
@@ -2759,7 +2761,7 @@
   // Qux should still have the uninterpreted option attached.
   ASSERT_EQ(1, qux_field_->options().uninterpreted_option_size());
   const UninterpretedOption& option =
-    qux_field_->options().uninterpreted_option(0);
+      qux_field_->options().uninterpreted_option(0);
   ASSERT_EQ(1, option.name_size());
   EXPECT_EQ("grault", option.name(0).name_part());
 }
@@ -2771,10 +2773,10 @@
   FileDescriptorProto extension_proto;
 
   ASSERT_TRUE(TextFormat::ParseFromString(
-    "name: 'extension.proto'"
-    "extension { extendee: 'UnknownType' name:'some_extension' number:123"
-    "            label:LABEL_OPTIONAL type:TYPE_INT32 }",
-    &extension_proto));
+      "name: 'extension.proto'"
+      "extension { extendee: 'UnknownType' name:'some_extension' number:123"
+      "            label:LABEL_OPTIONAL type:TYPE_INT32 }",
+      &extension_proto));
   const FileDescriptor* file = BuildFile(extension_proto);
 
   ASSERT_TRUE(file != NULL);
@@ -2795,39 +2797,39 @@
   FileDescriptorProto option_proto;
 
   ASSERT_TRUE(TextFormat::ParseFromString(
-    "name: \"unknown_custom_options.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { "
-    "  extendee: \"google.protobuf.FileOptions\" "
-    "  name: \"some_option\" "
-    "  number: 123456 "
-    "  label: LABEL_OPTIONAL "
-    "  type: TYPE_INT32 "
-    "} "
-    "options { "
-    "  uninterpreted_option { "
-    "    name { "
-    "      name_part: \"some_option\" "
-    "      is_extension: true "
-    "    } "
-    "    positive_int_value: 1234 "
-    "  } "
-    "  uninterpreted_option { "
-    "    name { "
-    "      name_part: \"unknown_option\" "
-    "      is_extension: true "
-    "    } "
-    "    positive_int_value: 1234 "
-    "  } "
-    "  uninterpreted_option { "
-    "    name { "
-    "      name_part: \"optimize_for\" "
-    "      is_extension: false "
-    "    } "
-    "    identifier_value: \"SPEED\" "
-    "  } "
-    "}",
-    &option_proto));
+      "name: \"unknown_custom_options.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { "
+      "  extendee: \"google.protobuf.FileOptions\" "
+      "  name: \"some_option\" "
+      "  number: 123456 "
+      "  label: LABEL_OPTIONAL "
+      "  type: TYPE_INT32 "
+      "} "
+      "options { "
+      "  uninterpreted_option { "
+      "    name { "
+      "      name_part: \"some_option\" "
+      "      is_extension: true "
+      "    } "
+      "    positive_int_value: 1234 "
+      "  } "
+      "  uninterpreted_option { "
+      "    name { "
+      "      name_part: \"unknown_option\" "
+      "      is_extension: true "
+      "    } "
+      "    positive_int_value: 1234 "
+      "  } "
+      "  uninterpreted_option { "
+      "    name { "
+      "      name_part: \"optimize_for\" "
+      "      is_extension: false "
+      "    } "
+      "    identifier_value: \"SPEED\" "
+      "  } "
+      "}",
+      &option_proto));
 
   const FileDescriptor* file = BuildFile(option_proto);
   ASSERT_TRUE(file != NULL);
@@ -2854,18 +2856,18 @@
   FileDescriptorProto undeclared_dep_proto;
   // We make this file fail to build by giving it two fields with tag 1.
   ASSERT_TRUE(TextFormat::ParseFromString(
-    "name: \"invalid_file_as_undeclared_dep.proto\" "
-    "package: \"undeclared\" "
-    "message_type: {  "
-    "  name: \"Quux\"  "
-    "  field { "
-    "    name:'qux' number:1 label:LABEL_OPTIONAL type: TYPE_INT32 "
-    "  }"
-    "  field { "
-    "    name:'quux' number:1 label:LABEL_OPTIONAL type: TYPE_INT64 "
-    "  }"
-    "}",
-    &undeclared_dep_proto));
+      "name: \"invalid_file_as_undeclared_dep.proto\" "
+      "package: \"undeclared\" "
+      "message_type: {  "
+      "  name: \"Quux\"  "
+      "  field { "
+      "    name:'qux' number:1 label:LABEL_OPTIONAL type: TYPE_INT32 "
+      "  }"
+      "  field { "
+      "    name:'quux' number:1 label:LABEL_OPTIONAL type: TYPE_INT64 "
+      "  }"
+      "}",
+      &undeclared_dep_proto));
   // We can't use the BuildFile() helper because we don't actually want to build
   // it into the descriptor pool in the fallback database case: it just needs to
   // be sitting in the database so that it gets built during the building of
@@ -2882,15 +2884,15 @@
 
   FileDescriptorProto test_proto;
   ASSERT_TRUE(TextFormat::ParseFromString(
-    "name: \"test.proto\" "
-    "message_type: { "
-    "  name: \"Corge\" "
-    "  field { "
-    "    name:'quux' number:1 label: LABEL_OPTIONAL "
-    "    type_name:'undeclared.Quux' type: TYPE_MESSAGE "
-    "  }"
-    "}",
-    &test_proto));
+      "name: \"test.proto\" "
+      "message_type: { "
+      "  name: \"Corge\" "
+      "  field { "
+      "    name:'quux' number:1 label: LABEL_OPTIONAL "
+      "    type_name:'undeclared.Quux' type: TYPE_MESSAGE "
+      "  }"
+      "}",
+      &test_proto));
 
   const FileDescriptor* file = BuildFile(test_proto);
   ASSERT_TRUE(file != NULL);
@@ -2937,13 +2939,10 @@
             field->options().GetExtension(protobuf_unittest::field_opt1));
   EXPECT_EQ(42,  // Check that we get the default for an option we don't set.
             field->options().GetExtension(protobuf_unittest::field_opt2));
-  EXPECT_EQ(-99,
-            oneof->options().GetExtension(protobuf_unittest::oneof_opt1));
-  EXPECT_EQ(-789,
-            enm->options().GetExtension(protobuf_unittest::enum_opt1));
-  EXPECT_EQ(123,
-            enm->value(1)->options().GetExtension(
-              protobuf_unittest::enum_value_opt1));
+  EXPECT_EQ(-99, oneof->options().GetExtension(protobuf_unittest::oneof_opt1));
+  EXPECT_EQ(-789, enm->options().GetExtension(protobuf_unittest::enum_opt1));
+  EXPECT_EQ(123, enm->value(1)->options().GetExtension(
+                     protobuf_unittest::enum_value_opt1));
   EXPECT_EQ(PROTOBUF_LONGLONG(-9876543210),
             service->options().GetExtension(protobuf_unittest::service_opt1));
   EXPECT_EQ(protobuf_unittest::METHODOPT1_VAL2,
@@ -2959,34 +2958,33 @@
 
   options =
       &protobuf_unittest::CustomOptionMinIntegerValues::descriptor()->options();
-  EXPECT_EQ(false    , options->GetExtension(protobuf_unittest::bool_opt));
+  EXPECT_EQ(false, options->GetExtension(protobuf_unittest::bool_opt));
   EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::int32_opt));
   EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::int64_opt));
-  EXPECT_EQ(0        , options->GetExtension(protobuf_unittest::uint32_opt));
-  EXPECT_EQ(0        , options->GetExtension(protobuf_unittest::uint64_opt));
+  EXPECT_EQ(0, options->GetExtension(protobuf_unittest::uint32_opt));
+  EXPECT_EQ(0, options->GetExtension(protobuf_unittest::uint64_opt));
   EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sint32_opt));
   EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sint64_opt));
-  EXPECT_EQ(0        , options->GetExtension(protobuf_unittest::fixed32_opt));
-  EXPECT_EQ(0        , options->GetExtension(protobuf_unittest::fixed64_opt));
+  EXPECT_EQ(0, options->GetExtension(protobuf_unittest::fixed32_opt));
+  EXPECT_EQ(0, options->GetExtension(protobuf_unittest::fixed64_opt));
   EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sfixed32_opt));
   EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sfixed64_opt));
 
   options =
       &protobuf_unittest::CustomOptionMaxIntegerValues::descriptor()->options();
-  EXPECT_EQ(true      , options->GetExtension(protobuf_unittest::bool_opt));
-  EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::int32_opt));
-  EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::int64_opt));
+  EXPECT_EQ(true, options->GetExtension(protobuf_unittest::bool_opt));
+  EXPECT_EQ(kint32max, options->GetExtension(protobuf_unittest::int32_opt));
+  EXPECT_EQ(kint64max, options->GetExtension(protobuf_unittest::int64_opt));
   EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::uint32_opt));
   EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::uint64_opt));
-  EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sint32_opt));
-  EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sint64_opt));
+  EXPECT_EQ(kint32max, options->GetExtension(protobuf_unittest::sint32_opt));
+  EXPECT_EQ(kint64max, options->GetExtension(protobuf_unittest::sint64_opt));
   EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::fixed32_opt));
   EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::fixed64_opt));
-  EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sfixed32_opt));
-  EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sfixed64_opt));
+  EXPECT_EQ(kint32max, options->GetExtension(protobuf_unittest::sfixed32_opt));
+  EXPECT_EQ(kint64max, options->GetExtension(protobuf_unittest::sfixed64_opt));
 
-  options =
-      &protobuf_unittest::CustomOptionOtherValues::descriptor()->options();
+  options = &protobuf_unittest::CustomOptionOtherValues::descriptor()->options();
   EXPECT_EQ(-100, options->GetExtension(protobuf_unittest::int32_opt));
   EXPECT_FLOAT_EQ(12.3456789,
                   options->GetExtension(protobuf_unittest::float_opt));
@@ -3016,35 +3014,52 @@
   const MessageOptions* options =
       &protobuf_unittest::VariousComplexOptions::descriptor()->options();
   EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1).foo(), 42);
-  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1).
-            GetExtension(protobuf_unittest::quux), 324);
-  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1).
-            GetExtension(protobuf_unittest::corge).qux(), 876);
+  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1)
+                .GetExtension(protobuf_unittest::quux),
+            324);
+  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1)
+                .GetExtension(protobuf_unittest::corge)
+                .qux(),
+            876);
   EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).baz(), 987);
-  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).
-            GetExtension(protobuf_unittest::grault), 654);
+  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2)
+                .GetExtension(protobuf_unittest::grault),
+            654);
   EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar().foo(),
             743);
-  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar().
-            GetExtension(protobuf_unittest::quux), 1999);
-  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar().
-            GetExtension(protobuf_unittest::corge).qux(), 2008);
-  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).
-            GetExtension(protobuf_unittest::garply).foo(), 741);
-  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).
-            GetExtension(protobuf_unittest::garply).
-            GetExtension(protobuf_unittest::quux), 1998);
-  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).
-            GetExtension(protobuf_unittest::garply).
-            GetExtension(protobuf_unittest::corge).qux(), 2121);
-  EXPECT_EQ(options->GetExtension(
-      protobuf_unittest::ComplexOptionType2::ComplexOptionType4::complex_opt4).
-            waldo(), 1971);
-  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).
-            fred().waldo(), 321);
+  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2)
+                .bar()
+                .GetExtension(protobuf_unittest::quux),
+            1999);
+  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2)
+                .bar()
+                .GetExtension(protobuf_unittest::corge)
+                .qux(),
+            2008);
+  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2)
+                .GetExtension(protobuf_unittest::garply)
+                .foo(),
+            741);
+  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2)
+                .GetExtension(protobuf_unittest::garply)
+                .GetExtension(protobuf_unittest::quux),
+            1998);
+  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2)
+                .GetExtension(protobuf_unittest::garply)
+                .GetExtension(protobuf_unittest::corge)
+                .qux(),
+            2121);
+  EXPECT_EQ(options
+                ->GetExtension(protobuf_unittest::ComplexOptionType2::
+                                   ComplexOptionType4::complex_opt4)
+                .waldo(),
+            1971);
+  EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).fred().waldo(),
+            321);
   EXPECT_EQ(9, options->GetExtension(protobuf_unittest::complex_opt3).qux());
-  EXPECT_EQ(22, options->GetExtension(protobuf_unittest::complex_opt3).
-                complexoptiontype5().plugh());
+  EXPECT_EQ(22, options->GetExtension(protobuf_unittest::complex_opt3)
+                    .complexoptiontype5()
+                    .plugh());
   EXPECT_EQ(24, options->GetExtension(protobuf_unittest::complexopt6).xyzzy());
 }
 
@@ -3057,43 +3072,42 @@
   FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto);
   ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
 
-  protobuf_unittest::TestMessageWithCustomOptions::descriptor()
-    ->file()->CopyTo(&file_proto);
+  protobuf_unittest::TestMessageWithCustomOptions::descriptor()->file()->CopyTo(
+      &file_proto);
   ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
 
   ASSERT_TRUE(TextFormat::ParseFromString(
-    "name: \"custom_options_import.proto\" "
-    "package: \"protobuf_unittest\" "
-    "dependency: \"google/protobuf/unittest_custom_options.proto\" "
-    "options { "
-    "  uninterpreted_option { "
-    "    name { "
-    "      name_part: \"file_opt1\" "
-    "      is_extension: true "
-    "    } "
-    "    positive_int_value: 1234 "
-    "  } "
-    // Test a non-extension option too.  (At one point this failed due to a
-    // bug.)
-    "  uninterpreted_option { "
-    "    name { "
-    "      name_part: \"java_package\" "
-    "      is_extension: false "
-    "    } "
-    "    string_value: \"foo\" "
-    "  } "
-    // Test that enum-typed options still work too.  (At one point this also
-    // failed due to a bug.)
-    "  uninterpreted_option { "
-    "    name { "
-    "      name_part: \"optimize_for\" "
-    "      is_extension: false "
-    "    } "
-    "    identifier_value: \"SPEED\" "
-    "  } "
-    "}"
-    ,
-    &file_proto));
+      "name: \"custom_options_import.proto\" "
+      "package: \"protobuf_unittest\" "
+      "dependency: \"google/protobuf/unittest_custom_options.proto\" "
+      "options { "
+      "  uninterpreted_option { "
+      "    name { "
+      "      name_part: \"file_opt1\" "
+      "      is_extension: true "
+      "    } "
+      "    positive_int_value: 1234 "
+      "  } "
+      // Test a non-extension option too.  (At one point this failed due to a
+      // bug.)
+      "  uninterpreted_option { "
+      "    name { "
+      "      name_part: \"java_package\" "
+      "      is_extension: false "
+      "    } "
+      "    string_value: \"foo\" "
+      "  } "
+      // Test that enum-typed options still work too.  (At one point this also
+      // failed due to a bug.)
+      "  uninterpreted_option { "
+      "    name { "
+      "      name_part: \"optimize_for\" "
+      "      is_extension: false "
+      "    } "
+      "    identifier_value: \"SPEED\" "
+      "  } "
+      "}",
+      &file_proto));
 
   const FileDescriptor* file = pool.BuildFile(file_proto);
   ASSERT_TRUE(file != NULL);
@@ -3116,8 +3130,8 @@
   FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto);
   ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
 
-  protobuf_unittest::TestMessageWithCustomOptions::descriptor()
-    ->file()->CopyTo(&file_proto);
+  protobuf_unittest::TestMessageWithCustomOptions::descriptor()->file()->CopyTo(
+      &file_proto);
   ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
 
   // The following represents the definition:
@@ -3130,48 +3144,48 @@
   //     option (complex_opt1).foo3 = 1234;
   //   }
   ASSERT_TRUE(TextFormat::ParseFromString(
-    "name: \"custom_options_import.proto\" "
-    "package: \"protobuf_unittest\" "
-    "dependency: \"google/protobuf/unittest_custom_options.proto\" "
-    "message_type { "
-    "  name: \"Foo\" "
-    "  options { "
-    "    uninterpreted_option { "
-    "      name { "
-    "        name_part: \"complex_opt1\" "
-    "        is_extension: true "
-    "      } "
-    "      name { "
-    "        name_part: \"foo\" "
-    "        is_extension: false "
-    "      } "
-    "      positive_int_value: 1234 "
-    "    } "
-    "    uninterpreted_option { "
-    "      name { "
-    "        name_part: \"complex_opt1\" "
-    "        is_extension: true "
-    "      } "
-    "      name { "
-    "        name_part: \"foo2\" "
-    "        is_extension: false "
-    "      } "
-    "      positive_int_value: 1234 "
-    "    } "
-    "    uninterpreted_option { "
-    "      name { "
-    "        name_part: \"complex_opt1\" "
-    "        is_extension: true "
-    "      } "
-    "      name { "
-    "        name_part: \"foo3\" "
-    "        is_extension: false "
-    "      } "
-    "      positive_int_value: 1234 "
-    "    } "
-    "  } "
-    "}",
-    &file_proto));
+      "name: \"custom_options_import.proto\" "
+      "package: \"protobuf_unittest\" "
+      "dependency: \"google/protobuf/unittest_custom_options.proto\" "
+      "message_type { "
+      "  name: \"Foo\" "
+      "  options { "
+      "    uninterpreted_option { "
+      "      name { "
+      "        name_part: \"complex_opt1\" "
+      "        is_extension: true "
+      "      } "
+      "      name { "
+      "        name_part: \"foo\" "
+      "        is_extension: false "
+      "      } "
+      "      positive_int_value: 1234 "
+      "    } "
+      "    uninterpreted_option { "
+      "      name { "
+      "        name_part: \"complex_opt1\" "
+      "        is_extension: true "
+      "      } "
+      "      name { "
+      "        name_part: \"foo2\" "
+      "        is_extension: false "
+      "      } "
+      "      positive_int_value: 1234 "
+      "    } "
+      "    uninterpreted_option { "
+      "      name { "
+      "        name_part: \"complex_opt1\" "
+      "        is_extension: true "
+      "      } "
+      "      name { "
+      "        name_part: \"foo3\" "
+      "        is_extension: false "
+      "      } "
+      "      positive_int_value: 1234 "
+      "    } "
+      "  } "
+      "}",
+      &file_proto));
 
   const FileDescriptor* file = pool.BuildFile(file_proto);
   ASSERT_TRUE(file != NULL);
@@ -3193,8 +3207,8 @@
   FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto);
   ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
 
-  protobuf_unittest::TestMessageWithCustomOptions::descriptor()
-    ->file()->CopyTo(&file_proto);
+  protobuf_unittest::TestMessageWithCustomOptions::descriptor()->file()->CopyTo(
+      &file_proto);
   ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
 
   // The following represents the definition:
@@ -3207,48 +3221,48 @@
   //     option (complex_opt1).foo4 = 56;
   //   }
   ASSERT_TRUE(TextFormat::ParseFromString(
-    "name: \"custom_options_import.proto\" "
-    "package: \"protobuf_unittest\" "
-    "dependency: \"google/protobuf/unittest_custom_options.proto\" "
-    "message_type { "
-    "  name: \"Foo\" "
-    "  options { "
-    "    uninterpreted_option { "
-    "      name { "
-    "        name_part: \"complex_opt1\" "
-    "        is_extension: true "
-    "      } "
-    "      name { "
-    "        name_part: \"foo4\" "
-    "        is_extension: false "
-    "      } "
-    "      positive_int_value: 12 "
-    "    } "
-    "    uninterpreted_option { "
-    "      name { "
-    "        name_part: \"complex_opt1\" "
-    "        is_extension: true "
-    "      } "
-    "      name { "
-    "        name_part: \"foo4\" "
-    "        is_extension: false "
-    "      } "
-    "      positive_int_value: 34 "
-    "    } "
-    "    uninterpreted_option { "
-    "      name { "
-    "        name_part: \"complex_opt1\" "
-    "        is_extension: true "
-    "      } "
-    "      name { "
-    "        name_part: \"foo4\" "
-    "        is_extension: false "
-    "      } "
-    "      positive_int_value: 56 "
-    "    } "
-    "  } "
-    "}",
-    &file_proto));
+      "name: \"custom_options_import.proto\" "
+      "package: \"protobuf_unittest\" "
+      "dependency: \"google/protobuf/unittest_custom_options.proto\" "
+      "message_type { "
+      "  name: \"Foo\" "
+      "  options { "
+      "    uninterpreted_option { "
+      "      name { "
+      "        name_part: \"complex_opt1\" "
+      "        is_extension: true "
+      "      } "
+      "      name { "
+      "        name_part: \"foo4\" "
+      "        is_extension: false "
+      "      } "
+      "      positive_int_value: 12 "
+      "    } "
+      "    uninterpreted_option { "
+      "      name { "
+      "        name_part: \"complex_opt1\" "
+      "        is_extension: true "
+      "      } "
+      "      name { "
+      "        name_part: \"foo4\" "
+      "        is_extension: false "
+      "      } "
+      "      positive_int_value: 34 "
+      "    } "
+      "    uninterpreted_option { "
+      "      name { "
+      "        name_part: \"complex_opt1\" "
+      "        is_extension: true "
+      "      } "
+      "      name { "
+      "        name_part: \"foo4\" "
+      "        is_extension: false "
+      "      } "
+      "      positive_int_value: 56 "
+      "    } "
+      "  } "
+      "}",
+      &file_proto));
 
   const FileDescriptor* file = pool.BuildFile(file_proto);
   ASSERT_TRUE(file != NULL);
@@ -3273,8 +3287,8 @@
   FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto);
   ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
 
-  protobuf_unittest::TestMessageWithCustomOptions::descriptor()
-    ->file()->CopyTo(&file_proto);
+  protobuf_unittest::TestMessageWithCustomOptions::descriptor()->file()->CopyTo(
+      &file_proto);
   ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
 
   // The following represents the definition:
@@ -3287,62 +3301,64 @@
   //     option (complex_opt2).barney = {waldo: 100};
   //   }
   ASSERT_TRUE(TextFormat::ParseFromString(
-    "name: \"custom_options_import.proto\" "
-    "package: \"protobuf_unittest\" "
-    "dependency: \"google/protobuf/unittest_custom_options.proto\" "
-    "message_type { "
-    "  name: \"Foo\" "
-    "  options { "
-    "    uninterpreted_option { "
-    "      name { "
-    "        name_part: \"complex_opt2\" "
-    "        is_extension: true "
-    "      } "
-    "      name { "
-    "        name_part: \"barney\" "
-    "        is_extension: false "
-    "      } "
-    "      aggregate_value: \"waldo: 1\" "
-    "    } "
-    "    uninterpreted_option { "
-    "      name { "
-    "        name_part: \"complex_opt2\" "
-    "        is_extension: true "
-    "      } "
-    "      name { "
-    "        name_part: \"barney\" "
-    "        is_extension: false "
-    "      } "
-    "      aggregate_value: \"waldo: 10\" "
-    "    } "
-    "    uninterpreted_option { "
-    "      name { "
-    "        name_part: \"complex_opt2\" "
-    "        is_extension: true "
-    "      } "
-    "      name { "
-    "        name_part: \"barney\" "
-    "        is_extension: false "
-    "      } "
-    "      aggregate_value: \"waldo: 100\" "
-    "    } "
-    "  } "
-    "}",
-    &file_proto));
+      "name: \"custom_options_import.proto\" "
+      "package: \"protobuf_unittest\" "
+      "dependency: \"google/protobuf/unittest_custom_options.proto\" "
+      "message_type { "
+      "  name: \"Foo\" "
+      "  options { "
+      "    uninterpreted_option { "
+      "      name { "
+      "        name_part: \"complex_opt2\" "
+      "        is_extension: true "
+      "      } "
+      "      name { "
+      "        name_part: \"barney\" "
+      "        is_extension: false "
+      "      } "
+      "      aggregate_value: \"waldo: 1\" "
+      "    } "
+      "    uninterpreted_option { "
+      "      name { "
+      "        name_part: \"complex_opt2\" "
+      "        is_extension: true "
+      "      } "
+      "      name { "
+      "        name_part: \"barney\" "
+      "        is_extension: false "
+      "      } "
+      "      aggregate_value: \"waldo: 10\" "
+      "    } "
+      "    uninterpreted_option { "
+      "      name { "
+      "        name_part: \"complex_opt2\" "
+      "        is_extension: true "
+      "      } "
+      "      name { "
+      "        name_part: \"barney\" "
+      "        is_extension: false "
+      "      } "
+      "      aggregate_value: \"waldo: 100\" "
+      "    } "
+      "  } "
+      "}",
+      &file_proto));
 
   const FileDescriptor* file = pool.BuildFile(file_proto);
   ASSERT_TRUE(file != NULL);
   ASSERT_EQ(1, file->message_type_count());
 
   const MessageOptions& options = file->message_type(0)->options();
-  EXPECT_EQ(3, options.GetExtension(
-      protobuf_unittest::complex_opt2).barney_size());
-  EXPECT_EQ(1,options.GetExtension(
-      protobuf_unittest::complex_opt2).barney(0).waldo());
-  EXPECT_EQ(10, options.GetExtension(
-      protobuf_unittest::complex_opt2).barney(1).waldo());
-  EXPECT_EQ(100, options.GetExtension(
-      protobuf_unittest::complex_opt2).barney(2).waldo());
+  EXPECT_EQ(3,
+            options.GetExtension(protobuf_unittest::complex_opt2).barney_size());
+  EXPECT_EQ(
+      1, options.GetExtension(protobuf_unittest::complex_opt2).barney(0).waldo());
+  EXPECT_EQ(
+      10,
+      options.GetExtension(protobuf_unittest::complex_opt2).barney(1).waldo());
+  EXPECT_EQ(
+      100,
+      options.GetExtension(protobuf_unittest::complex_opt2).barney(2).waldo());
 }
 
 // Check that aggregate options were parsed and saved correctly in
@@ -3353,8 +3369,8 @@
   const FieldDescriptor* field = msg->FindFieldByName("fieldname");
   const EnumDescriptor* enumd = file->FindEnumTypeByName("AggregateEnum");
   const EnumValueDescriptor* enumv = enumd->FindValueByName("VALUE");
-  const ServiceDescriptor* service = file->FindServiceByName(
-      "AggregateService");
+  const ServiceDescriptor* service =
+      file->FindServiceByName("AggregateService");
   const MethodDescriptor* method = service->FindMethodByName("Method");
 
   // Tests for the different types of data embedded in fileopt
@@ -3366,9 +3382,10 @@
   EXPECT_EQ("FileExtensionAnnotation",
             file_options.file().GetExtension(protobuf_unittest::fileopt).s());
   EXPECT_EQ("EmbeddedMessageSetElement",
-            file_options.mset().GetExtension(
-                protobuf_unittest::AggregateMessageSetElement
-                ::message_set_extension).s());
+            file_options.mset()
+                .GetExtension(protobuf_unittest::AggregateMessageSetElement ::
+                                  message_set_extension)
+                .s());
 
   // Simple tests for all the other types of annotations
   EXPECT_EQ("MessageAnnotation",
@@ -3392,16 +3409,16 @@
   FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto);
   ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
 
-  protobuf_unittest::TestMessageWithCustomOptions::descriptor()
-      ->file()->CopyTo(&file_proto);
+  protobuf_unittest::TestMessageWithCustomOptions::descriptor()->file()->CopyTo(
+      &file_proto);
   ASSERT_TRUE(pool.BuildFile(file_proto) != NULL);
 
   pool.AddUnusedImportTrackFile("custom_options_import.proto");
   ASSERT_TRUE(TextFormat::ParseFromString(
-    "name: \"custom_options_import.proto\" "
-    "package: \"protobuf_unittest\" "
-    "dependency: \"google/protobuf/unittest_custom_options.proto\" ",
-    &file_proto));
+      "name: \"custom_options_import.proto\" "
+      "package: \"protobuf_unittest\" "
+      "dependency: \"google/protobuf/unittest_custom_options.proto\" ",
+      &file_proto));
 
   MockErrorCollector error_collector;
   EXPECT_TRUE(pool.BuildFileCollectingErrors(file_proto, &error_collector));
@@ -3427,32 +3444,33 @@
 
   // Add the "required_enum_opt" extension.
   FieldDescriptorProto* extension = file_proto.add_extension();
-  protobuf_unittest::OldOptionType::descriptor()->file()
-      ->FindExtensionByName("required_enum_opt")->CopyTo(extension);
+  protobuf_unittest::OldOptionType::descriptor()
+      ->file()
+      ->FindExtensionByName("required_enum_opt")
+      ->CopyTo(extension);
 
   // Add a test message that uses the "required_enum_opt" option.
   DescriptorProto* test_message_type = file_proto.add_message_type();
-  protobuf_unittest::TestMessageWithRequiredEnumOption::descriptor()
-      ->CopyTo(test_message_type);
+  protobuf_unittest::TestMessageWithRequiredEnumOption::descriptor()->CopyTo(
+      test_message_type);
 
   // Instruct the extension to use NewOptionType instead of
   // OldOptionType, and add the descriptor of NewOptionType.
   extension->set_type_name(".protobuf_unittest.NewOptionType");
   DescriptorProto* new_option_type = file_proto.add_message_type();
-  protobuf_unittest::NewOptionType::descriptor()
-      ->CopyTo(new_option_type);
+  protobuf_unittest::NewOptionType::descriptor()->CopyTo(new_option_type);
 
   // Replace the value of the "required_enum_opt" option used in the
   // test message with an enum value that only exists in NewOptionType.
-  ASSERT_TRUE(TextFormat::ParseFromString(
-      "uninterpreted_option { "
-      "  name { "
-      "    name_part: 'required_enum_opt' "
-      "    is_extension: true "
-      "  } "
-      "  aggregate_value: 'value: NEW_VALUE'"
-      "}",
-      test_message_type->mutable_options()));
+  ASSERT_TRUE(
+      TextFormat::ParseFromString("uninterpreted_option { "
+                                  "  name { "
+                                  "    name_part: 'required_enum_opt' "
+                                  "    is_extension: true "
+                                  "  } "
+                                  "  aggregate_value: 'value: NEW_VALUE'"
+                                  "}",
+                                  test_message_type->mutable_options()));
 
   // Adding the file descriptor to the pool should fail.
   EXPECT_TRUE(pool.BuildFile(file_proto) == NULL);
@@ -3558,8 +3576,8 @@
     ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto));
 
     MockErrorCollector error_collector;
-    EXPECT_TRUE(
-      pool_.BuildFileCollectingErrors(file_proto, &error_collector) == NULL);
+    EXPECT_TRUE(pool_.BuildFileCollectingErrors(file_proto, &error_collector) ==
+                NULL);
     EXPECT_EQ(expected_errors, error_collector.text_);
   }
 
@@ -3594,57 +3612,57 @@
 
 TEST_F(ValidationErrorTest, AlreadyDefined) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { name: \"Foo\" }"
-    "message_type { name: \"Foo\" }",
+      "name: \"foo.proto\" "
+      "message_type { name: \"Foo\" }"
+      "message_type { name: \"Foo\" }",
 
-    "foo.proto: Foo: NAME: \"Foo\" is already defined.\n");
+      "foo.proto: Foo: NAME: \"Foo\" is already defined.\n");
 }
 
 TEST_F(ValidationErrorTest, AlreadyDefinedInPackage) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "package: \"foo.bar\" "
-    "message_type { name: \"Foo\" }"
-    "message_type { name: \"Foo\" }",
+      "name: \"foo.proto\" "
+      "package: \"foo.bar\" "
+      "message_type { name: \"Foo\" }"
+      "message_type { name: \"Foo\" }",
 
-    "foo.proto: foo.bar.Foo: NAME: \"Foo\" is already defined in "
+      "foo.proto: foo.bar.Foo: NAME: \"Foo\" is already defined in "
       "\"foo.bar\".\n");
 }
 
 TEST_F(ValidationErrorTest, AlreadyDefinedInOtherFile) {
   BuildFile(
-    "name: \"foo.proto\" "
-    "message_type { name: \"Foo\" }");
+      "name: \"foo.proto\" "
+      "message_type { name: \"Foo\" }");
 
   BuildFileWithErrors(
-    "name: \"bar.proto\" "
-    "message_type { name: \"Foo\" }",
+      "name: \"bar.proto\" "
+      "message_type { name: \"Foo\" }",
 
-    "bar.proto: Foo: NAME: \"Foo\" is already defined in file "
+      "bar.proto: Foo: NAME: \"Foo\" is already defined in file "
       "\"foo.proto\".\n");
 }
 
 TEST_F(ValidationErrorTest, PackageAlreadyDefined) {
   BuildFile(
-    "name: \"foo.proto\" "
-    "message_type { name: \"foo\" }");
+      "name: \"foo.proto\" "
+      "message_type { name: \"foo\" }");
   BuildFileWithErrors(
-    "name: \"bar.proto\" "
-    "package: \"foo.bar\"",
+      "name: \"bar.proto\" "
+      "package: \"foo.bar\"",
 
-    "bar.proto: foo: NAME: \"foo\" is already defined (as something other "
+      "bar.proto: foo: NAME: \"foo\" is already defined (as something other "
       "than a package) in file \"foo.proto\".\n");
 }
 
 TEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParent) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } "
-    "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ",
+      "name: \"foo.proto\" "
+      "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } "
+      "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ",
 
-    "foo.proto: FOO: NAME: \"FOO\" is already defined.\n"
-    "foo.proto: FOO: NAME: Note that enum values use C++ scoping rules, "
+      "foo.proto: FOO: NAME: \"FOO\" is already defined.\n"
+      "foo.proto: FOO: NAME: Note that enum values use C++ scoping rules, "
       "meaning that enum values are siblings of their type, not children of "
       "it.  Therefore, \"FOO\" must be unique within the global scope, not "
       "just within \"Bar\".\n");
@@ -3652,13 +3670,13 @@
 
 TEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParentNonGlobal) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "package: \"pkg\" "
-    "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } "
-    "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ",
+      "name: \"foo.proto\" "
+      "package: \"pkg\" "
+      "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } "
+      "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ",
 
-    "foo.proto: pkg.FOO: NAME: \"FOO\" is already defined in \"pkg\".\n"
-    "foo.proto: pkg.FOO: NAME: Note that enum values use C++ scoping rules, "
+      "foo.proto: pkg.FOO: NAME: \"FOO\" is already defined in \"pkg\".\n"
+      "foo.proto: pkg.FOO: NAME: Note that enum values use C++ scoping rules, "
       "meaning that enum values are siblings of their type, not children of "
       "it.  Therefore, \"FOO\" must be unique within \"pkg\", not just within "
       "\"Bar\".\n");
@@ -3666,60 +3684,60 @@
 
 TEST_F(ValidationErrorTest, MissingName) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { }",
+      "name: \"foo.proto\" "
+      "message_type { }",
 
-    "foo.proto: : NAME: Missing name.\n");
+      "foo.proto: : NAME: Missing name.\n");
 }
 
 TEST_F(ValidationErrorTest, InvalidName) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { name: \"$\" }",
+      "name: \"foo.proto\" "
+      "message_type { name: \"$\" }",
 
-    "foo.proto: $: NAME: \"$\" is not a valid identifier.\n");
+      "foo.proto: $: NAME: \"$\" is not a valid identifier.\n");
 }
 
 TEST_F(ValidationErrorTest, InvalidPackageName) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "package: \"foo.$\"",
+      "name: \"foo.proto\" "
+      "package: \"foo.$\"",
 
-    "foo.proto: foo.$: NAME: \"$\" is not a valid identifier.\n");
+      "foo.proto: foo.$: NAME: \"$\" is not a valid identifier.\n");
 }
 
 TEST_F(ValidationErrorTest, MissingFileName) {
-  BuildFileWithErrors(
-    "",
+  BuildFileWithErrors("",
 
-    ": : OTHER: Missing field: FileDescriptorProto.name.\n");
+                      ": : OTHER: Missing field: FileDescriptorProto.name.\n");
 }
 
 TEST_F(ValidationErrorTest, DupeDependency) {
   BuildFile("name: \"foo.proto\"");
   BuildFileWithErrors(
-    "name: \"bar.proto\" "
-    "dependency: \"foo.proto\" "
-    "dependency: \"foo.proto\" ",
+      "name: \"bar.proto\" "
+      "dependency: \"foo.proto\" "
+      "dependency: \"foo.proto\" ",
 
-    "bar.proto: bar.proto: OTHER: Import \"foo.proto\" was listed twice.\n");
+      "bar.proto: foo.proto: IMPORT: Import \"foo.proto\" was listed twice.\n");
 }
 
 TEST_F(ValidationErrorTest, UnknownDependency) {
   BuildFileWithErrors(
-    "name: \"bar.proto\" "
-    "dependency: \"foo.proto\" ",
+      "name: \"bar.proto\" "
+      "dependency: \"foo.proto\" ",
 
-    "bar.proto: bar.proto: OTHER: Import \"foo.proto\" has not been loaded.\n");
+      "bar.proto: foo.proto: IMPORT: Import \"foo.proto\" has not been "
+      "loaded.\n");
 }
 
 TEST_F(ValidationErrorTest, InvalidPublicDependencyIndex) {
   BuildFile("name: \"foo.proto\"");
   BuildFileWithErrors(
-    "name: \"bar.proto\" "
-    "dependency: \"foo.proto\" "
-    "public_dependency: 1",
-    "bar.proto: bar.proto: OTHER: Invalid public dependency index.\n");
+      "name: \"bar.proto\" "
+      "dependency: \"foo.proto\" "
+      "public_dependency: 1",
+      "bar.proto: bar.proto: OTHER: Invalid public dependency index.\n");
 }
 
 TEST_F(ValidationErrorTest, ForeignUnimportedPackageNoCrash) {
@@ -3729,475 +3747,494 @@
   // include that parent package in the name (i.e. we do a relative lookup)...
   // Yes, really.
   BuildFile(
-    "name: 'foo.proto' "
-    "package: 'outer.foo' ");
+      "name: 'foo.proto' "
+      "package: 'outer.foo' ");
   BuildFileWithErrors(
-    "name: 'bar.proto' "
-    "dependency: 'baz.proto' "
-    "package: 'outer.bar' "
-    "message_type { "
-    "  name: 'Bar' "
-    "  field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'foo.Foo' }"
-    "}",
+      "name: 'bar.proto' "
+      "dependency: 'baz.proto' "
+      "package: 'outer.bar' "
+      "message_type { "
+      "  name: 'Bar' "
+      "  field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'foo.Foo' }"
+      "}",
 
-    "bar.proto: bar.proto: OTHER: Import \"baz.proto\" has not been loaded.\n"
-    "bar.proto: outer.bar.Bar.bar: TYPE: \"outer.foo\" seems to be defined in "
+      "bar.proto: baz.proto: IMPORT: Import \"baz.proto\" has not been "
+      "loaded.\n"
+      "bar.proto: outer.bar.Bar.bar: TYPE: \"outer.foo\" seems to be defined "
+      "in "
       "\"foo.proto\", which is not imported by \"bar.proto\".  To use it here, "
       "please add the necessary import.\n");
 }
 
 TEST_F(ValidationErrorTest, DupeFile) {
   BuildFile(
-    "name: \"foo.proto\" "
-    "message_type { name: \"Foo\" }");
+      "name: \"foo.proto\" "
+      "message_type { name: \"Foo\" }");
   // Note:  We should *not* get redundant errors about "Foo" already being
   //   defined.
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { name: \"Foo\" } "
-    // Add another type so that the files aren't identical (in which case there
-    // would be no error).
-    "enum_type { name: \"Bar\" }",
+      "name: \"foo.proto\" "
+      "message_type { name: \"Foo\" } "
+      // Add another type so that the files aren't identical (in which case
+      // there would be no error).
+      "enum_type { name: \"Bar\" }",
 
-    "foo.proto: foo.proto: OTHER: A file with this name is already in the "
+      "foo.proto: foo.proto: OTHER: A file with this name is already in the "
       "pool.\n");
 }
 
 TEST_F(ValidationErrorTest, FieldInExtensionRange) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name: \"foo\" number:  9 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  field { name: \"bar\" number: 10 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  field { name: \"baz\" number: 19 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  field { name: \"qux\" number: 20 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  extension_range { start: 10 end: 20 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name: \"foo\" number:  9 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "}"
+      "  field { name: \"bar\" number: 10 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "}"
+      "  field { name: \"baz\" number: 19 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "}"
+      "  field { name: \"qux\" number: 20 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "}"
+      "  extension_range { start: 10 end: 20 }"
+      "}",
 
-    "foo.proto: Foo.bar: NUMBER: Extension range 10 to 19 includes field "
+      "foo.proto: Foo.bar: NUMBER: Extension range 10 to 19 includes field "
       "\"bar\" (10).\n"
-    "foo.proto: Foo.baz: NUMBER: Extension range 10 to 19 includes field "
+      "foo.proto: Foo.baz: NUMBER: Extension range 10 to 19 includes field "
       "\"baz\" (19).\n");
 }
 
 TEST_F(ValidationErrorTest, OverlappingExtensionRanges) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension_range { start: 10 end: 20 }"
-    "  extension_range { start: 20 end: 30 }"
-    "  extension_range { start: 19 end: 21 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension_range { start: 10 end: 20 }"
+      "  extension_range { start: 20 end: 30 }"
+      "  extension_range { start: 19 end: 21 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with "
+      "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with "
       "already-defined range 10 to 19.\n"
-    "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with "
+      "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with "
       "already-defined range 20 to 29.\n");
 }
 
 TEST_F(ValidationErrorTest, ReservedFieldError) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name: \"foo\" number: 15 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  reserved_range { start: 10 end: 20 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name: \"foo\" number: 15 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "}"
+      "  reserved_range { start: 10 end: 20 }"
+      "}",
 
-    "foo.proto: Foo.foo: NUMBER: Field \"foo\" uses reserved number 15.\n");
+      "foo.proto: Foo.foo: NUMBER: Field \"foo\" uses reserved number 15.\n");
 }
 
 TEST_F(ValidationErrorTest, ReservedExtensionRangeError) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension_range { start: 10 end: 20 }"
-    "  reserved_range { start: 5 end: 15 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension_range { start: 10 end: 20 }"
+      "  reserved_range { start: 5 end: 15 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Extension range 10 to 19"
-    " overlaps with reserved range 5 to 14.\n");
+      "foo.proto: Foo: NUMBER: Extension range 10 to 19"
+      " overlaps with reserved range 5 to 14.\n");
 }
 
 TEST_F(ValidationErrorTest, ReservedExtensionRangeAdjacent) {
   BuildFile(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension_range { start: 10 end: 20 }"
-    "  reserved_range { start: 5 end: 10 }"
-    "}");
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension_range { start: 10 end: 20 }"
+      "  reserved_range { start: 5 end: 10 }"
+      "}");
 }
 
 TEST_F(ValidationErrorTest, ReservedRangeOverlap) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  reserved_range { start: 10 end: 20 }"
-    "  reserved_range { start: 5 end: 15 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  reserved_range { start: 10 end: 20 }"
+      "  reserved_range { start: 5 end: 15 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Reserved range 5 to 14"
-    " overlaps with already-defined range 10 to 19.\n");
+      "foo.proto: Foo: NUMBER: Reserved range 5 to 14"
+      " overlaps with already-defined range 10 to 19.\n");
 }
 
 TEST_F(ValidationErrorTest, ReservedNameError) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name: \"foo\" number: 15 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  field { name: \"bar\" number: 16 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  field { name: \"baz\" number: 17 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  reserved_name: \"foo\""
-    "  reserved_name: \"bar\""
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name: \"foo\" number: 15 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "}"
+      "  field { name: \"bar\" number: 16 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "}"
+      "  field { name: \"baz\" number: 17 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "}"
+      "  reserved_name: \"foo\""
+      "  reserved_name: \"bar\""
+      "}",
 
-    "foo.proto: Foo.foo: NAME: Field name \"foo\" is reserved.\n"
-    "foo.proto: Foo.bar: NAME: Field name \"bar\" is reserved.\n");
+      "foo.proto: Foo.foo: NAME: Field name \"foo\" is reserved.\n"
+      "foo.proto: Foo.bar: NAME: Field name \"bar\" is reserved.\n");
 }
 
 TEST_F(ValidationErrorTest, ReservedNameRedundant) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  reserved_name: \"foo\""
-    "  reserved_name: \"foo\""
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  reserved_name: \"foo\""
+      "  reserved_name: \"foo\""
+      "}",
 
-    "foo.proto: foo: NAME: Field name \"foo\" is reserved multiple times.\n");
+      "foo.proto: foo: NAME: Field name \"foo\" is reserved multiple times.\n");
 }
 
 TEST_F(ValidationErrorTest, ReservedFieldsDebugString) {
   const FileDescriptor* file = BuildFile(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  reserved_name: \"foo\""
-    "  reserved_name: \"bar\""
-    "  reserved_range { start: 5 end: 6 }"
-    "  reserved_range { start: 10 end: 20 }"
-    "}");
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  reserved_name: \"foo\""
+      "  reserved_name: \"bar\""
+      "  reserved_range { start: 5 end: 6 }"
+      "  reserved_range { start: 10 end: 20 }"
+      "}");
 
   ASSERT_EQ(
-    "syntax = \"proto2\";\n\n"
-    "message Foo {\n"
-    "  reserved 5, 10 to 19;\n"
-    "  reserved \"foo\", \"bar\";\n"
-    "}\n\n",
-    file->DebugString());
+      "syntax = \"proto2\";\n\n"
+      "message Foo {\n"
+      "  reserved 5, 10 to 19;\n"
+      "  reserved \"foo\", \"bar\";\n"
+      "}\n\n",
+      file->DebugString());
 }
 
 TEST_F(ValidationErrorTest, EnumReservedFieldError) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"BAR\" number:15 }"
-    "  reserved_range { start: 10 end: 20 }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"BAR\" number:15 }"
+      "  reserved_range { start: 10 end: 20 }"
+      "}",
 
-    "foo.proto: BAR: NUMBER: Enum value \"BAR\" uses reserved number 15.\n");
+      "foo.proto: BAR: NUMBER: Enum value \"BAR\" uses reserved number 15.\n");
 }
 
 TEST_F(ValidationErrorTest, EnumNegativeReservedFieldError) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"BAR\" number:-15 }"
-    "  reserved_range { start: -20 end: -10 }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"BAR\" number:-15 }"
+      "  reserved_range { start: -20 end: -10 }"
+      "}",
 
-    "foo.proto: BAR: NUMBER: Enum value \"BAR\" uses reserved number -15.\n");
+      "foo.proto: BAR: NUMBER: Enum value \"BAR\" uses reserved number -15.\n");
 }
 
 TEST_F(ValidationErrorTest, EnumReservedRangeOverlap) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"BAR\" number:0 }"
-    "  reserved_range { start: 10 end: 20 }"
-    "  reserved_range { start: 5 end: 15 }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"BAR\" number:0 }"
+      "  reserved_range { start: 10 end: 20 }"
+      "  reserved_range { start: 5 end: 15 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Reserved range 5 to 15"
-    " overlaps with already-defined range 10 to 20.\n");
+      "foo.proto: Foo: NUMBER: Reserved range 5 to 15"
+      " overlaps with already-defined range 10 to 20.\n");
 }
 
 TEST_F(ValidationErrorTest, EnumReservedRangeOverlapByOne) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"BAR\" number:0 }"
-    "  reserved_range { start: 10 end: 20 }"
-    "  reserved_range { start: 5 end: 10 }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"BAR\" number:0 }"
+      "  reserved_range { start: 10 end: 20 }"
+      "  reserved_range { start: 5 end: 10 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Reserved range 5 to 10"
-    " overlaps with already-defined range 10 to 20.\n");
+      "foo.proto: Foo: NUMBER: Reserved range 5 to 10"
+      " overlaps with already-defined range 10 to 20.\n");
 }
 
 TEST_F(ValidationErrorTest, EnumNegativeReservedRangeOverlap) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"BAR\" number:0 }"
-    "  reserved_range { start: -20 end: -10 }"
-    "  reserved_range { start: -15 end: -5 }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"BAR\" number:0 }"
+      "  reserved_range { start: -20 end: -10 }"
+      "  reserved_range { start: -15 end: -5 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Reserved range -15 to -5"
-    " overlaps with already-defined range -20 to -10.\n");
+      "foo.proto: Foo: NUMBER: Reserved range -15 to -5"
+      " overlaps with already-defined range -20 to -10.\n");
 }
 
 TEST_F(ValidationErrorTest, EnumMixedReservedRangeOverlap) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"BAR\" number:20 }"
-    "  reserved_range { start: -20 end: 10 }"
-    "  reserved_range { start: -15 end: 5 }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"BAR\" number:20 }"
+      "  reserved_range { start: -20 end: 10 }"
+      "  reserved_range { start: -15 end: 5 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Reserved range -15 to 5"
-    " overlaps with already-defined range -20 to 10.\n");
+      "foo.proto: Foo: NUMBER: Reserved range -15 to 5"
+      " overlaps with already-defined range -20 to 10.\n");
 }
 
 TEST_F(ValidationErrorTest, EnumMixedReservedRangeOverlap2) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"BAR\" number:20 }"
-    "  reserved_range { start: -20 end: 10 }"
-    "  reserved_range { start: 10 end: 10 }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"BAR\" number:20 }"
+      "  reserved_range { start: -20 end: 10 }"
+      "  reserved_range { start: 10 end: 10 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Reserved range 10 to 10"
-    " overlaps with already-defined range -20 to 10.\n");
+      "foo.proto: Foo: NUMBER: Reserved range 10 to 10"
+      " overlaps with already-defined range -20 to 10.\n");
 }
 
 TEST_F(ValidationErrorTest, EnumReservedRangeStartGreaterThanEnd) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"BAR\" number:20 }"
-    "  reserved_range { start: 11 end: 10 }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"BAR\" number:20 }"
+      "  reserved_range { start: 11 end: 10 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Reserved range end number must be greater"
-    " than start number.\n");
+      "foo.proto: Foo: NUMBER: Reserved range end number must be greater"
+      " than start number.\n");
 }
 
 TEST_F(ValidationErrorTest, EnumReservedNameError) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"FOO\" number:15 }"
-    "  value { name:\"BAR\" number:15 }"
-    "  reserved_name: \"FOO\""
-    "  reserved_name: \"BAR\""
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"FOO\" number:15 }"
+      "  value { name:\"BAR\" number:15 }"
+      "  reserved_name: \"FOO\""
+      "  reserved_name: \"BAR\""
+      "}",
 
-    "foo.proto: FOO: NAME: Enum value \"FOO\" is reserved.\n"
-    "foo.proto: BAR: NAME: Enum value \"BAR\" is reserved.\n");
+      "foo.proto: FOO: NAME: Enum value \"FOO\" is reserved.\n"
+      "foo.proto: BAR: NAME: Enum value \"BAR\" is reserved.\n");
 }
 
 TEST_F(ValidationErrorTest, EnumReservedNameRedundant) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"FOO\" number:15 }"
-    "  reserved_name: \"foo\""
-    "  reserved_name: \"foo\""
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"FOO\" number:15 }"
+      "  reserved_name: \"foo\""
+      "  reserved_name: \"foo\""
+      "}",
 
-    "foo.proto: foo: NAME: Enum value \"foo\" is reserved multiple times.\n");
+      "foo.proto: foo: NAME: Enum value \"foo\" is reserved multiple times.\n");
 }
 
 TEST_F(ValidationErrorTest, EnumReservedFieldsDebugString) {
   const FileDescriptor* file = BuildFile(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Foo\""
-    "  value { name:\"FOO\" number:3 }"
-    "  reserved_name: \"foo\""
-    "  reserved_name: \"bar\""
-    "  reserved_range { start: -6 end: -6 }"
-    "  reserved_range { start: -5 end: -4 }"
-    "  reserved_range { start: -1 end: 1 }"
-    "  reserved_range { start: 5 end: 5 }"
-    "  reserved_range { start: 10 end: 19 }"
-    "}");
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Foo\""
+      "  value { name:\"FOO\" number:3 }"
+      "  reserved_name: \"foo\""
+      "  reserved_name: \"bar\""
+      "  reserved_range { start: -6 end: -6 }"
+      "  reserved_range { start: -5 end: -4 }"
+      "  reserved_range { start: -1 end: 1 }"
+      "  reserved_range { start: 5 end: 5 }"
+      "  reserved_range { start: 10 end: 19 }"
+      "}");
 
   ASSERT_EQ(
-    "syntax = \"proto2\";\n\n"
-    "enum Foo {\n"
-    "  FOO = 3;\n"
-    "  reserved -6, -5 to -4, -1 to 1, 5, 10 to 19;\n"
-    "  reserved \"foo\", \"bar\";\n"
-    "}\n\n",
-    file->DebugString());
+      "syntax = \"proto2\";\n\n"
+      "enum Foo {\n"
+      "  FOO = 3;\n"
+      "  reserved -6, -5 to -4, -1 to 1, 5, 10 to 19;\n"
+      "  reserved \"foo\", \"bar\";\n"
+      "}\n\n",
+      file->DebugString());
 }
 
 TEST_F(ValidationErrorTest, InvalidDefaults) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
 
-    // Invalid number.
-    "  field { name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32"
-    "          default_value: \"abc\" }"
+      // Invalid number.
+      "  field { name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32"
+      "          default_value: \"abc\" }"
 
-    // Empty default value.
-    "  field { name: \"bar\" number: 2 label: LABEL_OPTIONAL type: TYPE_INT32"
-    "          default_value: \"\" }"
+      // Empty default value.
+      "  field { name: \"bar\" number: 2 label: LABEL_OPTIONAL type: TYPE_INT32"
+      "          default_value: \"\" }"
 
-    // Invalid boolean.
-    "  field { name: \"baz\" number: 3 label: LABEL_OPTIONAL type: TYPE_BOOL"
-    "          default_value: \"abc\" }"
+      // Invalid boolean.
+      "  field { name: \"baz\" number: 3 label: LABEL_OPTIONAL type: TYPE_BOOL"
+      "          default_value: \"abc\" }"
 
-    // Messages can't have defaults.
-    "  field { name: \"qux\" number: 4 label: LABEL_OPTIONAL type: TYPE_MESSAGE"
-    "          default_value: \"abc\" type_name: \"Foo\" }"
+      // Messages can't have defaults.
+      "  field { name: \"qux\" number: 4 label: LABEL_OPTIONAL type: "
+      "TYPE_MESSAGE"
+      "          default_value: \"abc\" type_name: \"Foo\" }"
 
-    // Same thing, but we don't know that this field has message type until
-    // we look up the type name.
-    "  field { name: \"quux\" number: 5 label: LABEL_OPTIONAL"
-    "          default_value: \"abc\" type_name: \"Foo\" }"
+      // Same thing, but we don't know that this field has message type until
+      // we look up the type name.
+      "  field { name: \"quux\" number: 5 label: LABEL_OPTIONAL"
+      "          default_value: \"abc\" type_name: \"Foo\" }"
 
-    // Repeateds can't have defaults.
-    "  field { name: \"corge\" number: 6 label: LABEL_REPEATED type: TYPE_INT32"
-    "          default_value: \"1\" }"
-    "}",
+      // Repeateds can't have defaults.
+      "  field { name: \"corge\" number: 6 label: LABEL_REPEATED type: "
+      "TYPE_INT32"
+      "          default_value: \"1\" }"
+      "}",
 
-    "foo.proto: Foo.foo: DEFAULT_VALUE: Couldn't parse default value \"abc\".\n"
-    "foo.proto: Foo.bar: DEFAULT_VALUE: Couldn't parse default value \"\".\n"
-    "foo.proto: Foo.baz: DEFAULT_VALUE: Boolean default must be true or "
+      "foo.proto: Foo.foo: DEFAULT_VALUE: Couldn't parse default value "
+      "\"abc\".\n"
+      "foo.proto: Foo.bar: DEFAULT_VALUE: Couldn't parse default value \"\".\n"
+      "foo.proto: Foo.baz: DEFAULT_VALUE: Boolean default must be true or "
       "false.\n"
-    "foo.proto: Foo.qux: DEFAULT_VALUE: Messages can't have default values.\n"
-    "foo.proto: Foo.corge: DEFAULT_VALUE: Repeated fields can't have default "
+      "foo.proto: Foo.qux: DEFAULT_VALUE: Messages can't have default values.\n"
+      "foo.proto: Foo.corge: DEFAULT_VALUE: Repeated fields can't have default "
       "values.\n"
-    // This ends up being reported later because the error is detected at
-    // cross-linking time.
-    "foo.proto: Foo.quux: DEFAULT_VALUE: Messages can't have default "
+      // This ends up being reported later because the error is detected at
+      // cross-linking time.
+      "foo.proto: Foo.quux: DEFAULT_VALUE: Messages can't have default "
       "values.\n");
 }
 
 TEST_F(ValidationErrorTest, NegativeFieldNumber) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name: \"foo\" number: -1 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name: \"foo\" number: -1 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "}"
+      "}",
 
-    "foo.proto: Foo.foo: NUMBER: Field numbers must be positive integers.\n");
+      "foo.proto: Foo.foo: NUMBER: Field numbers must be positive integers.\n");
 }
 
 TEST_F(ValidationErrorTest, HugeFieldNumber) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name: \"foo\" number: 0x70000000 "
-    "          label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name: \"foo\" number: 0x70000000 "
+      "          label:LABEL_OPTIONAL type:TYPE_INT32 }"
+      "}",
 
-    "foo.proto: Foo.foo: NUMBER: Field numbers cannot be greater than "
+      "foo.proto: Foo.foo: NUMBER: Field numbers cannot be greater than "
       "536870911.\n");
 }
 
 TEST_F(ValidationErrorTest, ReservedFieldNumber) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field {name:\"foo\" number: 18999 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  field {name:\"bar\" number: 19000 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  field {name:\"baz\" number: 19999 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  field {name:\"qux\" number: 20000 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field {name:\"foo\" number: 18999 label:LABEL_OPTIONAL "
+      "type:TYPE_INT32 }"
+      "  field {name:\"bar\" number: 19000 label:LABEL_OPTIONAL "
+      "type:TYPE_INT32 }"
+      "  field {name:\"baz\" number: 19999 label:LABEL_OPTIONAL "
+      "type:TYPE_INT32 }"
+      "  field {name:\"qux\" number: 20000 label:LABEL_OPTIONAL "
+      "type:TYPE_INT32 }"
+      "}",
 
-    "foo.proto: Foo.bar: NUMBER: Field numbers 19000 through 19999 are "
+      "foo.proto: Foo.bar: NUMBER: Field numbers 19000 through 19999 are "
       "reserved for the protocol buffer library implementation.\n"
-    "foo.proto: Foo.baz: NUMBER: Field numbers 19000 through 19999 are "
+      "foo.proto: Foo.baz: NUMBER: Field numbers 19000 through 19999 are "
       "reserved for the protocol buffer library implementation.\n");
 }
 
 TEST_F(ValidationErrorTest, ExtensionMissingExtendee) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension { name: \"foo\" number: 1 label: LABEL_OPTIONAL"
-    "              type_name: \"Foo\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension { name: \"foo\" number: 1 label: LABEL_OPTIONAL"
+      "              type_name: \"Foo\" }"
+      "}",
 
-    "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee not set for "
+      "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee not set for "
       "extension field.\n");
 }
 
 TEST_F(ValidationErrorTest, NonExtensionWithExtendee) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Bar\""
-    "  extension_range { start: 1 end: 2 }"
-    "}"
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name: \"foo\" number: 1 label: LABEL_OPTIONAL"
-    "          type_name: \"Foo\" extendee: \"Bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Bar\""
+      "  extension_range { start: 1 end: 2 }"
+      "}"
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name: \"foo\" number: 1 label: LABEL_OPTIONAL"
+      "          type_name: \"Foo\" extendee: \"Bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee set for "
+      "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee set for "
       "non-extension field.\n");
 }
 
 TEST_F(ValidationErrorTest, FieldOneofIndexTooLarge) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32 "
-    "          oneof_index: 1 }"
-    "  field { name:\"dummy\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 "
-    "          oneof_index: 0 }"
-    "  oneof_decl { name:\"bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "          oneof_index: 1 }"
+      "  field { name:\"dummy\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "          oneof_index: 0 }"
+      "  oneof_decl { name:\"bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: OTHER: FieldDescriptorProto.oneof_index 1 is out of "
+      "foo.proto: Foo.foo: TYPE: FieldDescriptorProto.oneof_index 1 is out of "
       "range for type \"Foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, FieldOneofIndexNegative) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32 "
-    "          oneof_index: -1 }"
-    "  field { name:\"dummy\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 "
-    "          oneof_index: 0 }"
-    "  oneof_decl { name:\"bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "          oneof_index: -1 }"
+      "  field { name:\"dummy\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 "
+      "          oneof_index: 0 }"
+      "  oneof_decl { name:\"bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: OTHER: FieldDescriptorProto.oneof_index -1 is out of "
+      "foo.proto: Foo.foo: TYPE: FieldDescriptorProto.oneof_index -1 is out "
+      "of "
       "range for type \"Foo\".\n");
 }
 
@@ -4215,7 +4252,7 @@
       "  oneof_decl { name:\"foos\" }"
       "}",
 
-      "foo.proto: Foo.bar: OTHER: Fields in the same oneof must be defined "
+      "foo.proto: Foo.bar: TYPE: Fields in the same oneof must be defined "
       "consecutively. \"bar\" cannot be defined before the completion of the "
       "\"foos\" oneof definition.\n");
 
@@ -4235,10 +4272,10 @@
       "  oneof_decl { name:\"foos\" }"
       "  oneof_decl { name:\"bars\" }"
       "}",
-      "foo2.proto: Foo2.bar1: OTHER: Fields in the same oneof must be defined "
+      "foo2.proto: Foo2.bar1: TYPE: Fields in the same oneof must be defined "
       "consecutively. \"bar1\" cannot be defined before the completion of the "
       "\"foos\" oneof definition.\n"
-      "foo2.proto: Foo2.foo2: OTHER: Fields in the same oneof must be defined "
+      "foo2.proto: Foo2.foo2: TYPE: Fields in the same oneof must be defined "
       "consecutively. \"foo2\" cannot be defined before the completion of the "
       "\"bars\" oneof definition.\n");
 
@@ -4257,202 +4294,205 @@
       "  oneof_decl { name:\"foos\" }"
       "  oneof_decl { name:\"bars\" }"
       "}",
-      "foo3.proto: Foo3.baz: OTHER: Fields in the same oneof must be defined "
+      "foo3.proto: Foo3.baz: TYPE: Fields in the same oneof must be defined "
       "consecutively. \"baz\" cannot be defined before the completion of the "
       "\"foos\" oneof definition.\n");
 }
 
 TEST_F(ValidationErrorTest, FieldNumberConflict) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  field { name: \"bar\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }"
+      "  field { name: \"bar\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }"
+      "}",
 
-    "foo.proto: Foo.bar: NUMBER: Field number 1 has already been used in "
+      "foo.proto: Foo.bar: NUMBER: Field number 1 has already been used in "
       "\"Foo\" by field \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, BadMessageSetExtensionType) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"MessageSet\""
-    "  options { message_set_wire_format: true }"
-    "  extension_range { start: 4 end: 5 }"
-    "}"
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension { name:\"foo\" number:4 label:LABEL_OPTIONAL type:TYPE_INT32"
-    "              extendee: \"MessageSet\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"MessageSet\""
+      "  options { message_set_wire_format: true }"
+      "  extension_range { start: 4 end: 5 }"
+      "}"
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension { name:\"foo\" number:4 label:LABEL_OPTIONAL type:TYPE_INT32"
+      "              extendee: \"MessageSet\" }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional "
+      "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional "
       "messages.\n");
 }
 
 TEST_F(ValidationErrorTest, BadMessageSetExtensionLabel) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"MessageSet\""
-    "  options { message_set_wire_format: true }"
-    "  extension_range { start: 4 end: 5 }"
-    "}"
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension { name:\"foo\" number:4 label:LABEL_REPEATED type:TYPE_MESSAGE"
-    "              type_name: \"Foo\" extendee: \"MessageSet\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"MessageSet\""
+      "  options { message_set_wire_format: true }"
+      "  extension_range { start: 4 end: 5 }"
+      "}"
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension { name:\"foo\" number:4 label:LABEL_REPEATED "
+      "type:TYPE_MESSAGE"
+      "              type_name: \"Foo\" extendee: \"MessageSet\" }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional "
+      "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional "
       "messages.\n");
 }
 
 TEST_F(ValidationErrorTest, FieldInMessageSet) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  options { message_set_wire_format: true }"
-    "  field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  options { message_set_wire_format: true }"
+      "  field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }"
+      "}",
 
-    "foo.proto: Foo.foo: NAME: MessageSets cannot have fields, only "
+      "foo.proto: Foo.foo: NAME: MessageSets cannot have fields, only "
       "extensions.\n");
 }
 
 TEST_F(ValidationErrorTest, NegativeExtensionRangeNumber) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension_range { start: -10 end: -1 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension_range { start: -10 end: -1 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Extension numbers must be positive integers.\n");
+      "foo.proto: Foo: NUMBER: Extension numbers must be positive integers.\n");
 }
 
 TEST_F(ValidationErrorTest, HugeExtensionRangeNumber) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension_range { start: 1 end: 0x70000000 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension_range { start: 1 end: 0x70000000 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Extension numbers cannot be greater than "
+      "foo.proto: Foo: NUMBER: Extension numbers cannot be greater than "
       "536870911.\n");
 }
 
 TEST_F(ValidationErrorTest, ExtensionRangeEndBeforeStart) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension_range { start: 10 end: 10 }"
-    "  extension_range { start: 10 end: 5 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension_range { start: 10 end: 10 }"
+      "  extension_range { start: 10 end: 5 }"
+      "}",
 
-    "foo.proto: Foo: NUMBER: Extension range end number must be greater than "
+      "foo.proto: Foo: NUMBER: Extension range end number must be greater than "
       "start number.\n"
-    "foo.proto: Foo: NUMBER: Extension range end number must be greater than "
+      "foo.proto: Foo: NUMBER: Extension range end number must be greater than "
       "start number.\n");
 }
 
 TEST_F(ValidationErrorTest, EmptyEnum) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type { name: \"Foo\" }"
-    // Also use the empty enum in a message to make sure there are no crashes
-    // during validation (possible if the code attempts to derive a default
-    // value for the field).
-    "message_type {"
-    "  name: \"Bar\""
-    "  field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type_name:\"Foo\" }"
-    "  field { name: \"bar\" number: 2 label:LABEL_OPTIONAL type_name:\"Foo\" "
-    "          default_value: \"NO_SUCH_VALUE\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type { name: \"Foo\" }"
+      // Also use the empty enum in a message to make sure there are no crashes
+      // during validation (possible if the code attempts to derive a default
+      // value for the field).
+      "message_type {"
+      "  name: \"Bar\""
+      "  field { name: \"foo\" number: 1 label:LABEL_OPTIONAL "
+      "type_name:\"Foo\" }"
+      "  field { name: \"bar\" number: 2 label:LABEL_OPTIONAL "
+      "type_name:\"Foo\" "
+      "          default_value: \"NO_SUCH_VALUE\" }"
+      "}",
 
-    "foo.proto: Foo: NAME: Enums must contain at least one value.\n"
-    "foo.proto: Bar.bar: DEFAULT_VALUE: Enum type \"Foo\" has no value named "
+      "foo.proto: Foo: NAME: Enums must contain at least one value.\n"
+      "foo.proto: Bar.bar: DEFAULT_VALUE: Enum type \"Foo\" has no value named "
       "\"NO_SUCH_VALUE\".\n");
 }
 
 TEST_F(ValidationErrorTest, UndefinedExtendee) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32"
-    "              extendee: \"Bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32"
+      "              extendee: \"Bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not defined.\n");
+      "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not defined.\n");
 }
 
 TEST_F(ValidationErrorTest, NonMessageExtendee) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } }"
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32"
-    "              extendee: \"Bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } }"
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32"
+      "              extendee: \"Bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not a message type.\n");
+      "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not a message type.\n");
 }
 
 TEST_F(ValidationErrorTest, NotAnExtensionNumber) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Bar\""
-    "}"
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32"
-    "              extendee: \"Bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Bar\""
+      "}"
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32"
+      "              extendee: \"Bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: NUMBER: \"Bar\" does not declare 1 as an extension "
+      "foo.proto: Foo.foo: NUMBER: \"Bar\" does not declare 1 as an extension "
       "number.\n");
 }
 
 TEST_F(ValidationErrorTest, RequiredExtension) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Bar\""
-    "  extension_range { start: 1000 end: 10000 }"
-    "}"
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension {"
-    "    name:\"foo\""
-    "    number:1000"
-    "    label:LABEL_REQUIRED"
-    "    type:TYPE_INT32"
-    "    extendee: \"Bar\""
-    "  }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Bar\""
+      "  extension_range { start: 1000 end: 10000 }"
+      "}"
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension {"
+      "    name:\"foo\""
+      "    number:1000"
+      "    label:LABEL_REQUIRED"
+      "    type:TYPE_INT32"
+      "    extendee: \"Bar\""
+      "  }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: Message extensions cannot have required "
-    "fields.\n");
+      "foo.proto: Foo.foo: TYPE: Message extensions cannot have required "
+      "fields.\n");
 }
 
 TEST_F(ValidationErrorTest, UndefinedFieldType) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: \"Bar\" is not defined.\n");
+      "foo.proto: Foo.foo: TYPE: \"Bar\" is not defined.\n");
 }
 
 TEST_F(ValidationErrorTest, UndefinedFieldTypeWithDefault) {
@@ -4461,42 +4501,42 @@
   // error message. We want this input to yield a validation error instead,
   // since the unknown type is the primary problem.
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"int\" "
-    "          default_value:\"1\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"int\" "
+      "          default_value:\"1\" }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: \"int\" is not defined.\n");
+      "foo.proto: Foo.foo: TYPE: \"int\" is not defined.\n");
 }
 
 TEST_F(ValidationErrorTest, UndefinedNestedFieldType) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  nested_type { name:\"Baz\" }"
-    "  field { name:\"foo\" number:1"
-    "          label:LABEL_OPTIONAL"
-    "          type_name:\"Foo.Baz.Bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  nested_type { name:\"Baz\" }"
+      "  field { name:\"foo\" number:1"
+      "          label:LABEL_OPTIONAL"
+      "          type_name:\"Foo.Baz.Bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: \"Foo.Baz.Bar\" is not defined.\n");
+      "foo.proto: Foo.foo: TYPE: \"Foo.Baz.Bar\" is not defined.\n");
 }
 
 TEST_F(ValidationErrorTest, FieldTypeDefinedInUndeclaredDependency) {
   BuildFile(
-    "name: \"bar.proto\" "
-    "message_type { name: \"Bar\" } ");
+      "name: \"bar.proto\" "
+      "message_type { name: \"Bar\" } ");
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
-    "}",
-    "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", "
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
+      "}",
+      "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", "
       "which is not imported by \"foo.proto\".  To use it here, please add the "
       "necessary import.\n");
 }
@@ -4517,21 +4557,21 @@
   // }
   //
   BuildFile(
-    "name: \"bar.proto\" "
-    "message_type { name: \"Bar\" }");
+      "name: \"bar.proto\" "
+      "message_type { name: \"Bar\" }");
 
   BuildFile(
-    "name: \"forward.proto\""
-    "dependency: \"bar.proto\"");
+      "name: \"forward.proto\""
+      "dependency: \"bar.proto\"");
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"forward.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
-    "}",
-    "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", "
+      "name: \"foo.proto\" "
+      "dependency: \"forward.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
+      "}",
+      "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", "
       "which is not imported by \"foo.proto\".  To use it here, please add the "
       "necessary import.\n");
 }
@@ -4554,21 +4594,21 @@
   // }
   //
   BuildFile(
-    "name: \"bar.proto\" "
-    "message_type { name: \"Bar\" }");
+      "name: \"bar.proto\" "
+      "message_type { name: \"Bar\" }");
 
   BuildFile(
-    "name: \"forward.proto\""
-    "dependency: \"bar.proto\" "
-    "public_dependency: 0");
+      "name: \"forward.proto\""
+      "dependency: \"bar.proto\" "
+      "public_dependency: 0");
 
   BuildFile(
-    "name: \"foo.proto\" "
-    "dependency: \"forward.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
-    "}");
+      "name: \"foo.proto\" "
+      "dependency: \"forward.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
+      "}");
 }
 
 TEST_F(ValidationErrorTest, FieldTypeDefinedInTransitivePublicDependency) {
@@ -4590,26 +4630,26 @@
   // }
   //
   BuildFile(
-    "name: \"bar.proto\" "
-    "message_type { name: \"Bar\" }");
+      "name: \"bar.proto\" "
+      "message_type { name: \"Bar\" }");
 
   BuildFile(
-    "name: \"forward.proto\""
-    "dependency: \"bar.proto\" "
-    "public_dependency: 0");
+      "name: \"forward.proto\""
+      "dependency: \"bar.proto\" "
+      "public_dependency: 0");
 
   BuildFile(
-    "name: \"forward2.proto\""
-    "dependency: \"forward.proto\" "
-    "public_dependency: 0");
+      "name: \"forward2.proto\""
+      "dependency: \"forward.proto\" "
+      "public_dependency: 0");
 
   BuildFile(
-    "name: \"foo.proto\" "
-    "dependency: \"forward2.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
-    "}");
+      "name: \"foo.proto\" "
+      "dependency: \"forward2.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
+      "}");
 }
 
 TEST_F(ValidationErrorTest,
@@ -4634,26 +4674,26 @@
   // }
   //
   BuildFile(
-    "name: \"bar.proto\" "
-    "message_type { name: \"Bar\" }");
+      "name: \"bar.proto\" "
+      "message_type { name: \"Bar\" }");
 
   BuildFile(
-    "name: \"forward.proto\""
-    "dependency: \"bar.proto\"");
+      "name: \"forward.proto\""
+      "dependency: \"bar.proto\"");
 
   BuildFile(
-    "name: \"forward2.proto\""
-    "dependency: \"forward.proto\" "
-    "public_dependency: 0");
+      "name: \"forward2.proto\""
+      "dependency: \"forward.proto\" "
+      "public_dependency: 0");
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"forward2.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
-    "}",
-    "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", "
+      "name: \"foo.proto\" "
+      "dependency: \"forward2.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
+      "}",
+      "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", "
       "which is not imported by \"foo.proto\".  To use it here, please add the "
       "necessary import.\n");
 }
@@ -4675,22 +4715,22 @@
   // fail, and ten try "Bar.Baz" and succeed, even though "Bar" should actually
   // refer to the inner Bar, not the outer one.
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Bar\""
-    "  nested_type { name: \"Baz\" }"
-    "}"
-    "message_type {"
-    "  name: \"Foo\""
-    "  nested_type { name: \"Bar\" }"
-    "  field { name:\"baz\" number:1 label:LABEL_OPTIONAL"
-    "          type_name:\"Bar.Baz\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Bar\""
+      "  nested_type { name: \"Baz\" }"
+      "}"
+      "message_type {"
+      "  name: \"Foo\""
+      "  nested_type { name: \"Bar\" }"
+      "  field { name:\"baz\" number:1 label:LABEL_OPTIONAL"
+      "          type_name:\"Bar.Baz\" }"
+      "}",
 
-    "foo.proto: Foo.baz: TYPE: \"Bar.Baz\" is resolved to \"Foo.Bar.Baz\","
-    " which is not defined. The innermost scope is searched first in name "
-    "resolution. Consider using a leading '.'(i.e., \".Bar.Baz\") to start "
-    "from the outermost scope.\n");
+      "foo.proto: Foo.baz: TYPE: \"Bar.Baz\" is resolved to \"Foo.Bar.Baz\","
+      " which is not defined. The innermost scope is searched first in name "
+      "resolution. Consider using a leading '.'(i.e., \".Bar.Baz\") to start "
+      "from the outermost scope.\n");
 }
 
 TEST_F(ValidationErrorTest, SearchMostLocalFirst2) {
@@ -4698,17 +4738,17 @@
   // proceeds to find the outer one because the inner one's not an
   // aggregate.
   BuildFile(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Bar\""
-    "  nested_type { name: \"Baz\" }"
-    "}"
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name: \"Bar\" number:1 type:TYPE_BYTES } "
-    "  field { name:\"baz\" number:2 label:LABEL_OPTIONAL"
-    "          type_name:\"Bar.Baz\" }"
-    "}");
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Bar\""
+      "  nested_type { name: \"Baz\" }"
+      "}"
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name: \"Bar\" number:1 type:TYPE_BYTES } "
+      "  field { name:\"baz\" number:2 label:LABEL_OPTIONAL"
+      "          type_name:\"Bar.Baz\" }"
+      "}");
 }
 
 TEST_F(ValidationErrorTest, PackageOriginallyDeclaredInTransitiveDependent) {
@@ -4734,349 +4774,348 @@
   // prevent it from finding "foo.bar".
 
   BuildFile(
-    "name: \"foo.proto\" "
-    "package: \"foo.bar\" ");
+      "name: \"foo.proto\" "
+      "package: \"foo.bar\" ");
   BuildFile(
-    "name: \"bar.proto\" "
-    "package: \"foo.bar\" "
-    "dependency: \"foo.proto\" "
-    "message_type { name: \"Bar\" }");
+      "name: \"bar.proto\" "
+      "package: \"foo.bar\" "
+      "dependency: \"foo.proto\" "
+      "message_type { name: \"Bar\" }");
   BuildFile(
-    "name: \"baz.proto\" "
-    "package: \"foo\" "
-    "dependency: \"bar.proto\" "
-    "message_type { "
-    "  name: \"Baz\" "
-    "  field { name:\"qux\" number:1 label:LABEL_OPTIONAL "
-    "          type_name:\"bar.Bar\" }"
-    "}");
+      "name: \"baz.proto\" "
+      "package: \"foo\" "
+      "dependency: \"bar.proto\" "
+      "message_type { "
+      "  name: \"Baz\" "
+      "  field { name:\"qux\" number:1 label:LABEL_OPTIONAL "
+      "          type_name:\"bar.Bar\" }"
+      "}");
 }
 
 TEST_F(ValidationErrorTest, FieldTypeNotAType) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL "
-    "          type_name:\".Foo.bar\" }"
-    "  field { name:\"bar\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL "
+      "          type_name:\".Foo.bar\" }"
+      "  field { name:\"bar\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: \".Foo.bar\" is not a type.\n");
+      "foo.proto: Foo.foo: TYPE: \".Foo.bar\" is not a type.\n");
 }
 
 TEST_F(ValidationErrorTest, RelativeFieldTypeNotAType) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  nested_type {"
-    "    name: \"Bar\""
-    "    field { name:\"Baz\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }"
-    "  }"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL "
-    "          type_name:\"Bar.Baz\" }"
-    "}",
-    "foo.proto: Foo.foo: TYPE: \"Bar.Baz\" is not a type.\n");
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  nested_type {"
+      "    name: \"Bar\""
+      "    field { name:\"Baz\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }"
+      "  }"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL "
+      "          type_name:\"Bar.Baz\" }"
+      "}",
+      "foo.proto: Foo.foo: TYPE: \"Bar.Baz\" is not a type.\n");
 }
 
 TEST_F(ValidationErrorTest, FieldTypeMayBeItsName) {
   BuildFile(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Bar\""
-    "}"
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"Bar\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
-    "}");
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Bar\""
+      "}"
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"Bar\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }"
+      "}");
 }
 
 TEST_F(ValidationErrorTest, EnumFieldTypeIsMessage) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { name: \"Bar\" } "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_ENUM"
-    "          type_name:\"Bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type { name: \"Bar\" } "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_ENUM"
+      "          type_name:\"Bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: \"Bar\" is not an enum type.\n");
+      "foo.proto: Foo.foo: TYPE: \"Bar\" is not an enum type.\n");
 }
 
 TEST_F(ValidationErrorTest, MessageFieldTypeIsEnum) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE"
-    "          type_name:\"Bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE"
+      "          type_name:\"Bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: \"Bar\" is not a message type.\n");
+      "foo.proto: Foo.foo: TYPE: \"Bar\" is not a message type.\n");
 }
 
 TEST_F(ValidationErrorTest, BadEnumDefaultValue) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\""
-    "          default_value:\"NO_SUCH_VALUE\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\""
+      "          default_value:\"NO_SUCH_VALUE\" }"
+      "}",
 
-    "foo.proto: Foo.foo: DEFAULT_VALUE: Enum type \"Bar\" has no value named "
+      "foo.proto: Foo.foo: DEFAULT_VALUE: Enum type \"Bar\" has no value named "
       "\"NO_SUCH_VALUE\".\n");
 }
 
 TEST_F(ValidationErrorTest, EnumDefaultValueIsInteger) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\""
-    "          default_value:\"0\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\""
+      "          default_value:\"0\" }"
+      "}",
 
-    "foo.proto: Foo.foo: DEFAULT_VALUE: Default value for an enum field must "
-    "be an identifier.\n");
+      "foo.proto: Foo.foo: DEFAULT_VALUE: Default value for an enum field must "
+      "be an identifier.\n");
 }
 
 TEST_F(ValidationErrorTest, PrimitiveWithTypeName) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32"
-    "          type_name:\"Foo\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32"
+      "          type_name:\"Foo\" }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: Field with primitive type has type_name.\n");
+      "foo.proto: Foo.foo: TYPE: Field with primitive type has type_name.\n");
 }
 
 TEST_F(ValidationErrorTest, NonPrimitiveWithoutTypeName) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE }"
+      "}",
 
-    "foo.proto: Foo.foo: TYPE: Field with message or enum type missing "
+      "foo.proto: Foo.foo: TYPE: Field with message or enum type missing "
       "type_name.\n");
 }
 
 TEST_F(ValidationErrorTest, OneofWithNoFields) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  oneof_decl { name:\"bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  oneof_decl { name:\"bar\" }"
+      "}",
 
-    "foo.proto: Foo.bar: NAME: Oneof must have at least one field.\n");
+      "foo.proto: Foo.bar: NAME: Oneof must have at least one field.\n");
 }
 
 TEST_F(ValidationErrorTest, OneofLabelMismatch) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  field { name:\"foo\" number:1 label:LABEL_REPEATED type:TYPE_INT32 "
-    "          oneof_index:0 }"
-    "  oneof_decl { name:\"bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  field { name:\"foo\" number:1 label:LABEL_REPEATED type:TYPE_INT32 "
+      "          oneof_index:0 }"
+      "  oneof_decl { name:\"bar\" }"
+      "}",
 
-    "foo.proto: Foo.foo: NAME: Fields of oneofs must themselves have label "
+      "foo.proto: Foo.foo: NAME: Fields of oneofs must themselves have label "
       "LABEL_OPTIONAL.\n");
 }
 
 TEST_F(ValidationErrorTest, InputTypeNotDefined) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { name: \"Foo\" } "
-    "service {"
-    "  name: \"TestService\""
-    "  method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type { name: \"Foo\" } "
+      "service {"
+      "  name: \"TestService\""
+      "  method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }"
+      "}",
 
-    "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not defined.\n"
-    );
+      "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not defined.\n"
+  );
 }
 
 TEST_F(ValidationErrorTest, InputTypeNotAMessage) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { name: \"Foo\" } "
-    "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } "
-    "service {"
-    "  name: \"TestService\""
-    "  method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type { name: \"Foo\" } "
+      "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } "
+      "service {"
+      "  name: \"TestService\""
+      "  method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }"
+      "}",
 
-    "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not a message type.\n"
-    );
+      "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not a message type.\n"
+  );
 }
 
 TEST_F(ValidationErrorTest, OutputTypeNotDefined) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { name: \"Foo\" } "
-    "service {"
-    "  name: \"TestService\""
-    "  method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type { name: \"Foo\" } "
+      "service {"
+      "  name: \"TestService\""
+      "  method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }"
+      "}",
 
-    "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not defined.\n"
-    );
+      "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not defined.\n"
+  );
 }
 
 TEST_F(ValidationErrorTest, OutputTypeNotAMessage) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { name: \"Foo\" } "
-    "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } "
-    "service {"
-    "  name: \"TestService\""
-    "  method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type { name: \"Foo\" } "
+      "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } "
+      "service {"
+      "  name: \"TestService\""
+      "  method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }"
+      "}",
 
-    "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not a message type.\n"
-    );
+      "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not a message type.\n"
+  );
 }
 
 
 TEST_F(ValidationErrorTest, IllegalPackedField) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {\n"
-    "  name: \"Foo\""
-    "  field { name:\"packed_string\" number:1 label:LABEL_REPEATED "
-    "          type:TYPE_STRING "
-    "          options { uninterpreted_option {"
-    "            name { name_part: \"packed\" is_extension: false }"
-    "            identifier_value: \"true\" }}}\n"
-    "  field { name:\"packed_message\" number:3 label:LABEL_REPEATED "
-    "          type_name: \"Foo\""
-    "          options { uninterpreted_option {"
-    "            name { name_part: \"packed\" is_extension: false }"
-    "            identifier_value: \"true\" }}}\n"
-    "  field { name:\"optional_int32\" number: 4 label: LABEL_OPTIONAL "
-    "          type:TYPE_INT32 "
-    "          options { uninterpreted_option {"
-    "            name { name_part: \"packed\" is_extension: false }"
-    "            identifier_value: \"true\" }}}\n"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {\n"
+      "  name: \"Foo\""
+      "  field { name:\"packed_string\" number:1 label:LABEL_REPEATED "
+      "          type:TYPE_STRING "
+      "          options { uninterpreted_option {"
+      "            name { name_part: \"packed\" is_extension: false }"
+      "            identifier_value: \"true\" }}}\n"
+      "  field { name:\"packed_message\" number:3 label:LABEL_REPEATED "
+      "          type_name: \"Foo\""
+      "          options { uninterpreted_option {"
+      "            name { name_part: \"packed\" is_extension: false }"
+      "            identifier_value: \"true\" }}}\n"
+      "  field { name:\"optional_int32\" number: 4 label: LABEL_OPTIONAL "
+      "          type:TYPE_INT32 "
+      "          options { uninterpreted_option {"
+      "            name { name_part: \"packed\" is_extension: false }"
+      "            identifier_value: \"true\" }}}\n"
+      "}",
 
-    "foo.proto: Foo.packed_string: TYPE: [packed = true] can only be "
-        "specified for repeated primitive fields.\n"
-    "foo.proto: Foo.packed_message: TYPE: [packed = true] can only be "
-        "specified for repeated primitive fields.\n"
-    "foo.proto: Foo.optional_int32: TYPE: [packed = true] can only be "
-        "specified for repeated primitive fields.\n"
-        );
+      "foo.proto: Foo.packed_string: TYPE: [packed = true] can only be "
+      "specified for repeated primitive fields.\n"
+      "foo.proto: Foo.packed_message: TYPE: [packed = true] can only be "
+      "specified for repeated primitive fields.\n"
+      "foo.proto: Foo.optional_int32: TYPE: [packed = true] can only be "
+      "specified for repeated primitive fields.\n");
 }
 
 TEST_F(ValidationErrorTest, OptionWrongType) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { "
-    "  name: \"TestMessage\" "
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING "
-    "          options { uninterpreted_option { name { name_part: \"ctype\" "
-    "                                                  is_extension: false }"
-    "                                           positive_int_value: 1 }"
-    "          }"
-    "  }"
-    "}\n",
+      "name: \"foo.proto\" "
+      "message_type { "
+      "  name: \"TestMessage\" "
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING "
+      "          options { uninterpreted_option { name { name_part: \"ctype\" "
+      "                                                  is_extension: false }"
+      "                                           positive_int_value: 1 }"
+      "          }"
+      "  }"
+      "}\n",
 
-    "foo.proto: TestMessage.foo: OPTION_VALUE: Value must be identifier for "
-    "enum-valued option \"google.protobuf.FieldOptions.ctype\".\n");
+      "foo.proto: TestMessage.foo: OPTION_VALUE: Value must be identifier for "
+      "enum-valued option \"google.protobuf.FieldOptions.ctype\".\n");
 }
 
 TEST_F(ValidationErrorTest, OptionExtendsAtomicType) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { "
-    "  name: \"TestMessage\" "
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING "
-    "          options { uninterpreted_option { name { name_part: \"ctype\" "
-    "                                                  is_extension: false }"
-    "                                           name { name_part: \"foo\" "
-    "                                                  is_extension: true }"
-    "                                           positive_int_value: 1 }"
-    "          }"
-    "  }"
-    "}\n",
+      "name: \"foo.proto\" "
+      "message_type { "
+      "  name: \"TestMessage\" "
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING "
+      "          options { uninterpreted_option { name { name_part: \"ctype\" "
+      "                                                  is_extension: false }"
+      "                                           name { name_part: \"foo\" "
+      "                                                  is_extension: true }"
+      "                                           positive_int_value: 1 }"
+      "          }"
+      "  }"
+      "}\n",
 
-    "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" is an "
-    "atomic type, not a message.\n");
+      "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" is an "
+      "atomic type, not a message.\n");
 }
 
 TEST_F(ValidationErrorTest, DupOption) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { "
-    "  name: \"TestMessage\" "
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_UINT32 "
-    "          options { uninterpreted_option { name { name_part: \"ctype\" "
-    "                                                  is_extension: false }"
-    "                                           identifier_value: \"CORD\" }"
-    "                    uninterpreted_option { name { name_part: \"ctype\" "
-    "                                                  is_extension: false }"
-    "                                           identifier_value: \"CORD\" }"
-    "          }"
-    "  }"
-    "}\n",
+      "name: \"foo.proto\" "
+      "message_type { "
+      "  name: \"TestMessage\" "
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_UINT32 "
+      "          options { uninterpreted_option { name { name_part: \"ctype\" "
+      "                                                  is_extension: false }"
+      "                                           identifier_value: \"CORD\" }"
+      "                    uninterpreted_option { name { name_part: \"ctype\" "
+      "                                                  is_extension: false }"
+      "                                           identifier_value: \"CORD\" }"
+      "          }"
+      "  }"
+      "}\n",
 
-    "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" was "
-    "already set.\n");
+      "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" was "
+      "already set.\n");
 }
 
 TEST_F(ValidationErrorTest, InvalidOptionName) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type { "
-    "  name: \"TestMessage\" "
-    "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL "
-    "          options { uninterpreted_option { "
-    "                      name { name_part: \"uninterpreted_option\" "
-    "                             is_extension: false }"
-    "                      positive_int_value: 1 "
-    "                    }"
-    "          }"
-    "  }"
-    "}\n",
+      "name: \"foo.proto\" "
+      "message_type { "
+      "  name: \"TestMessage\" "
+      "  field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL "
+      "          options { uninterpreted_option { "
+      "                      name { name_part: \"uninterpreted_option\" "
+      "                             is_extension: false }"
+      "                      positive_int_value: 1 "
+      "                    }"
+      "          }"
+      "  }"
+      "}\n",
 
-    "foo.proto: TestMessage.foo: OPTION_NAME: Option must not use "
-    "reserved name \"uninterpreted_option\".\n");
+      "foo.proto: TestMessage.foo: OPTION_NAME: Option must not use "
+      "reserved name \"uninterpreted_option\".\n");
 }
 
 TEST_F(ValidationErrorTest, RepeatedMessageOption) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "message_type: { name: \"Bar\" field: { "
-    "  name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32 } "
-    "} "
-    "extension { name: \"bar\" number: 7672757 label: LABEL_REPEATED "
-    "            type: TYPE_MESSAGE type_name: \"Bar\" "
-    "            extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"bar\" "
-    "                                        is_extension: true } "
-    "                                 name { name_part: \"foo\" "
-    "                                        is_extension: false } "
-    "                                 positive_int_value: 1 } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "message_type: { name: \"Bar\" field: { "
+      "  name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32 } "
+      "} "
+      "extension { name: \"bar\" number: 7672757 label: LABEL_REPEATED "
+      "            type: TYPE_MESSAGE type_name: \"Bar\" "
+      "            extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"bar\" "
+      "                                        is_extension: true } "
+      "                                 name { name_part: \"foo\" "
+      "                                        is_extension: false } "
+      "                                 positive_int_value: 1 } }",
 
-    "foo.proto: foo.proto: OPTION_NAME: Option field \"(bar)\" is a "
-    "repeated message. Repeated message options must be initialized "
-    "using an aggregate value.\n");
+      "foo.proto: foo.proto: OPTION_NAME: Option field \"(bar)\" is a "
+      "repeated message. Repeated message options must be initialized "
+      "using an aggregate value.\n");
 }
 
 TEST_F(ValidationErrorTest, ResolveUndefinedOption) {
@@ -5098,299 +5137,301 @@
   BuildDescriptorMessagesInTestPool();
 
   BuildFile(
-    "name: \"foo.proto\" "
-    "package: \"baz\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "message_type: { name: \"Bar\" field: { "
-    "  name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32 } "
-    "} "
-    "extension { name: \"bar\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_MESSAGE type_name: \"Bar\" "
-    "            extendee: \"google.protobuf.FileOptions\" }");
+      "name: \"foo.proto\" "
+      "package: \"baz\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "message_type: { name: \"Bar\" field: { "
+      "  name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32 } "
+      "} "
+      "extension { name: \"bar\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_MESSAGE type_name: \"Bar\" "
+      "            extendee: \"google.protobuf.FileOptions\" }");
 
   BuildFileWithErrors(
-    "name: \"qux.proto\" "
-    "package: \"qux.baz\" "
-    "options { uninterpreted_option { name { name_part: \"baz.bar\" "
-    "                                        is_extension: true } "
-    "                                 name { name_part: \"foo\" "
-    "                                        is_extension: false } "
-    "                                 positive_int_value: 1 } }",
+      "name: \"qux.proto\" "
+      "package: \"qux.baz\" "
+      "options { uninterpreted_option { name { name_part: \"baz.bar\" "
+      "                                        is_extension: true } "
+      "                                 name { name_part: \"foo\" "
+      "                                        is_extension: false } "
+      "                                 positive_int_value: 1 } }",
 
-    "qux.proto: qux.proto: OPTION_NAME: Option \"(baz.bar)\" is resolved to "
-    "\"(qux.baz.bar)\","
-    " which is not defined. The innermost scope is searched first in name "
-    "resolution. Consider using a leading '.'(i.e., \"(.baz.bar)\") to start "
-    "from the outermost scope.\n");
+      "qux.proto: qux.proto: OPTION_NAME: Option \"(baz.bar)\" is resolved to "
+      "\"(qux.baz.bar)\","
+      " which is not defined. The innermost scope is searched first in name "
+      "resolution. Consider using a leading '.'(i.e., \"(.baz.bar)\") to start "
+      "from the outermost scope.\n");
 }
 
 TEST_F(ValidationErrorTest, UnknownOption) {
   BuildFileWithErrors(
-    "name: \"qux.proto\" "
-    "package: \"qux.baz\" "
-    "options { uninterpreted_option { name { name_part: \"baaz.bar\" "
-    "                                        is_extension: true } "
-    "                                 name { name_part: \"foo\" "
-    "                                        is_extension: false } "
-    "                                 positive_int_value: 1 } }",
+      "name: \"qux.proto\" "
+      "package: \"qux.baz\" "
+      "options { uninterpreted_option { name { name_part: \"baaz.bar\" "
+      "                                        is_extension: true } "
+      "                                 name { name_part: \"foo\" "
+      "                                        is_extension: false } "
+      "                                 positive_int_value: 1 } }",
 
-    "qux.proto: qux.proto: OPTION_NAME: Option \"(baaz.bar)\" unknown. Ensure "
-    "that your proto definition file imports the proto which defines the "
-    "option.\n");
+      "qux.proto: qux.proto: OPTION_NAME: Option \"(baaz.bar)\" unknown. "
+      "Ensure "
+      "that your proto definition file imports the proto which defines the "
+      "option.\n");
 }
 
 TEST_F(ValidationErrorTest, CustomOptionConflictingFieldNumber) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo1\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }"
-    "extension { name: \"foo2\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo1\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }"
+      "extension { name: \"foo2\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }",
 
-    "foo.proto: foo2: NUMBER: Extension number 7672757 has already been used "
-    "in \"google.protobuf.FieldOptions\" by extension \"foo1\".\n");
+      "foo.proto: foo2: NUMBER: Extension number 7672757 has already been used "
+      "in \"google.protobuf.FieldOptions\" by extension \"foo1\".\n");
 }
 
 TEST_F(ValidationErrorTest, Int32OptionValueOutOfPositiveRange) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 positive_int_value: 0x80000000 } "
-    "}",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 positive_int_value: 0x80000000 } "
+      "}",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
-    "for int32 option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
+      "for int32 option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, Int32OptionValueOutOfNegativeRange) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 negative_int_value: -0x80000001 } "
-    "}",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 negative_int_value: -0x80000001 } "
+      "}",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
-    "for int32 option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
+      "for int32 option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, Int32OptionValueIsNotPositiveInt) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 string_value: \"5\" } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 string_value: \"5\" } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value must be integer "
-    "for int32 option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value must be integer "
+      "for int32 option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, Int64OptionValueOutOfRange) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 positive_int_value: 0x8000000000000000 } "
-    "}",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 positive_int_value: 0x8000000000000000 "
+      "} "
+      "}",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
-    "for int64 option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
+      "for int64 option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, Int64OptionValueIsNotPositiveInt) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 identifier_value: \"5\" } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 identifier_value: \"5\" } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value must be integer "
-    "for int64 option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value must be integer "
+      "for int64 option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, UInt32OptionValueOutOfRange) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 positive_int_value: 0x100000000 } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 positive_int_value: 0x100000000 } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
-    "for uint32 option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value out of range "
+      "for uint32 option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, UInt32OptionValueIsNotPositiveInt) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 double_value: -5.6 } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 double_value: -5.6 } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer "
-    "for uint32 option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer "
+      "for uint32 option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, UInt64OptionValueIsNotPositiveInt) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_UINT64 extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 negative_int_value: -5 } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_UINT64 extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 negative_int_value: -5 } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer "
-    "for uint64 option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer "
+      "for uint64 option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, FloatOptionValueIsNotNumber) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_FLOAT extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 string_value: \"bar\" } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_FLOAT extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 string_value: \"bar\" } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value must be number "
-    "for float option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value must be number "
+      "for float option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, DoubleOptionValueIsNotNumber) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_DOUBLE extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 string_value: \"bar\" } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_DOUBLE extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 string_value: \"bar\" } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value must be number "
-    "for double option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value must be number "
+      "for double option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, BoolOptionValueIsNotTrueOrFalse) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_BOOL extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 identifier_value: \"bar\" } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_BOOL extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 identifier_value: \"bar\" } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value must be \"true\" or \"false\" "
-    "for boolean option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value must be \"true\" or \"false\" "
+      "for boolean option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, EnumOptionValueIsNotIdentifier) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } "
-    "                              value { name: \"BAZ\" number: 2 } }"
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_ENUM type_name: \"FooEnum\" "
-    "            extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 string_value: \"QUUX\" } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } "
+      "                              value { name: \"BAZ\" number: 2 } }"
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_ENUM type_name: \"FooEnum\" "
+      "            extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 string_value: \"QUUX\" } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Value must be identifier for "
-    "enum-valued option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Value must be identifier for "
+      "enum-valued option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, EnumOptionValueIsNotEnumValueName) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } "
-    "                              value { name: \"BAZ\" number: 2 } }"
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_ENUM type_name: \"FooEnum\" "
-    "            extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 identifier_value: \"QUUX\" } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } "
+      "                              value { name: \"BAZ\" number: 2 } }"
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_ENUM type_name: \"FooEnum\" "
+      "            extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 identifier_value: \"QUUX\" } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum\" has no value "
-    "named \"QUUX\" for option \"foo\".\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum\" has no value "
+      "named \"QUUX\" for option \"foo\".\n");
 }
 
 TEST_F(ValidationErrorTest, EnumOptionValueIsSiblingEnumValueName) {
   BuildDescriptorMessagesInTestPool();
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"google/protobuf/descriptor.proto\" "
-    "enum_type { name: \"FooEnum1\" value { name: \"BAR\" number: 1 } "
-    "                               value { name: \"BAZ\" number: 2 } }"
-    "enum_type { name: \"FooEnum2\" value { name: \"QUX\" number: 1 } "
-    "                               value { name: \"QUUX\" number: 2 } }"
-    "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
-    "            type: TYPE_ENUM type_name: \"FooEnum1\" "
-    "            extendee: \"google.protobuf.FileOptions\" }"
-    "options { uninterpreted_option { name { name_part: \"foo\" "
-    "                                        is_extension: true } "
-    "                                 identifier_value: \"QUUX\" } }",
+      "name: \"foo.proto\" "
+      "dependency: \"google/protobuf/descriptor.proto\" "
+      "enum_type { name: \"FooEnum1\" value { name: \"BAR\" number: 1 } "
+      "                               value { name: \"BAZ\" number: 2 } }"
+      "enum_type { name: \"FooEnum2\" value { name: \"QUX\" number: 1 } "
+      "                               value { name: \"QUUX\" number: 2 } }"
+      "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL "
+      "            type: TYPE_ENUM type_name: \"FooEnum1\" "
+      "            extendee: \"google.protobuf.FileOptions\" }"
+      "options { uninterpreted_option { name { name_part: \"foo\" "
+      "                                        is_extension: true } "
+      "                                 identifier_value: \"QUUX\" } }",
 
-    "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum1\" has no value "
-    "named \"QUUX\" for option \"foo\". This appears to be a value from a "
-    "sibling type.\n");
+      "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum1\" has no value "
+      "named \"QUUX\" for option \"foo\". This appears to be a value from a "
+      "sibling type.\n");
 }
 
 TEST_F(ValidationErrorTest, StringOptionValueIsNotString) {
@@ -5412,22 +5453,22 @@
 
 TEST_F(ValidationErrorTest, JsonNameOptionOnExtensions) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "package: \"foo\" "
-    "message_type {"
-    "  name: \"Foo\""
-    "  extension_range { start: 10 end: 20 }"
-    "}"
-    "extension {"
-    "  name: \"value\""
-    "  number: 10"
-    "  label: LABEL_OPTIONAL"
-    "  type: TYPE_INT32"
-    "  extendee: \"foo.Foo\""
-    "  json_name: \"myName\""
-    "}",
-    "foo.proto: foo.value: OPTION_NAME: option json_name is not allowed on "
-    "extension fields.\n");
+      "name: \"foo.proto\" "
+      "package: \"foo\" "
+      "message_type {"
+      "  name: \"Foo\""
+      "  extension_range { start: 10 end: 20 }"
+      "}"
+      "extension {"
+      "  name: \"value\""
+      "  number: 10"
+      "  label: LABEL_OPTIONAL"
+      "  type: TYPE_INT32"
+      "  extendee: \"foo.Foo\""
+      "  json_name: \"myName\""
+      "}",
+      "foo.proto: foo.value: OPTION_NAME: option json_name is not allowed on "
+      "extension fields.\n");
 }
 
 TEST_F(ValidationErrorTest, DuplicateExtensionFieldNumber) {
@@ -5497,60 +5538,60 @@
 
 TEST_F(ValidationErrorTest, NotLiteImportsLite) {
   BuildFile(
-    "name: \"bar.proto\" "
-    "options { optimize_for: LITE_RUNTIME } ");
+      "name: \"bar.proto\" "
+      "options { optimize_for: LITE_RUNTIME } ");
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"bar.proto\" ",
+      "name: \"foo.proto\" "
+      "dependency: \"bar.proto\" ",
 
-    "foo.proto: foo.proto: OTHER: Files that do not use optimize_for = "
+      "foo.proto: bar.proto: IMPORT: Files that do not use optimize_for = "
       "LITE_RUNTIME cannot import files which do use this option.  This file "
       "is not lite, but it imports \"bar.proto\" which is.\n");
 }
 
 TEST_F(ValidationErrorTest, LiteExtendsNotLite) {
   BuildFile(
-    "name: \"bar.proto\" "
-    "message_type: {"
-    "  name: \"Bar\""
-    "  extension_range { start: 1 end: 1000 }"
-    "}");
+      "name: \"bar.proto\" "
+      "message_type: {"
+      "  name: \"Bar\""
+      "  extension_range { start: 1 end: 1000 }"
+      "}");
 
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "dependency: \"bar.proto\" "
-    "options { optimize_for: LITE_RUNTIME } "
-    "extension { name: \"ext\" number: 123 label: LABEL_OPTIONAL "
-    "            type: TYPE_INT32 extendee: \"Bar\" }",
+      "name: \"foo.proto\" "
+      "dependency: \"bar.proto\" "
+      "options { optimize_for: LITE_RUNTIME } "
+      "extension { name: \"ext\" number: 123 label: LABEL_OPTIONAL "
+      "            type: TYPE_INT32 extendee: \"Bar\" }",
 
-    "foo.proto: ext: EXTENDEE: Extensions to non-lite types can only be "
+      "foo.proto: ext: EXTENDEE: Extensions to non-lite types can only be "
       "declared in non-lite files.  Note that you cannot extend a non-lite "
       "type to contain a lite type, but the reverse is allowed.\n");
 }
 
 TEST_F(ValidationErrorTest, NoLiteServices) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "options {"
-    "  optimize_for: LITE_RUNTIME"
-    "  cc_generic_services: true"
-    "  java_generic_services: true"
-    "} "
-    "service { name: \"Foo\" }",
+      "name: \"foo.proto\" "
+      "options {"
+      "  optimize_for: LITE_RUNTIME"
+      "  cc_generic_services: true"
+      "  java_generic_services: true"
+      "} "
+      "service { name: \"Foo\" }",
 
-    "foo.proto: Foo: NAME: Files with optimize_for = LITE_RUNTIME cannot "
-    "define services unless you set both options cc_generic_services and "
-    "java_generic_sevices to false.\n");
+      "foo.proto: Foo: NAME: Files with optimize_for = LITE_RUNTIME cannot "
+      "define services unless you set both options cc_generic_services and "
+      "java_generic_sevices to false.\n");
 
   BuildFile(
-    "name: \"bar.proto\" "
-    "options {"
-    "  optimize_for: LITE_RUNTIME"
-    "  cc_generic_services: false"
-    "  java_generic_services: false"
-    "} "
-    "service { name: \"Bar\" }");
+      "name: \"bar.proto\" "
+      "options {"
+      "  optimize_for: LITE_RUNTIME"
+      "  cc_generic_services: false"
+      "  java_generic_services: false"
+      "} "
+      "service { name: \"Bar\" }");
 }
 
 TEST_F(ValidationErrorTest, RollbackAfterError) {
@@ -5559,47 +5600,47 @@
   // before the undefined type error is noticed.  The DescriptorPool will then
   // have to roll everything back.
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }"
-    "} "
-    "enum_type {"
-    "  name: \"TestEnum\""
-    "  value { name:\"BAR\" number:1 }"
-    "} "
-    "service {"
-    "  name: \"TestService\""
-    "  method {"
-    "    name: \"Baz\""
-    "    input_type: \"NoSuchType\""    // error
-    "    output_type: \"TestMessage\""
-    "  }"
-    "}",
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }"
+      "} "
+      "enum_type {"
+      "  name: \"TestEnum\""
+      "  value { name:\"BAR\" number:1 }"
+      "} "
+      "service {"
+      "  name: \"TestService\""
+      "  method {"
+      "    name: \"Baz\""
+      "    input_type: \"NoSuchType\""  // error
+      "    output_type: \"TestMessage\""
+      "  }"
+      "}",
 
-    "foo.proto: TestService.Baz: INPUT_TYPE: \"NoSuchType\" is not defined.\n"
-    );
+      "foo.proto: TestService.Baz: INPUT_TYPE: \"NoSuchType\" is not defined.\n"
+  );
 
   // Make sure that if we build the same file again with the error fixed,
   // it works.  If the above rollback was incomplete, then some symbols will
   // be left defined, and this second attempt will fail since it tries to
   // re-define the same symbols.
   BuildFile(
-    "name: \"foo.proto\" "
-    "message_type {"
-    "  name: \"TestMessage\""
-    "  field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }"
-    "} "
-    "enum_type {"
-    "  name: \"TestEnum\""
-    "  value { name:\"BAR\" number:1 }"
-    "} "
-    "service {"
-    "  name: \"TestService\""
-    "  method { name:\"Baz\""
-    "           input_type:\"TestMessage\""
-    "           output_type:\"TestMessage\" }"
-    "}");
+      "name: \"foo.proto\" "
+      "message_type {"
+      "  name: \"TestMessage\""
+      "  field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }"
+      "} "
+      "enum_type {"
+      "  name: \"TestEnum\""
+      "  value { name:\"BAR\" number:1 }"
+      "} "
+      "service {"
+      "  name: \"TestService\""
+      "  method { name:\"Baz\""
+      "           input_type:\"TestMessage\""
+      "           output_type:\"TestMessage\" }"
+      "}");
 }
 
 TEST_F(ValidationErrorTest, ErrorsReportedToLogError) {
@@ -5607,11 +5648,11 @@
   // provided.
 
   FileDescriptorProto file_proto;
-  ASSERT_TRUE(TextFormat::ParseFromString(
-    "name: \"foo.proto\" "
-    "message_type { name: \"Foo\" } "
-    "message_type { name: \"Foo\" } ",
-    &file_proto));
+  ASSERT_TRUE(
+      TextFormat::ParseFromString("name: \"foo.proto\" "
+                                  "message_type { name: \"Foo\" } "
+                                  "message_type { name: \"Foo\" } ",
+                                  &file_proto));
 
   std::vector<std::string> errors;
 
@@ -5629,50 +5670,50 @@
 
 TEST_F(ValidationErrorTest, DisallowEnumAlias) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Bar\""
-    "  value { name:\"ENUM_A\" number:0 }"
-    "  value { name:\"ENUM_B\" number:0 }"
-    "}",
-    "foo.proto: Bar: NUMBER: "
-    "\"ENUM_B\" uses the same enum value as \"ENUM_A\". "
-    "If this is intended, set 'option allow_alias = true;' to the enum "
-    "definition.\n");
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Bar\""
+      "  value { name:\"ENUM_A\" number:0 }"
+      "  value { name:\"ENUM_B\" number:0 }"
+      "}",
+      "foo.proto: Bar: NUMBER: "
+      "\"ENUM_B\" uses the same enum value as \"ENUM_A\". "
+      "If this is intended, set 'option allow_alias = true;' to the enum "
+      "definition.\n");
 }
 
 TEST_F(ValidationErrorTest, AllowEnumAlias) {
   BuildFile(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Bar\""
-    "  value { name:\"ENUM_A\" number:0 }"
-    "  value { name:\"ENUM_B\" number:0 }"
-    "  options { allow_alias: true }"
-    "}");
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Bar\""
+      "  value { name:\"ENUM_A\" number:0 }"
+      "  value { name:\"ENUM_B\" number:0 }"
+      "  options { allow_alias: true }"
+      "}");
 }
 
 TEST_F(ValidationErrorTest, UnusedImportWarning) {
   pool_.AddUnusedImportTrackFile("bar.proto");
   BuildFile(
-    "name: \"bar.proto\" "
-    "message_type { name: \"Bar\" }");
+      "name: \"bar.proto\" "
+      "message_type { name: \"Bar\" }");
 
   pool_.AddUnusedImportTrackFile("base.proto");
   BuildFile(
-    "name: \"base.proto\" "
-    "message_type { name: \"Base\" }");
+      "name: \"base.proto\" "
+      "message_type { name: \"Base\" }");
 
   pool_.AddUnusedImportTrackFile("baz.proto");
   BuildFile(
-    "name: \"baz.proto\" "
-    "message_type { name: \"Baz\" }");
+      "name: \"baz.proto\" "
+      "message_type { name: \"Baz\" }");
 
   pool_.AddUnusedImportTrackFile("public.proto");
   BuildFile(
-    "name: \"public.proto\" "
-    "dependency: \"bar.proto\""
-    "public_dependency: 0");
+      "name: \"public.proto\" "
+      "dependency: \"bar.proto\""
+      "public_dependency: 0");
 
   // // forward.proto
   // import "base.proto"       // No warning: Base message is used.
@@ -5685,17 +5726,18 @@
   //
   pool_.AddUnusedImportTrackFile("forward.proto");
   BuildFileWithWarnings(
-    "name: \"forward.proto\""
-    "dependency: \"base.proto\""
-    "dependency: \"bar.proto\""
-    "dependency: \"baz.proto\""
-    "dependency: \"public.proto\""
-    "public_dependency: 2 "
-    "message_type {"
-    "  name: \"Forward\""
-    "  field { name:\"base\" number:1 label:LABEL_OPTIONAL type_name:\"Base\" }"
-    "}",
-    "forward.proto: bar.proto: OTHER: Import bar.proto but not used.\n");
+      "name: \"forward.proto\""
+      "dependency: \"base.proto\""
+      "dependency: \"bar.proto\""
+      "dependency: \"baz.proto\""
+      "dependency: \"public.proto\""
+      "public_dependency: 2 "
+      "message_type {"
+      "  name: \"Forward\""
+      "  field { name:\"base\" number:1 label:LABEL_OPTIONAL "
+      "type_name:\"Base\" }"
+      "}",
+      "forward.proto: bar.proto: IMPORT: Import bar.proto but not used.\n");
 }
 
 namespace {
@@ -5726,7 +5768,7 @@
       file_proto));
 }
 static const char* kMapEntryErrorMessage =
-    "foo.proto: Foo.foo_map: OTHER: map_entry should not be set explicitly. "
+    "foo.proto: Foo.foo_map: TYPE: map_entry should not be set explicitly. "
     "Use map<KeyType, ValueType> instead.\n";
 static const char* kMapEntryKeyTypeErrorMessage =
     "foo.proto: Foo.foo_map: TYPE: Key in map fields cannot be float/double, "
@@ -5830,9 +5872,9 @@
 TEST_F(ValidationErrorTest, MapEntryKeyName) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* key = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(0);
+  FieldDescriptorProto* key =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          0);
   key->set_name("Key");
   BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage);
 }
@@ -5840,9 +5882,9 @@
 TEST_F(ValidationErrorTest, MapEntryKeyLabel) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* key = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(0);
+  FieldDescriptorProto* key =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          0);
   key->set_label(FieldDescriptorProto::LABEL_REQUIRED);
   BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage);
 }
@@ -5850,9 +5892,9 @@
 TEST_F(ValidationErrorTest, MapEntryKeyNumber) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* key = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(0);
+  FieldDescriptorProto* key =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          0);
   key->set_number(3);
   BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage);
 }
@@ -5860,9 +5902,9 @@
 TEST_F(ValidationErrorTest, MapEntryValueName) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* value = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(1);
+  FieldDescriptorProto* value =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          1);
   value->set_name("Value");
   BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage);
 }
@@ -5870,9 +5912,9 @@
 TEST_F(ValidationErrorTest, MapEntryValueLabel) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* value = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(1);
+  FieldDescriptorProto* value =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          1);
   value->set_label(FieldDescriptorProto::LABEL_REQUIRED);
   BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage);
 }
@@ -5880,9 +5922,9 @@
 TEST_F(ValidationErrorTest, MapEntryValueNumber) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* value = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(1);
+  FieldDescriptorProto* value =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          1);
   value->set_number(3);
   BuildFileWithErrors(file_proto.DebugString(), kMapEntryErrorMessage);
 }
@@ -5890,9 +5932,9 @@
 TEST_F(ValidationErrorTest, MapEntryKeyTypeFloat) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* key = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(0);
+  FieldDescriptorProto* key =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          0);
   key->set_type(FieldDescriptorProto::TYPE_FLOAT);
   BuildFileWithErrors(file_proto.DebugString(), kMapEntryKeyTypeErrorMessage);
 }
@@ -5900,9 +5942,9 @@
 TEST_F(ValidationErrorTest, MapEntryKeyTypeDouble) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* key = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(0);
+  FieldDescriptorProto* key =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          0);
   key->set_type(FieldDescriptorProto::TYPE_DOUBLE);
   BuildFileWithErrors(file_proto.DebugString(), kMapEntryKeyTypeErrorMessage);
 }
@@ -5910,9 +5952,9 @@
 TEST_F(ValidationErrorTest, MapEntryKeyTypeBytes) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* key = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(0);
+  FieldDescriptorProto* key =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          0);
   key->set_type(FieldDescriptorProto::TYPE_BYTES);
   BuildFileWithErrors(file_proto.DebugString(), kMapEntryKeyTypeErrorMessage);
 }
@@ -5920,9 +5962,9 @@
 TEST_F(ValidationErrorTest, MapEntryKeyTypeEnum) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* key = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(0);
+  FieldDescriptorProto* key =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          0);
   key->clear_type();
   key->set_type_name("BarEnum");
   EnumDescriptorProto* enum_proto = file_proto.add_enum_type();
@@ -5942,13 +5984,12 @@
                       "be enum types.\n");
 }
 
-
 TEST_F(ValidationErrorTest, MapEntryKeyTypeMessage) {
   FileDescriptorProto file_proto;
   FillValidMapEntry(&file_proto);
-  FieldDescriptorProto* key = file_proto.mutable_message_type(0)
-      ->mutable_nested_type(0)
-      ->mutable_field(0);
+  FieldDescriptorProto* key =
+      file_proto.mutable_message_type(0)->mutable_nested_type(0)->mutable_field(
+          0);
   key->clear_type();
   key->set_type_name(".Bar");
   BuildFileWithErrors(file_proto.DebugString(), kMapEntryKeyTypeErrorMessage);
@@ -6130,31 +6171,31 @@
 
 TEST_F(ValidationErrorTest, MapEntryUsesNoneZeroEnumDefaultValue) {
   BuildFileWithErrors(
-    "name: \"foo.proto\" "
-    "enum_type {"
-    "  name: \"Bar\""
-    "  value { name:\"ENUM_A\" number:1 }"
-    "  value { name:\"ENUM_B\" number:2 }"
-    "}"
-    "message_type {"
-    "  name: 'Foo' "
-    "  field { "
-    "    name: 'foo_map' number: 1 label:LABEL_REPEATED "
-    "    type_name: 'FooMapEntry' "
-    "  } "
-    "  nested_type { "
-    "    name: 'FooMapEntry' "
-    "    options {  map_entry: true } "
-    "    field { "
-    "      name: 'key' number: 1 type:TYPE_INT32 label:LABEL_OPTIONAL "
-    "    } "
-    "    field { "
-    "      name: 'value' number: 2 type_name:\"Bar\" label:LABEL_OPTIONAL "
-    "    } "
-    "  } "
-    "}",
-    "foo.proto: Foo.foo_map: "
-    "TYPE: Enum value in map must define 0 as the first value.\n");
+      "name: \"foo.proto\" "
+      "enum_type {"
+      "  name: \"Bar\""
+      "  value { name:\"ENUM_A\" number:1 }"
+      "  value { name:\"ENUM_B\" number:2 }"
+      "}"
+      "message_type {"
+      "  name: 'Foo' "
+      "  field { "
+      "    name: 'foo_map' number: 1 label:LABEL_REPEATED "
+      "    type_name: 'FooMapEntry' "
+      "  } "
+      "  nested_type { "
+      "    name: 'FooMapEntry' "
+      "    options {  map_entry: true } "
+      "    field { "
+      "      name: 'key' number: 1 type:TYPE_INT32 label:LABEL_OPTIONAL "
+      "    } "
+      "    field { "
+      "      name: 'value' number: 2 type_name:\"Bar\" label:LABEL_OPTIONAL "
+      "    } "
+      "  } "
+      "}",
+      "foo.proto: Foo.foo_map: "
+      "TYPE: Enum value in map must define 0 as the first value.\n");
 }
 
 TEST_F(ValidationErrorTest, Proto3RequiredFields) {
@@ -6165,7 +6206,7 @@
       "  name: 'Foo' "
       "  field { name:'foo' number:1 label:LABEL_REQUIRED type:TYPE_INT32 } "
       "}",
-      "foo.proto: Foo.foo: OTHER: Required fields are not allowed in "
+      "foo.proto: Foo.foo: TYPE: Required fields are not allowed in "
       "proto3.\n");
 
   // applied to nested types as well.
@@ -6179,7 +6220,7 @@
       "    field { name:'bar' number:1 label:LABEL_REQUIRED type:TYPE_INT32 } "
       "  } "
       "}",
-      "foo.proto: Foo.Bar.bar: OTHER: Required fields are not allowed in "
+      "foo.proto: Foo.Bar.bar: TYPE: Required fields are not allowed in "
       "proto3.\n");
 
   // optional and repeated fields are OK.
@@ -6202,8 +6243,8 @@
       "  field { name:'foo' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 "
       "          default_value: '1' }"
       "}",
-      "foo.proto: Foo.foo: OTHER: Explicit default values are not allowed in "
-      "proto3.\n");
+      "foo.proto: Foo.foo: DEFAULT_VALUE: Explicit default values are not "
+      "allowed in proto3.\n");
 
   BuildFileWithErrors(
       "name: 'foo.proto' "
@@ -6216,8 +6257,8 @@
       "            default_value: '1' }"
       "  } "
       "}",
-      "foo.proto: Foo.Bar.bar: OTHER: Explicit default values are not allowed "
-      "in proto3.\n");
+      "foo.proto: Foo.Bar.bar: DEFAULT_VALUE: Explicit default values are not "
+      "allowed in proto3.\n");
 }
 
 TEST_F(ValidationErrorTest, ValidateProto3ExtensionRange) {
@@ -6229,7 +6270,7 @@
       "  field { name:'foo' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 } "
       "  extension_range { start:10 end:100 } "
       "}",
-      "foo.proto: Foo: OTHER: Extension ranges are not allowed in "
+      "foo.proto: Foo: NUMBER: Extension ranges are not allowed in "
       "proto3.\n");
 
   BuildFileWithErrors(
@@ -6243,7 +6284,7 @@
       "    extension_range { start:10 end:100 } "
       "  } "
       "}",
-      "foo.proto: Foo.Bar: OTHER: Extension ranges are not allowed in "
+      "foo.proto: Foo.Bar: NUMBER: Extension ranges are not allowed in "
       "proto3.\n");
 }
 
@@ -6255,7 +6296,7 @@
       "  name: 'Foo' "
       "  options { message_set_wire_format: true } "
       "}",
-      "foo.proto: Foo: OTHER: MessageSet is not supported "
+      "foo.proto: Foo: NAME: MessageSet is not supported "
       "in proto3.\n");
 }
 
@@ -6267,7 +6308,7 @@
       "  name: 'FooEnum' "
       "  value { name: 'FOO_FOO' number:1 } "
       "}",
-      "foo.proto: FooEnum: OTHER: The first enum value must be "
+      "foo.proto: FooEnum: NUMBER: The first enum value must be "
       "zero in proto3.\n");
 
   BuildFileWithErrors(
@@ -6280,7 +6321,7 @@
       "    value { name: 'FOO_FOO' number:1 } "
       "  } "
       "}",
-      "foo.proto: Foo.FooEnum: OTHER: The first enum value must be "
+      "foo.proto: Foo.FooEnum: NUMBER: The first enum value must be "
       "zero in proto3.\n");
 
   // valid case.
@@ -6372,7 +6413,7 @@
       "  name: 'bar' number: 1 label: LABEL_OPTIONAL type: TYPE_INT32 "
       "  extendee: 'Container' "
       "}",
-      "bar.proto: bar: OTHER: Extensions in proto3 are only allowed for "
+      "bar.proto: bar: EXTENDEE: Extensions in proto3 are only allowed for "
       "defining options.\n");
 }
 
@@ -6387,7 +6428,7 @@
       "  field { name:'name' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 }"
       "  field { name:'Name' number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }"
       "}",
-      "foo.proto: Foo: OTHER: The JSON camel-case name of field \"Name\" "
+      "foo.proto: Foo: NAME: The JSON camel-case name of field \"Name\" "
       "conflicts with field \"name\". This is not allowed in proto3.\n");
   // Underscores are ignored.
   BuildFileWithErrors(
@@ -6398,7 +6439,7 @@
       "  field { name:'ab' number:1 label:LABEL_OPTIONAL type:TYPE_INT32 }"
       "  field { name:'_a__b_' number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }"
       "}",
-      "foo.proto: Foo: OTHER: The JSON camel-case name of field \"_a__b_\" "
+      "foo.proto: Foo: NAME: The JSON camel-case name of field \"_a__b_\" "
       "conflicts with field \"ab\". This is not allowed in proto3.\n");
 }
 
@@ -6420,24 +6461,26 @@
   SimpleDescriptorDatabase database_;
 
   virtual void SetUp() {
+    AddToDatabase(
+        &database_,
+        "name: 'foo.proto' "
+        "message_type { name:'Foo' extension_range { start: 1 end: 100 } } "
+        "enum_type { name:'TestEnum' value { name:'DUMMY' number:0 } } "
+        "service { name:'TestService' } ");
     AddToDatabase(&database_,
-      "name: 'foo.proto' "
-      "message_type { name:'Foo' extension_range { start: 1 end: 100 } } "
-      "enum_type { name:'TestEnum' value { name:'DUMMY' number:0 } } "
-      "service { name:'TestService' } ");
-    AddToDatabase(&database_,
-      "name: 'bar.proto' "
-      "dependency: 'foo.proto' "
-      "message_type { name:'Bar' } "
-      "extension { name:'foo_ext' extendee: '.Foo' number:5 "
-      "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
+                  "name: 'bar.proto' "
+                  "dependency: 'foo.proto' "
+                  "message_type { name:'Bar' } "
+                  "extension { name:'foo_ext' extendee: '.Foo' number:5 "
+                  "            label:LABEL_OPTIONAL type:TYPE_INT32 } ");
     // Baz has an undeclared dependency on Foo.
-    AddToDatabase(&database_,
-      "name: 'baz.proto' "
-      "message_type { "
-      "  name:'Baz' "
-      "  field { name:'foo' number:1 label:LABEL_OPTIONAL type_name:'Foo' } "
-      "}");
+    AddToDatabase(
+        &database_,
+        "name: 'baz.proto' "
+        "message_type { "
+        "  name:'Baz' "
+        "  field { name:'foo' number:1 label:LABEL_OPTIONAL type_name:'Foo' } "
+        "}");
   }
 
   // We can't inject a file containing errors into a DescriptorPool, so we
@@ -6481,7 +6524,7 @@
   class CallCountingDatabase : public DescriptorDatabase {
    public:
     CallCountingDatabase(DescriptorDatabase* wrapped_db)
-      : wrapped_db_(wrapped_db) {
+        : wrapped_db_(wrapped_db) {
       Clear();
     }
     ~CallCountingDatabase() {}
@@ -6490,9 +6533,7 @@
 
     int call_count_;
 
-    void Clear() {
-      call_count_ = 0;
-    }
+    void Clear() { call_count_ = 0; }
 
     // implements DescriptorDatabase ---------------------------------
     bool FindFileByName(const std::string& filename,
@@ -6509,8 +6550,8 @@
                                      int field_number,
                                      FileDescriptorProto* output) {
       ++call_count_;
-      return wrapped_db_->FindFileContainingExtension(
-        containing_type, field_number, output);
+      return wrapped_db_->FindFileContainingExtension(containing_type,
+                                                      field_number, output);
     }
   };
 
@@ -6520,7 +6561,7 @@
   class FalsePositiveDatabase : public DescriptorDatabase {
    public:
     FalsePositiveDatabase(DescriptorDatabase* wrapped_db)
-      : wrapped_db_(wrapped_db) {}
+        : wrapped_db_(wrapped_db) {}
     ~FalsePositiveDatabase() {}
 
     DescriptorDatabase* wrapped_db_;
@@ -6667,13 +6708,13 @@
 
   EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL);
   EXPECT_EQ(
-    "error.proto: error.proto: OTHER: File recursively imports itself: "
+      "error.proto: error2.proto: IMPORT: File recursively imports itself: "
       "error.proto -> error2.proto -> error.proto\n"
-    "error2.proto: error2.proto: OTHER: Import \"error.proto\" was not "
+      "error2.proto: error.proto: IMPORT: Import \"error.proto\" was not "
       "found or had errors.\n"
-    "error.proto: error.proto: OTHER: Import \"error2.proto\" was not "
+      "error.proto: error2.proto: IMPORT: Import \"error2.proto\" was not "
       "found or had errors.\n",
-    error_collector.text_);
+      error_collector.text_);
 }
 
 TEST_F(DatabaseBackedPoolTest, UndeclaredDependencyOnUnbuiltType) {
@@ -6683,10 +6724,10 @@
   DescriptorPool pool(&database_, &error_collector);
   EXPECT_TRUE(pool.FindMessageTypeByName("Baz") == NULL);
   EXPECT_EQ(
-    "baz.proto: Baz.foo: TYPE: \"Foo\" seems to be defined in \"foo.proto\", "
-    "which is not imported by \"baz.proto\".  To use it here, please add "
-    "the necessary import.\n",
-    error_collector.text_);
+      "baz.proto: Baz.foo: TYPE: \"Foo\" seems to be defined in \"foo.proto\", "
+      "which is not imported by \"baz.proto\".  To use it here, please add "
+      "the necessary import.\n",
+      error_collector.text_);
 }
 
 TEST_F(DatabaseBackedPoolTest, RollbackAfterError) {
@@ -6708,12 +6749,12 @@
   // thoroughly test all paths through DescriptorBuilder to insure that there
   // are no deadlocking problems when pool_->mutex_ is non-NULL.
   const FileDescriptor* original_file =
-    protobuf_unittest::TestAllTypes::descriptor()->file();
+      protobuf_unittest::TestAllTypes::descriptor()->file();
 
   DescriptorPoolDatabase database(*DescriptorPool::generated_pool());
   DescriptorPool pool(&database);
   const FileDescriptor* file_from_database =
-    pool.FindFileByName(original_file->name());
+      pool.FindFileByName(original_file->name());
 
   ASSERT_TRUE(file_from_database != NULL);
 
@@ -6727,8 +6768,7 @@
             file_from_database_proto.DebugString());
 
   // Also verify that CopyTo() did not omit any information.
-  EXPECT_EQ(original_file->DebugString(),
-            file_from_database->DebugString());
+  EXPECT_EQ(original_file->DebugString(), file_from_database->DebugString());
 }
 
 TEST_F(DatabaseBackedPoolTest, DoesntRetryDbUnnecessarily) {
@@ -6844,7 +6884,7 @@
     int begin_size = begin_with.size();
     int end_size = end_with.size();
     if (name.substr(0, begin_size) != begin_with ||
-        name.substr(name.size()- end_size, end_size) != end_with) {
+        name.substr(name.size() - end_size, end_size) != end_with) {
       return;
     }
     safe_strto32(
@@ -6937,8 +6977,9 @@
       : filename_(filename), contents_(contents) {}
 
   virtual io::ZeroCopyInputStream* Open(const std::string& filename) {
-    return filename == filename_ ?
-        new io::ArrayInputStream(contents_.data(), contents_.size()) : NULL;
+    return filename == filename_
+               ? new io::ArrayInputStream(contents_.data(), contents_.size())
+               : NULL;
   }
 
  private:
@@ -7040,10 +7081,8 @@
   }
 
   static std::string PrintSourceLocation(const SourceLocation& loc) {
-    return strings::Substitute("$0:$1-$2:$3",
-                               1 + loc.start_line,
-                               1 + loc.start_column,
-                               1 + loc.end_line,
+    return strings::Substitute("$0:$1-$2:$3", 1 + loc.start_line,
+                               1 + loc.start_column, 1 + loc.end_line,
                                1 + loc.end_column);
   }
 
@@ -7073,27 +7112,27 @@
   const FileDescriptor* file_desc =
       GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto"));
 
-  const Descriptor *a_desc = file_desc->FindMessageTypeByName("A");
+  const Descriptor* a_desc = file_desc->FindMessageTypeByName("A");
   EXPECT_TRUE(a_desc->GetSourceLocation(&loc));
   EXPECT_EQ("4:1-16:2", PrintSourceLocation(loc));
 
-  const Descriptor *a_b_desc = a_desc->FindNestedTypeByName("B");
+  const Descriptor* a_b_desc = a_desc->FindNestedTypeByName("B");
   EXPECT_TRUE(a_b_desc->GetSourceLocation(&loc));
   EXPECT_EQ("7:3-9:4", PrintSourceLocation(loc));
 
-  const EnumDescriptor *e_desc = file_desc->FindEnumTypeByName("Indecision");
+  const EnumDescriptor* e_desc = file_desc->FindEnumTypeByName("Indecision");
   EXPECT_TRUE(e_desc->GetSourceLocation(&loc));
   EXPECT_EQ("17:1-24:2", PrintSourceLocation(loc));
 
-  const EnumValueDescriptor *yes_desc = e_desc->FindValueByName("YES");
+  const EnumValueDescriptor* yes_desc = e_desc->FindValueByName("YES");
   EXPECT_TRUE(yes_desc->GetSourceLocation(&loc));
   EXPECT_EQ("21:3-21:42", PrintSourceLocation(loc));
 
-  const ServiceDescriptor *s_desc = file_desc->FindServiceByName("S");
+  const ServiceDescriptor* s_desc = file_desc->FindServiceByName("S");
   EXPECT_TRUE(s_desc->GetSourceLocation(&loc));
   EXPECT_EQ("25:1-35:2", PrintSourceLocation(loc));
 
-  const MethodDescriptor *m_desc = s_desc->FindMethodByName("Method");
+  const MethodDescriptor* m_desc = s_desc->FindMethodByName("Method");
   EXPECT_TRUE(m_desc->GetSourceLocation(&loc));
   EXPECT_EQ("29:3-29:31", PrintSourceLocation(loc));
 
@@ -7105,16 +7144,16 @@
   const FileDescriptor* file_desc =
       GOOGLE_CHECK_NOTNULL(pool_.FindFileByName("/test/test.proto"));
 
-  const FieldDescriptor *int32_extension_desc =
+  const FieldDescriptor* int32_extension_desc =
       file_desc->FindExtensionByName("int32_extension");
   EXPECT_TRUE(int32_extension_desc->GetSourceLocation(&loc));
   EXPECT_EQ("40:3-40:55", PrintSourceLocation(loc));
 
-  const Descriptor *c_desc = file_desc->FindMessageTypeByName("C");
+  const Descriptor* c_desc = file_desc->FindMessageTypeByName("C");
   EXPECT_TRUE(c_desc->GetSourceLocation(&loc));
   EXPECT_EQ("42:1-46:2", PrintSourceLocation(loc));
 
-  const FieldDescriptor *message_extension_desc =
+  const FieldDescriptor* message_extension_desc =
       c_desc->FindExtensionByName("message_extension");
   EXPECT_TRUE(message_extension_desc->GetSourceLocation(&loc));
   EXPECT_EQ("44:5-44:41", PrintSourceLocation(loc));
@@ -7502,7 +7541,7 @@
   DescriptorPool bad1_pool(&pool_);
   const FileDescriptor* bad1_file_desc =
       GOOGLE_CHECK_NOTNULL(bad1_pool.BuildFile(proto));
-  const Descriptor *bad1_a_desc = bad1_file_desc->FindMessageTypeByName("A");
+  const Descriptor* bad1_a_desc = bad1_file_desc->FindMessageTypeByName("A");
   EXPECT_FALSE(bad1_a_desc->GetSourceLocation(&loc));
 }
 
@@ -7516,7 +7555,7 @@
   FileDescriptorProto proto;
   file_desc->CopyTo(&proto);  // Note, this discards the SourceCodeInfo.
   EXPECT_FALSE(proto.has_source_code_info());
-  SourceCodeInfo_Location *loc_msg =
+  SourceCodeInfo_Location* loc_msg =
       proto.mutable_source_code_info()->add_location();
   loc_msg->add_path(1);
   loc_msg->add_path(2);
@@ -7528,15 +7567,15 @@
   DescriptorPool bad2_pool(&pool_);
   const FileDescriptor* bad2_file_desc =
       GOOGLE_CHECK_NOTNULL(bad2_pool.BuildFile(proto));
-  const Descriptor *bad2_a_desc = bad2_file_desc->FindMessageTypeByName("A");
+  const Descriptor* bad2_a_desc = bad2_file_desc->FindMessageTypeByName("A");
   EXPECT_FALSE(bad2_a_desc->GetSourceLocation(&loc));
 }
 
 // ===================================================================
 
 const char* const kCopySourceCodeInfoToTestInput =
-  "syntax = \"proto2\";\n"
-  "message Foo {}\n";
+    "syntax = \"proto2\";\n"
+    "message Foo {}\n";
 
 // Required since source code information is not preserved by
 // FileDescriptorTest.
diff --git a/src/google/protobuf/duration.pb.cc b/src/google/protobuf/duration.pb.cc
index 7c51bad..2f66112 100644
--- a/src/google/protobuf/duration.pb.cc
+++ b/src/google/protobuf/duration.pb.cc
@@ -36,10 +36,6 @@
 PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Duration_google_2fprotobuf_2fduration_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsDuration_google_2fprotobuf_2fduration_2eproto}, {}};
 
-void InitDefaults_google_2fprotobuf_2fduration_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Duration_google_2fprotobuf_2fduration_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2fduration_2eproto[1];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fduration_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fduration_2eproto = nullptr;
@@ -76,8 +72,7 @@
   "obuf.WellKnownTypesb\006proto3"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fduration_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2fduration_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2fduration_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2fduration_2eproto,
   "google/protobuf/duration.proto", &assign_descriptors_table_google_2fprotobuf_2fduration_2eproto, 227,
 };
 
@@ -85,6 +80,7 @@
   static constexpr ::PROTOBUF_NAMESPACE_ID::internal::InitFunc deps[1] =
   {
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Duration_google_2fprotobuf_2fduration_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2fduration_2eproto, deps, 0);
 }
 
@@ -171,39 +167,45 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Duration::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // int64 seconds = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_seconds(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        seconds_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // int32 nanos = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_nanos(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        nanos_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Duration::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/duration.proto b/src/google/protobuf/duration.proto
index 975fce4..9d8a52d 100644
--- a/src/google/protobuf/duration.proto
+++ b/src/google/protobuf/duration.proto
@@ -101,7 +101,6 @@
 //
 //
 message Duration {
-
   // Signed seconds of the span of time. Must be from -315,576,000,000
   // to +315,576,000,000 inclusive. Note: these bounds are computed from:
   // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
diff --git a/src/google/protobuf/dynamic_message.cc b/src/google/protobuf/dynamic_message.cc
index 44c1fd7..5890f78 100644
--- a/src/google/protobuf/dynamic_message.cc
+++ b/src/google/protobuf/dynamic_message.cc
@@ -82,7 +82,6 @@
 #include <google/protobuf/repeated_field.h>
 #include <google/protobuf/wire_format.h>
 
-
 namespace google {
 namespace protobuf {
 
@@ -100,23 +99,29 @@
 
 namespace {
 
-bool IsMapFieldInApi(const FieldDescriptor* field) {
-  return field->is_map();
-}
+bool IsMapFieldInApi(const FieldDescriptor* field) { return field->is_map(); }
 
 // Compute the byte size of the in-memory representation of the field.
 int FieldSpaceUsed(const FieldDescriptor* field) {
   typedef FieldDescriptor FD;  // avoid line wrapping
   if (field->label() == FD::LABEL_REPEATED) {
     switch (field->cpp_type()) {
-      case FD::CPPTYPE_INT32  : return sizeof(RepeatedField<int32   >);
-      case FD::CPPTYPE_INT64  : return sizeof(RepeatedField<int64   >);
-      case FD::CPPTYPE_UINT32 : return sizeof(RepeatedField<uint32  >);
-      case FD::CPPTYPE_UINT64 : return sizeof(RepeatedField<uint64  >);
-      case FD::CPPTYPE_DOUBLE : return sizeof(RepeatedField<double  >);
-      case FD::CPPTYPE_FLOAT  : return sizeof(RepeatedField<float   >);
-      case FD::CPPTYPE_BOOL   : return sizeof(RepeatedField<bool    >);
-      case FD::CPPTYPE_ENUM   : return sizeof(RepeatedField<int     >);
+      case FD::CPPTYPE_INT32:
+        return sizeof(RepeatedField<int32>);
+      case FD::CPPTYPE_INT64:
+        return sizeof(RepeatedField<int64>);
+      case FD::CPPTYPE_UINT32:
+        return sizeof(RepeatedField<uint32>);
+      case FD::CPPTYPE_UINT64:
+        return sizeof(RepeatedField<uint64>);
+      case FD::CPPTYPE_DOUBLE:
+        return sizeof(RepeatedField<double>);
+      case FD::CPPTYPE_FLOAT:
+        return sizeof(RepeatedField<float>);
+      case FD::CPPTYPE_BOOL:
+        return sizeof(RepeatedField<bool>);
+      case FD::CPPTYPE_ENUM:
+        return sizeof(RepeatedField<int>);
       case FD::CPPTYPE_MESSAGE:
         if (IsMapFieldInApi(field)) {
           return sizeof(DynamicMapField);
@@ -134,14 +139,22 @@
     }
   } else {
     switch (field->cpp_type()) {
-      case FD::CPPTYPE_INT32  : return sizeof(int32   );
-      case FD::CPPTYPE_INT64  : return sizeof(int64   );
-      case FD::CPPTYPE_UINT32 : return sizeof(uint32  );
-      case FD::CPPTYPE_UINT64 : return sizeof(uint64  );
-      case FD::CPPTYPE_DOUBLE : return sizeof(double  );
-      case FD::CPPTYPE_FLOAT  : return sizeof(float   );
-      case FD::CPPTYPE_BOOL   : return sizeof(bool    );
-      case FD::CPPTYPE_ENUM   : return sizeof(int     );
+      case FD::CPPTYPE_INT32:
+        return sizeof(int32);
+      case FD::CPPTYPE_INT64:
+        return sizeof(int64);
+      case FD::CPPTYPE_UINT32:
+        return sizeof(uint32);
+      case FD::CPPTYPE_UINT64:
+        return sizeof(uint64);
+      case FD::CPPTYPE_DOUBLE:
+        return sizeof(double);
+      case FD::CPPTYPE_FLOAT:
+        return sizeof(float);
+      case FD::CPPTYPE_BOOL:
+        return sizeof(bool);
+      case FD::CPPTYPE_ENUM:
+        return sizeof(int);
 
       case FD::CPPTYPE_MESSAGE:
         return sizeof(Message*);
@@ -165,14 +178,22 @@
 int OneofFieldSpaceUsed(const FieldDescriptor* field) {
   typedef FieldDescriptor FD;  // avoid line wrapping
   switch (field->cpp_type()) {
-    case FD::CPPTYPE_INT32  : return sizeof(int32   );
-    case FD::CPPTYPE_INT64  : return sizeof(int64   );
-    case FD::CPPTYPE_UINT32 : return sizeof(uint32  );
-    case FD::CPPTYPE_UINT64 : return sizeof(uint64  );
-    case FD::CPPTYPE_DOUBLE : return sizeof(double  );
-    case FD::CPPTYPE_FLOAT  : return sizeof(float   );
-    case FD::CPPTYPE_BOOL   : return sizeof(bool    );
-    case FD::CPPTYPE_ENUM   : return sizeof(int     );
+    case FD::CPPTYPE_INT32:
+      return sizeof(int32);
+    case FD::CPPTYPE_INT64:
+      return sizeof(int64);
+    case FD::CPPTYPE_UINT32:
+      return sizeof(uint32);
+    case FD::CPPTYPE_UINT64:
+      return sizeof(uint64);
+    case FD::CPPTYPE_DOUBLE:
+      return sizeof(double);
+    case FD::CPPTYPE_FLOAT:
+      return sizeof(float);
+    case FD::CPPTYPE_BOOL:
+      return sizeof(bool);
+    case FD::CPPTYPE_ENUM:
+      return sizeof(int);
 
     case FD::CPPTYPE_MESSAGE:
       return sizeof(Message*);
@@ -190,9 +211,7 @@
   return 0;
 }
 
-inline int DivideRoundingUp(int i, int j) {
-  return (i + (j - 1)) / j;
-}
+inline int DivideRoundingUp(int i, int j) { return (i + (j - 1)) / j; }
 
 static const int kSafeAlignment = sizeof(uint64);
 static const int kMaxOneofUnionSize = sizeof(uint64);
@@ -203,9 +222,7 @@
 
 // Rounds the given byte offset up to the next offset aligned such that any
 // type may be stored at it.
-inline int AlignOffset(int offset) {
-  return AlignTo(offset, kSafeAlignment);
-}
+inline int AlignOffset(int offset) { return AlignTo(offset, kSafeAlignment); }
 
 #define bitsizeof(T) (sizeof(T) * 8)
 
@@ -241,15 +258,13 @@
 
     TypeInfo() : prototype(NULL) {}
 
-    ~TypeInfo() {
-      delete prototype;
-    }
+    ~TypeInfo() { delete prototype; }
   };
 
   DynamicMessage(const TypeInfo* type_info);
 
   // This should only be used by GetPrototypeNoLock() to avoid dead lock.
-  DynamicMessage(const TypeInfo* type_info, bool lock_factory);
+  DynamicMessage(TypeInfo* type_info, bool lock_factory);
 
   ~DynamicMessage();
 
@@ -273,9 +288,7 @@
   // care of for us. This makes DynamicMessage compatible with -fsized-delete.
   // It doesn't work for MSVC though.
 #ifndef _MSC_VER
-  static void operator delete(void* ptr) {
-    ::operator delete(ptr);
-  }
+  static void operator delete(void* ptr) { ::operator delete(ptr); }
 #endif  // !_MSC_VER
 
  private:
@@ -313,8 +326,15 @@
   SharedCtor(true);
 }
 
-DynamicMessage::DynamicMessage(const TypeInfo* type_info, bool lock_factory)
+DynamicMessage::DynamicMessage(TypeInfo* type_info, bool lock_factory)
     : type_info_(type_info), arena_(NULL), cached_byte_size_(0) {
+  // The prototype in type_info has to be set before creating the prototype
+  // instance on memory. e.g., message Foo { map<int32, Foo> a = 1; }. When
+  // creating prototype for Foo, prototype of the map entry will also be
+  // created, which needs the address of the prototype of Foo (the value in
+  // map). To break the cyclic dependency, we have to assign the address of
+  // prototype into type_info first.
+  type_info->prototype = this;
   SharedCtor(lock_factory);
 }
 
@@ -330,7 +350,7 @@
 
   const Descriptor* descriptor = type_info_->type;
   // Initialize oneof cases.
-  for (int i = 0 ; i < descriptor->oneof_decl_count(); ++i) {
+  for (int i = 0; i < descriptor->oneof_decl_count(); ++i) {
     new (OffsetToPointer(type_info_->oneof_case_offset + sizeof(uint32) * i))
         uint32(0);
   }
@@ -357,18 +377,18 @@
     }                                                      \
     break;
 
-      HANDLE_TYPE(INT32 , int32 );
-      HANDLE_TYPE(INT64 , int64 );
+      HANDLE_TYPE(INT32, int32);
+      HANDLE_TYPE(INT64, int64);
       HANDLE_TYPE(UINT32, uint32);
       HANDLE_TYPE(UINT64, uint64);
       HANDLE_TYPE(DOUBLE, double);
-      HANDLE_TYPE(FLOAT , float );
-      HANDLE_TYPE(BOOL  , bool  );
+      HANDLE_TYPE(FLOAT, float);
+      HANDLE_TYPE(BOOL, bool);
 #undef HANDLE_TYPE
 
       case FieldDescriptor::CPPTYPE_ENUM:
         if (!field->is_repeated()) {
-          new(field_ptr) int(field->default_value_enum()->number());
+          new (field_ptr) int(field->default_value_enum()->number());
         } else {
           new (field_ptr) RepeatedField<int>(arena_);
         }
@@ -388,7 +408,7 @@
                                           type_info_->offsets[i]))
                                       ->Get());
               }
-              ArenaStringPtr* asp = new(field_ptr) ArenaStringPtr();
+              ArenaStringPtr* asp = new (field_ptr) ArenaStringPtr();
               asp->UnsafeSetDefault(default_value);
             } else {
               new (field_ptr) RepeatedPtrField<std::string>(arena_);
@@ -399,7 +419,7 @@
 
       case FieldDescriptor::CPPTYPE_MESSAGE: {
         if (!field->is_repeated()) {
-          new(field_ptr) Message*(NULL);
+          new (field_ptr) Message*(NULL);
         } else {
           if (IsMapFieldInApi(field)) {
             // We need to lock in most cases to avoid data racing. Only not lock
@@ -445,7 +465,8 @@
 
   if (type_info_->extensions_offset != -1) {
     reinterpret_cast<ExtensionSet*>(
-      OffsetToPointer(type_info_->extensions_offset))->~ExtensionSet();
+        OffsetToPointer(type_info_->extensions_offset))
+        ->~ExtensionSet();
   }
 
   // We need to manually run the destructors for repeated fields and strings,
@@ -459,13 +480,13 @@
   for (int i = 0; i < descriptor->field_count(); i++) {
     const FieldDescriptor* field = descriptor->field(i);
     if (field->containing_oneof()) {
-      void* field_ptr = OffsetToPointer(
-          type_info_->oneof_case_offset
-          + sizeof(uint32) * field->containing_oneof()->index());
-      if (*(reinterpret_cast<const uint32*>(field_ptr)) ==
-          field->number()) {
-        field_ptr = OffsetToPointer(type_info_->offsets[
-            descriptor->field_count() + field->containing_oneof()->index()]);
+      void* field_ptr =
+          OffsetToPointer(type_info_->oneof_case_offset +
+                          sizeof(uint32) * field->containing_oneof()->index());
+      if (*(reinterpret_cast<const uint32*>(field_ptr)) == field->number()) {
+        field_ptr = OffsetToPointer(
+            type_info_->offsets[descriptor->field_count() +
+                                field->containing_oneof()->index()]);
         if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {
           switch (field->options().ctype()) {
             default:
@@ -490,20 +511,20 @@
 
     if (field->is_repeated()) {
       switch (field->cpp_type()) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
-        case FieldDescriptor::CPPTYPE_##UPPERCASE :                           \
-          reinterpret_cast<RepeatedField<LOWERCASE>*>(field_ptr)              \
-              ->~RepeatedField<LOWERCASE>();                                  \
-          break
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                  \
+  case FieldDescriptor::CPPTYPE_##UPPERCASE:               \
+    reinterpret_cast<RepeatedField<LOWERCASE>*>(field_ptr) \
+        ->~RepeatedField<LOWERCASE>();                     \
+    break
 
-        HANDLE_TYPE( INT32,  int32);
-        HANDLE_TYPE( INT64,  int64);
+        HANDLE_TYPE(INT32, int32);
+        HANDLE_TYPE(INT64, int64);
         HANDLE_TYPE(UINT32, uint32);
         HANDLE_TYPE(UINT64, uint64);
         HANDLE_TYPE(DOUBLE, double);
-        HANDLE_TYPE( FLOAT,  float);
-        HANDLE_TYPE(  BOOL,   bool);
-        HANDLE_TYPE(  ENUM,    int);
+        HANDLE_TYPE(FLOAT, float);
+        HANDLE_TYPE(BOOL, bool);
+        HANDLE_TYPE(ENUM, int);
 #undef HANDLE_TYPE
 
         case FieldDescriptor::CPPTYPE_STRING:
@@ -535,13 +556,13 @@
                     type_info_->prototype->OffsetToPointer(
                         type_info_->offsets[i]))
                     ->Get());
-          reinterpret_cast<ArenaStringPtr*>(field_ptr)->Destroy(
-              default_value, NULL);
+          reinterpret_cast<ArenaStringPtr*>(field_ptr)->Destroy(default_value,
+                                                                NULL);
           break;
         }
       }
     } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
-      if (!is_prototype()) {
+          if (!is_prototype()) {
         Message* message = *reinterpret_cast<Message**>(field_ptr);
         if (message != NULL) {
           delete message;
@@ -569,7 +590,7 @@
       // For singular fields, the field is just a pointer which should
       // point to the prototype.
       *reinterpret_cast<const Message**>(field_ptr) =
-        factory->GetPrototypeNoLock(field->message_type());
+          factory->GetPrototypeNoLock(field->message_type());
     }
   }
 }
@@ -612,20 +633,19 @@
 };
 
 DynamicMessageFactory::DynamicMessageFactory()
-  : pool_(NULL), delegate_to_generated_factory_(false),
-    prototypes_(new PrototypeMap) {
-}
+    : pool_(NULL),
+      delegate_to_generated_factory_(false),
+      prototypes_(new PrototypeMap) {}
 
 DynamicMessageFactory::DynamicMessageFactory(const DescriptorPool* pool)
-  : pool_(pool), delegate_to_generated_factory_(false),
-    prototypes_(new PrototypeMap) {
-}
+    : pool_(pool),
+      delegate_to_generated_factory_(false),
+      prototypes_(new PrototypeMap) {}
 
 DynamicMessageFactory::~DynamicMessageFactory() {
   for (PrototypeMap::Map::iterator iter = prototypes_->map_.begin();
        iter != prototypes_->map_.end(); ++iter) {
-    DeleteDefaultOneofInstance(iter->second->type,
-                               iter->second->offsets.get(),
+    DeleteDefaultOneofInstance(iter->second->type, iter->second->offsets.get(),
                                iter->second->prototype);
     delete iter->second;
   }
@@ -665,8 +685,7 @@
   //   or not that field is set.
 
   // Compute size and offsets.
-  uint32* offsets =
-      new uint32[type->field_count() + type->oneof_decl_count()];
+  uint32* offsets = new uint32[type->field_count() + type->oneof_decl_count()];
   type_info->offsets.reset(offsets);
 
   // Decide all field offsets by packing in order.
@@ -681,7 +700,7 @@
   } else {
     type_info->has_bits_offset = size;
     int has_bits_array_size =
-      DivideRoundingUp(type->field_count(), bitsizeof(uint32));
+        DivideRoundingUp(type->field_count(), bitsizeof(uint32));
     size += has_bits_array_size * sizeof(uint32);
     size = AlignOffset(size);
 
@@ -742,7 +761,6 @@
   // alignment is not necessary.
   type_info->size = size;
 
-
   // Construct the reflection object.
 
   if (type->oneof_decl_count() > 0) {
@@ -763,35 +781,25 @@
   void* base = operator new(size);
   memset(base, 0, size);
 
-  // The prototype in type_info has to be set before creating the prototype
-  // instance on memory. e.g., message Foo { map<int32, Foo> a = 1; }. When
-  // creating prototype for Foo, prototype of the map entry will also be
-  // created, which needs the address of the prototype of Foo (the value in
-  // map). To break the cyclic dependency, we have to assgin the address of
-  // prototype into type_info first.
-  type_info->prototype = static_cast<DynamicMessage*>(base);
-
   // We have already locked the factory so we should not lock in the constructor
   // of dynamic message to avoid dead lock.
   DynamicMessage* prototype = new (base) DynamicMessage(type_info, false);
 
   if (type->oneof_decl_count() > 0 || num_weak_fields > 0) {
     // Construct default oneof instance.
-    ConstructDefaultOneofInstance(type_info->type,
-                                  type_info->offsets.get(),
+    ConstructDefaultOneofInstance(type_info->type, type_info->offsets.get(),
                                   prototype);
   }
 
-  internal::ReflectionSchema schema = {
-      type_info->prototype,
-      type_info->offsets.get(),
-      type_info->has_bits_indices.get(),
-      type_info->has_bits_offset,
-      type_info->internal_metadata_offset,
-      type_info->extensions_offset,
-      type_info->oneof_case_offset,
-      type_info->size,
-      type_info->weak_field_map_offset};
+  internal::ReflectionSchema schema = {type_info->prototype,
+                                       type_info->offsets.get(),
+                                       type_info->has_bits_indices.get(),
+                                       type_info->has_bits_offset,
+                                       type_info->internal_metadata_offset,
+                                       type_info->extensions_offset,
+                                       type_info->oneof_case_offset,
+                                       type_info->size,
+                                       type_info->weak_field_map_offset};
 
   type_info->reflection.reset(new GeneratedMessageReflection(
       type_info->type, schema, type_info->pool, this));
@@ -803,31 +811,31 @@
 }
 
 void DynamicMessageFactory::ConstructDefaultOneofInstance(
-    const Descriptor* type,
-    const uint32 offsets[],
+    const Descriptor* type, const uint32 offsets[],
     void* default_oneof_or_weak_instance) {
   for (int i = 0; i < type->oneof_decl_count(); i++) {
     for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) {
       const FieldDescriptor* field = type->oneof_decl(i)->field(j);
-      void* field_ptr = reinterpret_cast<uint8*>(
-          default_oneof_or_weak_instance) + offsets[field->index()];
+      void* field_ptr =
+          reinterpret_cast<uint8*>(default_oneof_or_weak_instance) +
+          offsets[field->index()];
       switch (field->cpp_type()) {
-#define HANDLE_TYPE(CPPTYPE, TYPE)                                      \
-        case FieldDescriptor::CPPTYPE_##CPPTYPE:                        \
-          new(field_ptr) TYPE(field->default_value_##TYPE());           \
-          break;
+#define HANDLE_TYPE(CPPTYPE, TYPE)                       \
+  case FieldDescriptor::CPPTYPE_##CPPTYPE:               \
+    new (field_ptr) TYPE(field->default_value_##TYPE()); \
+    break;
 
-        HANDLE_TYPE(INT32 , int32 );
-        HANDLE_TYPE(INT64 , int64 );
+        HANDLE_TYPE(INT32, int32);
+        HANDLE_TYPE(INT64, int64);
         HANDLE_TYPE(UINT32, uint32);
         HANDLE_TYPE(UINT64, uint64);
         HANDLE_TYPE(DOUBLE, double);
-        HANDLE_TYPE(FLOAT , float );
-        HANDLE_TYPE(BOOL  , bool  );
+        HANDLE_TYPE(FLOAT, float);
+        HANDLE_TYPE(BOOL, bool);
 #undef HANDLE_TYPE
 
         case FieldDescriptor::CPPTYPE_ENUM:
-          new(field_ptr) int(field->default_value_enum()->number());
+          new (field_ptr) int(field->default_value_enum()->number());
           break;
         case FieldDescriptor::CPPTYPE_STRING:
           switch (field->options().ctype()) {
@@ -840,7 +848,7 @@
           break;
 
         case FieldDescriptor::CPPTYPE_MESSAGE: {
-          new(field_ptr) Message*(NULL);
+          new (field_ptr) Message*(NULL);
           break;
         }
       }
@@ -849,8 +857,7 @@
 }
 
 void DynamicMessageFactory::DeleteDefaultOneofInstance(
-    const Descriptor* type,
-    const uint32 offsets[],
+    const Descriptor* type, const uint32 offsets[],
     const void* default_oneof_instance) {
   for (int i = 0; i < type->oneof_decl_count(); i++) {
     for (int j = 0; j < type->oneof_decl(i)->field_count(); j++) {
diff --git a/src/google/protobuf/dynamic_message.h b/src/google/protobuf/dynamic_message.h
index 1ea6f66..765f9e3 100644
--- a/src/google/protobuf/dynamic_message.h
+++ b/src/google/protobuf/dynamic_message.h
@@ -42,10 +42,10 @@
 #include <memory>
 #include <vector>
 
+#include <google/protobuf/stubs/common.h>
 #include <google/protobuf/message.h>
 #include <google/protobuf/stubs/mutex.h>
 #include <google/protobuf/repeated_field.h>
-#include <google/protobuf/stubs/common.h>
 
 #ifdef SWIG
 #error "You cannot SWIG proto headers"
@@ -57,8 +57,8 @@
 namespace protobuf {
 
 // Defined in other files.
-class Descriptor;        // descriptor.h
-class DescriptorPool;    // descriptor.h
+class Descriptor;      // descriptor.h
+class DescriptorPool;  // descriptor.h
 
 // Constructs implementations of Message which can emulate types which are not
 // known at compile-time.
@@ -155,8 +155,7 @@
 // Helper for computing a sorted list of map entries via reflection.
 class PROTOBUF_EXPORT DynamicMapSorter {
  public:
-  static std::vector<const Message*> Sort(const Message& message,
-                                          int map_size,
+  static std::vector<const Message*> Sort(const Message& message, int map_size,
                                           const Reflection* reflection,
                                           const FieldDescriptor* field) {
     std::vector<const Message*> result(static_cast<size_t>(map_size));
@@ -164,7 +163,8 @@
         reflection->GetRepeatedPtrField<Message>(message, field);
     size_t i = 0;
     for (RepeatedPtrField<Message>::const_pointer_iterator it =
-             map_field.pointer_begin(); it != map_field.pointer_end(); ) {
+             map_field.pointer_begin();
+         it != map_field.pointer_end();) {
       result[i++] = *it++;
     }
     GOOGLE_DCHECK_EQ(result.size(), i);
@@ -174,9 +174,9 @@
 #ifndef NDEBUG
     for (size_t j = 1; j < static_cast<size_t>(map_size); j++) {
       if (!comparator(result[j - 1], result[j])) {
-        GOOGLE_LOG(ERROR) << (comparator(result[j], result[j - 1]) ?
-                      "internal error in map key sorting" :
-                      "map keys are not unique");
+        GOOGLE_LOG(ERROR) << (comparator(result[j], result[j - 1])
+                           ? "internal error in map key sorting"
+                           : "map keys are not unique");
       }
     }
 #endif
diff --git a/src/google/protobuf/dynamic_message_unittest.cc b/src/google/protobuf/dynamic_message_unittest.cc
index e96f658..42759de 100644
--- a/src/google/protobuf/dynamic_message_unittest.cc
+++ b/src/google/protobuf/dynamic_message_unittest.cc
@@ -72,7 +72,7 @@
   const Descriptor* proto3_descriptor_;
   const Message* proto3_prototype_;
 
-  DynamicMessageTest(): factory_(&pool_) {}
+  DynamicMessageTest() : factory_(&pool_) {}
 
   virtual void SetUp() {
     // We want to make sure that DynamicMessage works (particularly with
@@ -86,11 +86,11 @@
 
     unittest::TestAllTypes::descriptor()->file()->CopyTo(&unittest_file);
     unittest_import::ImportMessage::descriptor()->file()->CopyTo(
-      &unittest_import_file);
+        &unittest_import_file);
     unittest_import::PublicImportMessage::descriptor()->file()->CopyTo(
-      &unittest_import_public_file);
-    proto2_nofieldpresence_unittest::TestAllTypes::descriptor()->
-        file()->CopyTo(&unittest_no_field_presence_file);
+        &unittest_import_public_file);
+    proto2_nofieldpresence_unittest::TestAllTypes::descriptor()->file()->CopyTo(
+        &unittest_no_field_presence_file);
 
     ASSERT_TRUE(pool_.BuildFile(unittest_import_public_file) != NULL);
     ASSERT_TRUE(pool_.BuildFile(unittest_import_file) != NULL);
@@ -102,23 +102,22 @@
     prototype_ = factory_.GetPrototype(descriptor_);
 
     extensions_descriptor_ =
-      pool_.FindMessageTypeByName("protobuf_unittest.TestAllExtensions");
+        pool_.FindMessageTypeByName("protobuf_unittest.TestAllExtensions");
     ASSERT_TRUE(extensions_descriptor_ != NULL);
     extensions_prototype_ = factory_.GetPrototype(extensions_descriptor_);
 
     packed_descriptor_ =
-      pool_.FindMessageTypeByName("protobuf_unittest.TestPackedTypes");
+        pool_.FindMessageTypeByName("protobuf_unittest.TestPackedTypes");
     ASSERT_TRUE(packed_descriptor_ != NULL);
     packed_prototype_ = factory_.GetPrototype(packed_descriptor_);
 
     oneof_descriptor_ =
-      pool_.FindMessageTypeByName("protobuf_unittest.TestOneof2");
+        pool_.FindMessageTypeByName("protobuf_unittest.TestOneof2");
     ASSERT_TRUE(oneof_descriptor_ != NULL);
     oneof_prototype_ = factory_.GetPrototype(oneof_descriptor_);
 
-    proto3_descriptor_ =
-      pool_.FindMessageTypeByName(
-          "proto2_nofieldpresence_unittest.TestAllTypes");
+    proto3_descriptor_ = pool_.FindMessageTypeByName(
+        "proto2_nofieldpresence_unittest.TestAllTypes");
     ASSERT_TRUE(proto3_descriptor_ != NULL);
     proto3_prototype_ = factory_.GetPrototype(proto3_descriptor_);
   }
@@ -146,7 +145,7 @@
   // one to a unique value then checking that they all still have those
   // unique values (i.e. they don't stomp each other).
   Arena arena;
-  Message* message = prototype_->New(GetParam()? &arena : NULL);
+  Message* message = prototype_->New(GetParam() ? &arena : NULL);
   TestUtil::ReflectionTester reflection_tester(descriptor_);
 
   reflection_tester.SetAllFieldsViaReflection(message);
@@ -160,7 +159,7 @@
 TEST_P(DynamicMessageTest, Extensions) {
   // Check that extensions work.
   Arena arena;
-  Message* message = extensions_prototype_->New(GetParam()? &arena : NULL);
+  Message* message = extensions_prototype_->New(GetParam() ? &arena : NULL);
   TestUtil::ReflectionTester reflection_tester(extensions_descriptor_);
 
   reflection_tester.SetAllFieldsViaReflection(message);
@@ -174,7 +173,7 @@
 TEST_P(DynamicMessageTest, PackedFields) {
   // Check that packed fields work properly.
   Arena arena;
-  Message* message = packed_prototype_->New(GetParam()? &arena : NULL);
+  Message* message = packed_prototype_->New(GetParam() ? &arena : NULL);
   TestUtil::ReflectionTester reflection_tester(packed_descriptor_);
 
   reflection_tester.SetPackedFieldsViaReflection(message);
@@ -188,23 +187,25 @@
 TEST_P(DynamicMessageTest, Oneof) {
   // Check that oneof fields work properly.
   Arena arena;
-  Message* message = oneof_prototype_->New(GetParam()? &arena : NULL);
+  Message* message = oneof_prototype_->New(GetParam() ? &arena : NULL);
 
   // Check default values.
   const Descriptor* descriptor = message->GetDescriptor();
   const Reflection* reflection = message->GetReflection();
-  EXPECT_EQ(0, reflection->GetInt32(
-      *message, descriptor->FindFieldByName("foo_int")));
+  EXPECT_EQ(0, reflection->GetInt32(*message,
+                                    descriptor->FindFieldByName("foo_int")));
   EXPECT_EQ("", reflection->GetString(
-      *message, descriptor->FindFieldByName("foo_string")));
+                    *message, descriptor->FindFieldByName("foo_string")));
+  EXPECT_EQ("", reflection->GetString(*message,
+                                      descriptor->FindFieldByName("foo_cord")));
   EXPECT_EQ("", reflection->GetString(
-      *message, descriptor->FindFieldByName("foo_cord")));
+                    *message, descriptor->FindFieldByName("foo_string_piece")));
   EXPECT_EQ("", reflection->GetString(
-      *message, descriptor->FindFieldByName("foo_string_piece")));
-  EXPECT_EQ("", reflection->GetString(
-      *message, descriptor->FindFieldByName("foo_bytes")));
-  EXPECT_EQ(unittest::TestOneof2::FOO, reflection->GetEnum(
-      *message, descriptor->FindFieldByName("foo_enum"))->number());
+                    *message, descriptor->FindFieldByName("foo_bytes")));
+  EXPECT_EQ(
+      unittest::TestOneof2::FOO,
+      reflection->GetEnum(*message, descriptor->FindFieldByName("foo_enum"))
+          ->number());
   const Descriptor* nested_descriptor;
   const Message* nested_prototype;
   nested_descriptor =
@@ -219,23 +220,26 @@
       pool_.FindMessageTypeByName("protobuf_unittest.TestOneof2.FooGroup");
   foogroup_prototype = factory_.GetPrototype(foogroup_descriptor);
   EXPECT_EQ(foogroup_prototype,
-            &reflection->GetMessage(
-                *message, descriptor->FindFieldByName("foogroup")));
+            &reflection->GetMessage(*message,
+                                    descriptor->FindFieldByName("foogroup")));
   EXPECT_NE(foogroup_prototype,
             &reflection->GetMessage(
                 *message, descriptor->FindFieldByName("foo_lazy_message")));
-  EXPECT_EQ(5, reflection->GetInt32(
-      *message, descriptor->FindFieldByName("bar_int")));
+  EXPECT_EQ(5, reflection->GetInt32(*message,
+                                    descriptor->FindFieldByName("bar_int")));
   EXPECT_EQ("STRING", reflection->GetString(
-      *message, descriptor->FindFieldByName("bar_string")));
+                          *message, descriptor->FindFieldByName("bar_string")));
   EXPECT_EQ("CORD", reflection->GetString(
-      *message, descriptor->FindFieldByName("bar_cord")));
-  EXPECT_EQ("SPIECE", reflection->GetString(
-      *message, descriptor->FindFieldByName("bar_string_piece")));
+                        *message, descriptor->FindFieldByName("bar_cord")));
+  EXPECT_EQ("SPIECE",
+            reflection->GetString(
+                *message, descriptor->FindFieldByName("bar_string_piece")));
   EXPECT_EQ("BYTES", reflection->GetString(
-      *message, descriptor->FindFieldByName("bar_bytes")));
-  EXPECT_EQ(unittest::TestOneof2::BAR, reflection->GetEnum(
-      *message, descriptor->FindFieldByName("bar_enum"))->number());
+                         *message, descriptor->FindFieldByName("bar_bytes")));
+  EXPECT_EQ(
+      unittest::TestOneof2::BAR,
+      reflection->GetEnum(*message, descriptor->FindFieldByName("bar_enum"))
+          ->number());
 
   // Check set functions.
   TestUtil::ReflectionTester reflection_tester(oneof_descriptor_);
@@ -254,7 +258,7 @@
   // to test very much here.  Just make sure it appears to be working.
 
   Arena arena;
-  Message* message = prototype_->New(GetParam()? &arena : NULL);
+  Message* message = prototype_->New(GetParam() ? &arena : NULL);
   TestUtil::ReflectionTester reflection_tester(descriptor_);
 
   int initial_space_used = message->SpaceUsed();
diff --git a/src/google/protobuf/empty.pb.cc b/src/google/protobuf/empty.pb.cc
index 57b8fe8..c10bf94 100644
--- a/src/google/protobuf/empty.pb.cc
+++ b/src/google/protobuf/empty.pb.cc
@@ -36,10 +36,6 @@
 PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Empty_google_2fprotobuf_2fempty_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsEmpty_google_2fprotobuf_2fempty_2eproto}, {}};
 
-void InitDefaults_google_2fprotobuf_2fempty_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Empty_google_2fprotobuf_2fempty_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2fempty_2eproto[1];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fempty_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fempty_2eproto = nullptr;
@@ -73,8 +69,7 @@
   ".WellKnownTypesb\006proto3"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fempty_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2fempty_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2fempty_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2fempty_2eproto,
   "google/protobuf/empty.proto", &assign_descriptors_table_google_2fprotobuf_2fempty_2eproto, 183,
 };
 
@@ -82,6 +77,7 @@
   static constexpr ::PROTOBUF_NAMESPACE_ID::internal::InitFunc deps[1] =
   {
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Empty_google_2fprotobuf_2fempty_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2fempty_2eproto, deps, 0);
 }
 
@@ -157,24 +153,30 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Empty::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       default: {
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Empty::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/extension_set.cc b/src/google/protobuf/extension_set.cc
index d0a63b9..67b0fca 100644
--- a/src/google/protobuf/extension_set.cc
+++ b/src/google/protobuf/extension_set.cc
@@ -76,8 +76,8 @@
     case WireFormatLite::WIRETYPE_END_GROUP:
       return false;
 
-    // Do not add a default statement. Let the compiler complain when someone
-    // adds a new wire type.
+      // Do not add a default statement. Let the compiler complain when someone
+      // adds a new wire type.
   }
   GOOGLE_LOG(FATAL) << "can't reach here.";
   return false;
@@ -99,20 +99,20 @@
 
 // This function is only called at startup, so there is no need for thread-
 // safety.
-void Register(const MessageLite* containing_type,
-              int number, ExtensionInfo info) {
+void Register(const MessageLite* containing_type, int number,
+              ExtensionInfo info) {
   static auto local_static_registry = OnShutdownDelete(new ExtensionRegistry);
   global_registry = local_static_registry;
   if (!InsertIfNotPresent(local_static_registry,
                                std::make_pair(containing_type, number), info)) {
     GOOGLE_LOG(FATAL) << "Multiple extension registrations for type \""
-               << containing_type->GetTypeName()
-               << "\", field number " << number << ".";
+               << containing_type->GetTypeName() << "\", field number "
+               << number << ".";
   }
 }
 
-const ExtensionInfo* FindRegisteredExtension(
-    const MessageLite* containing_type, int number) {
+const ExtensionInfo* FindRegisteredExtension(const MessageLite* containing_type,
+                                             int number) {
   return global_registry == nullptr
              ? nullptr
              : FindOrNull(*global_registry,
@@ -212,8 +212,8 @@
   }
 }
 
-void ExtensionSet::DeleteFlatMap(
-    const ExtensionSet::KeyValue* flat, uint16 flat_capacity) {
+void ExtensionSet::DeleteFlatMap(const ExtensionSet::KeyValue* flat,
+                                 uint16 flat_capacity) {
 #ifdef __cpp_sized_deallocation
   // Arena::CreateArray already requires a trivially destructible type, but
   // ensure this constraint is not violated in the future.
@@ -221,9 +221,9 @@
                 "CreateArray requires a trivially destructible type");
   // A const-cast is needed, but this is safe as we are about to deallocate the
   // array.
-  ::operator delete[](
-      const_cast<ExtensionSet::KeyValue*>(flat), sizeof(*flat) * flat_capacity);
-#else  // !__cpp_sized_deallocation
+  ::operator delete[](const_cast<ExtensionSet::KeyValue*>(flat),
+                      sizeof(*flat) * flat_capacity);
+#else   // !__cpp_sized_deallocation
   delete[] flat;
 #endif  // !__cpp_sized_deallocation
 }
@@ -278,10 +278,7 @@
 
 namespace {
 
-enum {
-  REPEATED_FIELD,
-  OPTIONAL_FIELD
-};
+enum { REPEATED_FIELD, OPTIONAL_FIELD };
 
 }  // namespace
 
@@ -292,74 +289,77 @@
 // -------------------------------------------------------------------
 // Primitives
 
-#define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE)                   \
-                                                                               \
-LOWERCASE ExtensionSet::Get##CAMELCASE(int number,                             \
-                                       LOWERCASE default_value) const {        \
-  const Extension* extension = FindOrNull(number);                             \
-  if (extension == NULL || extension->is_cleared) {                            \
-    return default_value;                                                      \
-  } else {                                                                     \
-    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE);                        \
-    return extension->LOWERCASE##_value;                                       \
-  }                                                                            \
-}                                                                              \
-                                                                               \
-void ExtensionSet::Set##CAMELCASE(int number, FieldType type,                  \
-                                  LOWERCASE value,                             \
-                                  const FieldDescriptor* descriptor) {         \
-  Extension* extension;                                                        \
-  if (MaybeNewExtension(number, descriptor, &extension)) {                     \
-    extension->type = type;                                                    \
-    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \
-    extension->is_repeated = false;                                            \
-  } else {                                                                     \
-    GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE);                        \
-  }                                                                            \
-  extension->is_cleared = false;                                               \
-  extension->LOWERCASE##_value = value;                                        \
-}                                                                              \
-                                                                               \
-LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const {  \
-  const Extension* extension = FindOrNull(number);                             \
-  GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";         \
-  GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE);                          \
-  return extension->repeated_##LOWERCASE##_value->Get(index);                  \
-}                                                                              \
-                                                                               \
-void ExtensionSet::SetRepeated##CAMELCASE(                                     \
-    int number, int index, LOWERCASE value) {                                  \
-  Extension* extension = FindOrNull(number);                                   \
-  GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";         \
-  GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE);                          \
-  extension->repeated_##LOWERCASE##_value->Set(index, value);                  \
-}                                                                              \
-                                                                               \
-void ExtensionSet::Add##CAMELCASE(int number, FieldType type,                  \
-                                  bool packed, LOWERCASE value,                \
-                                  const FieldDescriptor* descriptor) {         \
-  Extension* extension;                                                        \
-  if (MaybeNewExtension(number, descriptor, &extension)) {                     \
-    extension->type = type;                                                    \
-    GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \
-    extension->is_repeated = true;                                             \
-    extension->is_packed = packed;                                             \
-    extension->repeated_##LOWERCASE##_value =                                  \
-      Arena::CreateMessage<RepeatedField<LOWERCASE> >(arena_);                 \
-  } else {                                                                     \
-    GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE);                        \
-    GOOGLE_DCHECK_EQ(extension->is_packed, packed);                                   \
-  }                                                                            \
-  extension->repeated_##LOWERCASE##_value->Add(value);                         \
-}
+#define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE)                  \
+                                                                              \
+  LOWERCASE ExtensionSet::Get##CAMELCASE(int number, LOWERCASE default_value) \
+      const {                                                                 \
+    const Extension* extension = FindOrNull(number);                          \
+    if (extension == NULL || extension->is_cleared) {                         \
+      return default_value;                                                   \
+    } else {                                                                  \
+      GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE);                     \
+      return extension->LOWERCASE##_value;                                    \
+    }                                                                         \
+  }                                                                           \
+                                                                              \
+  void ExtensionSet::Set##CAMELCASE(int number, FieldType type,               \
+                                    LOWERCASE value,                          \
+                                    const FieldDescriptor* descriptor) {      \
+    Extension* extension;                                                     \
+    if (MaybeNewExtension(number, descriptor, &extension)) {                  \
+      extension->type = type;                                                 \
+      GOOGLE_DCHECK_EQ(cpp_type(extension->type),                                    \
+                WireFormatLite::CPPTYPE_##UPPERCASE);                         \
+      extension->is_repeated = false;                                         \
+    } else {                                                                  \
+      GOOGLE_DCHECK_TYPE(*extension, OPTIONAL_FIELD, UPPERCASE);                     \
+    }                                                                         \
+    extension->is_cleared = false;                                            \
+    extension->LOWERCASE##_value = value;                                     \
+  }                                                                           \
+                                                                              \
+  LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index)       \
+      const {                                                                 \
+    const Extension* extension = FindOrNull(number);                          \
+    GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";      \
+    GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE);                       \
+    return extension->repeated_##LOWERCASE##_value->Get(index);               \
+  }                                                                           \
+                                                                              \
+  void ExtensionSet::SetRepeated##CAMELCASE(int number, int index,            \
+                                            LOWERCASE value) {                \
+    Extension* extension = FindOrNull(number);                                \
+    GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";      \
+    GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE);                       \
+    extension->repeated_##LOWERCASE##_value->Set(index, value);               \
+  }                                                                           \
+                                                                              \
+  void ExtensionSet::Add##CAMELCASE(int number, FieldType type, bool packed,  \
+                                    LOWERCASE value,                          \
+                                    const FieldDescriptor* descriptor) {      \
+    Extension* extension;                                                     \
+    if (MaybeNewExtension(number, descriptor, &extension)) {                  \
+      extension->type = type;                                                 \
+      GOOGLE_DCHECK_EQ(cpp_type(extension->type),                                    \
+                WireFormatLite::CPPTYPE_##UPPERCASE);                         \
+      extension->is_repeated = true;                                          \
+      extension->is_packed = packed;                                          \
+      extension->repeated_##LOWERCASE##_value =                               \
+          Arena::CreateMessage<RepeatedField<LOWERCASE>>(arena_);             \
+    } else {                                                                  \
+      GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, UPPERCASE);                     \
+      GOOGLE_DCHECK_EQ(extension->is_packed, packed);                                \
+    }                                                                         \
+    extension->repeated_##LOWERCASE##_value->Add(value);                      \
+  }
 
-PRIMITIVE_ACCESSORS( INT32,  int32,  Int32)
-PRIMITIVE_ACCESSORS( INT64,  int64,  Int64)
+PRIMITIVE_ACCESSORS(INT32, int32, Int32)
+PRIMITIVE_ACCESSORS(INT64, int64, Int64)
 PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32)
 PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64)
-PRIMITIVE_ACCESSORS( FLOAT,  float,  Float)
+PRIMITIVE_ACCESSORS(FLOAT, float, Float)
 PRIMITIVE_ACCESSORS(DOUBLE, double, Double)
-PRIMITIVE_ACCESSORS(  BOOL,   bool,   Bool)
+PRIMITIVE_ACCESSORS(BOOL, bool, Bool)
 
 #undef PRIMITIVE_ACCESSORS
 
@@ -390,35 +390,35 @@
         static_cast<WireFormatLite::FieldType>(field_type))) {
       case WireFormatLite::CPPTYPE_INT32:
         extension->repeated_int32_value =
-            Arena::CreateMessage<RepeatedField<int32> >(arena_);
+            Arena::CreateMessage<RepeatedField<int32>>(arena_);
         break;
       case WireFormatLite::CPPTYPE_INT64:
         extension->repeated_int64_value =
-            Arena::CreateMessage<RepeatedField<int64> >(arena_);
+            Arena::CreateMessage<RepeatedField<int64>>(arena_);
         break;
       case WireFormatLite::CPPTYPE_UINT32:
         extension->repeated_uint32_value =
-            Arena::CreateMessage<RepeatedField<uint32> >(arena_);
+            Arena::CreateMessage<RepeatedField<uint32>>(arena_);
         break;
       case WireFormatLite::CPPTYPE_UINT64:
         extension->repeated_uint64_value =
-            Arena::CreateMessage<RepeatedField<uint64> >(arena_);
+            Arena::CreateMessage<RepeatedField<uint64>>(arena_);
         break;
       case WireFormatLite::CPPTYPE_DOUBLE:
         extension->repeated_double_value =
-            Arena::CreateMessage<RepeatedField<double> >(arena_);
+            Arena::CreateMessage<RepeatedField<double>>(arena_);
         break;
       case WireFormatLite::CPPTYPE_FLOAT:
         extension->repeated_float_value =
-            Arena::CreateMessage<RepeatedField<float> >(arena_);
+            Arena::CreateMessage<RepeatedField<float>>(arena_);
         break;
       case WireFormatLite::CPPTYPE_BOOL:
         extension->repeated_bool_value =
-            Arena::CreateMessage<RepeatedField<bool> >(arena_);
+            Arena::CreateMessage<RepeatedField<bool>>(arena_);
         break;
       case WireFormatLite::CPPTYPE_ENUM:
         extension->repeated_enum_value =
-            Arena::CreateMessage<RepeatedField<int> >(arena_);
+            Arena::CreateMessage<RepeatedField<int>>(arena_);
         break;
       case WireFormatLite::CPPTYPE_STRING:
         extension->repeated_string_value =
@@ -426,7 +426,7 @@
         break;
       case WireFormatLite::CPPTYPE_MESSAGE:
         extension->repeated_message_value =
-            Arena::CreateMessage<RepeatedPtrField<MessageLite> >(arena_);
+            Arena::CreateMessage<RepeatedPtrField<MessageLite>>(arena_);
         break;
     }
   }
@@ -446,7 +446,6 @@
   return extension->repeated_int32_value;
 }
 
-
 // -------------------------------------------------------------------
 // Enums
 
@@ -489,8 +488,7 @@
   extension->repeated_enum_value->Set(index, value);
 }
 
-void ExtensionSet::AddEnum(int number, FieldType type,
-                           bool packed, int value,
+void ExtensionSet::AddEnum(int number, FieldType type, bool packed, int value,
                            const FieldDescriptor* descriptor) {
   Extension* extension;
   if (MaybeNewExtension(number, descriptor, &extension)) {
@@ -499,7 +497,7 @@
     extension->is_repeated = true;
     extension->is_packed = packed;
     extension->repeated_enum_value =
-        Arena::CreateMessage<RepeatedField<int> >(arena_);
+        Arena::CreateMessage<RepeatedField<int>>(arena_);
   } else {
     GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, ENUM);
     GOOGLE_DCHECK_EQ(extension->is_packed, packed);
@@ -748,8 +746,8 @@
 // MessageLite* ExtensionSet::ReleaseMessage(const FieldDescriptor* descriptor,
 //                                           MessageFactory* factory);
 
-const MessageLite& ExtensionSet::GetRepeatedMessage(
-    int number, int index) const {
+const MessageLite& ExtensionSet::GetRepeatedMessage(int number,
+                                                    int index) const {
   const Extension* extension = FindOrNull(number);
   GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
   GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, MESSAGE);
@@ -772,7 +770,7 @@
     GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE);
     extension->is_repeated = true;
     extension->repeated_message_value =
-        Arena::CreateMessage<RepeatedPtrField<MessageLite> >(arena_);
+        Arena::CreateMessage<RepeatedPtrField<MessageLite>>(arena_);
   } else {
     GOOGLE_DCHECK_TYPE(*extension, REPEATED_FIELD, MESSAGE);
   }
@@ -801,7 +799,7 @@
   GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
   GOOGLE_DCHECK(extension->is_repeated);
 
-  switch(cpp_type(extension->type)) {
+  switch (cpp_type(extension->type)) {
     case WireFormatLite::CPPTYPE_INT32:
       extension->repeated_int32_value->RemoveLast();
       break;
@@ -848,7 +846,7 @@
   GOOGLE_CHECK(extension != NULL) << "Index out-of-bounds (field is empty).";
   GOOGLE_DCHECK(extension->is_repeated);
 
-  switch(cpp_type(extension->type)) {
+  switch (cpp_type(extension->type)) {
     case WireFormatLite::CPPTYPE_INT32:
       extension->repeated_int32_value->SwapElements(index1, index2);
       break;
@@ -927,11 +925,11 @@
 }
 
 void ExtensionSet::InternalExtensionMergeFrom(
-  int number, const Extension& other_extension) {
+    int number, const Extension& other_extension) {
   if (other_extension.is_repeated) {
     Extension* extension;
-    bool is_new = MaybeNewExtension(number, other_extension.descriptor,
-                                    &extension);
+    bool is_new =
+        MaybeNewExtension(number, other_extension.descriptor, &extension);
     if (is_new) {
       // Extension did not already exist in set.
       extension->type = other_extension.type;
@@ -944,31 +942,31 @@
     }
 
     switch (cpp_type(other_extension.type)) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE)                    \
-      case WireFormatLite::CPPTYPE_##UPPERCASE:                             \
-        if (is_new) {                                                       \
-          extension->repeated_##LOWERCASE##_value =                         \
-            Arena::CreateMessage<REPEATED_TYPE >(arena_);                   \
-        }                                                                   \
-        extension->repeated_##LOWERCASE##_value->MergeFrom(                 \
-          *other_extension.repeated_##LOWERCASE##_value);                   \
-        break;
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE) \
+  case WireFormatLite::CPPTYPE_##UPPERCASE:              \
+    if (is_new) {                                        \
+      extension->repeated_##LOWERCASE##_value =          \
+          Arena::CreateMessage<REPEATED_TYPE>(arena_);   \
+    }                                                    \
+    extension->repeated_##LOWERCASE##_value->MergeFrom(  \
+        *other_extension.repeated_##LOWERCASE##_value);  \
+    break;
 
-      HANDLE_TYPE(  INT32,   int32, RepeatedField   <  int32>);
-      HANDLE_TYPE(  INT64,   int64, RepeatedField   <  int64>);
-      HANDLE_TYPE( UINT32,  uint32, RepeatedField   < uint32>);
-      HANDLE_TYPE( UINT64,  uint64, RepeatedField   < uint64>);
-      HANDLE_TYPE(  FLOAT,   float, RepeatedField   <  float>);
-      HANDLE_TYPE( DOUBLE,  double, RepeatedField   < double>);
-      HANDLE_TYPE(   BOOL,    bool, RepeatedField   <   bool>);
-      HANDLE_TYPE(   ENUM,    enum, RepeatedField   <    int>);
+      HANDLE_TYPE(INT32, int32, RepeatedField<int32>);
+      HANDLE_TYPE(INT64, int64, RepeatedField<int64>);
+      HANDLE_TYPE(UINT32, uint32, RepeatedField<uint32>);
+      HANDLE_TYPE(UINT64, uint64, RepeatedField<uint64>);
+      HANDLE_TYPE(FLOAT, float, RepeatedField<float>);
+      HANDLE_TYPE(DOUBLE, double, RepeatedField<double>);
+      HANDLE_TYPE(BOOL, bool, RepeatedField<bool>);
+      HANDLE_TYPE(ENUM, enum, RepeatedField<int>);
       HANDLE_TYPE(STRING, string, RepeatedPtrField<std::string>);
 #undef HANDLE_TYPE
 
       case WireFormatLite::CPPTYPE_MESSAGE:
         if (is_new) {
           extension->repeated_message_value =
-              Arena::CreateMessage<RepeatedPtrField<MessageLite> >(arena_);
+              Arena::CreateMessage<RepeatedPtrField<MessageLite>>(arena_);
         }
         // We can't call RepeatedPtrField<MessageLite>::MergeFrom() because
         // it would attempt to allocate new objects.
@@ -991,32 +989,30 @@
   } else {
     if (!other_extension.is_cleared) {
       switch (cpp_type(other_extension.type)) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE)                       \
-        case WireFormatLite::CPPTYPE_##UPPERCASE:                          \
-          Set##CAMELCASE(number, other_extension.type,                     \
-                         other_extension.LOWERCASE##_value,                \
-                         other_extension.descriptor);                      \
-          break;
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE)  \
+  case WireFormatLite::CPPTYPE_##UPPERCASE:           \
+    Set##CAMELCASE(number, other_extension.type,      \
+                   other_extension.LOWERCASE##_value, \
+                   other_extension.descriptor);       \
+    break;
 
-        HANDLE_TYPE( INT32,  int32,  Int32);
-        HANDLE_TYPE( INT64,  int64,  Int64);
+        HANDLE_TYPE(INT32, int32, Int32);
+        HANDLE_TYPE(INT64, int64, Int64);
         HANDLE_TYPE(UINT32, uint32, UInt32);
         HANDLE_TYPE(UINT64, uint64, UInt64);
-        HANDLE_TYPE( FLOAT,  float,  Float);
+        HANDLE_TYPE(FLOAT, float, Float);
         HANDLE_TYPE(DOUBLE, double, Double);
-        HANDLE_TYPE(  BOOL,   bool,   Bool);
-        HANDLE_TYPE(  ENUM,   enum,   Enum);
+        HANDLE_TYPE(BOOL, bool, Bool);
+        HANDLE_TYPE(ENUM, enum, Enum);
 #undef HANDLE_TYPE
         case WireFormatLite::CPPTYPE_STRING:
-          SetString(number, other_extension.type,
-                    *other_extension.string_value,
+          SetString(number, other_extension.type, *other_extension.string_value,
                     other_extension.descriptor);
           break;
         case WireFormatLite::CPPTYPE_MESSAGE: {
           Extension* extension;
-          bool is_new = MaybeNewExtension(number,
-                                          other_extension.descriptor,
-                                          &extension);
+          bool is_new =
+              MaybeNewExtension(number, other_extension.descriptor, &extension);
           if (is_new) {
             extension->type = other_extension.type;
             extension->is_packed = other_extension.is_packed;
@@ -1036,7 +1032,7 @@
             }
           } else {
             GOOGLE_DCHECK_EQ(extension->type, other_extension.type);
-            GOOGLE_DCHECK_EQ(extension->is_packed,other_extension.is_packed);
+            GOOGLE_DCHECK_EQ(extension->is_packed, other_extension.is_packed);
             GOOGLE_DCHECK(!extension->is_repeated);
             if (other_extension.is_lazy) {
               if (extension->is_lazy) {
@@ -1049,9 +1045,9 @@
               }
             } else {
               if (extension->is_lazy) {
-                extension->lazymessage_value->MutableMessage(
-                    *other_extension.message_value)->CheckTypeAndMergeFrom(
-                        *other_extension.message_value);
+                extension->lazymessage_value
+                    ->MutableMessage(*other_extension.message_value)
+                    ->CheckTypeAndMergeFrom(*other_extension.message_value);
               } else {
                 extension->message_value->CheckTypeAndMergeFrom(
                     *other_extension.message_value);
@@ -1085,8 +1081,7 @@
   }
 }
 
-void ExtensionSet::SwapExtension(ExtensionSet* other,
-                                 int number) {
+void ExtensionSet::SwapExtension(ExtensionSet* other, int number) {
   if (this == other) return;
   Extension* this_ext = FindOrNull(number);
   Extension* other_ext = other->FindOrNull(number);
@@ -1152,9 +1147,11 @@
   return true;
 }
 
-bool ExtensionSet::FindExtensionInfoFromTag(
-    uint32 tag, ExtensionFinder* extension_finder, int* field_number,
-    ExtensionInfo* extension, bool* was_packed_on_wire) {
+bool ExtensionSet::FindExtensionInfoFromTag(uint32 tag,
+                                            ExtensionFinder* extension_finder,
+                                            int* field_number,
+                                            ExtensionInfo* extension,
+                                            bool* was_packed_on_wire) {
   *field_number = WireFormatLite::GetTagFieldNumber(tag);
   WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag);
   return FindExtensionInfoFromFieldNumber(wire_type, *field_number,
@@ -1190,12 +1187,12 @@
   int number;
   bool was_packed_on_wire;
   ExtensionInfo extension;
-  if (!FindExtensionInfoFromTag(
-      tag, extension_finder, &number, &extension, &was_packed_on_wire)) {
+  if (!FindExtensionInfoFromTag(tag, extension_finder, &number, &extension,
+                                &was_packed_on_wire)) {
     return field_skipper->SkipField(input, tag);
   } else {
-    return ParseFieldWithExtensionInfo(
-        number, was_packed_on_wire, extension, input, field_skipper);
+    return ParseFieldWithExtensionInfo(number, was_packed_on_wire, extension,
+                                       input, field_skipper);
   }
 }
 
@@ -1225,10 +1222,11 @@
 
 #endif
 
-bool ExtensionSet::ParseFieldWithExtensionInfo(
-    int number, bool was_packed_on_wire, const ExtensionInfo& extension,
-    io::CodedInputStream* input,
-    FieldSkipper* field_skipper) {
+bool ExtensionSet::ParseFieldWithExtensionInfo(int number,
+                                               bool was_packed_on_wire,
+                                               const ExtensionInfo& extension,
+                                               io::CodedInputStream* input,
+                                               FieldSkipper* field_skipper) {
   // Explicitly not read extension.is_packed, instead check whether the field
   // was encoded in packed form on the wire.
   if (was_packed_on_wire) {
@@ -1237,39 +1235,40 @@
     io::CodedInputStream::Limit limit = input->PushLimit(size);
 
     switch (extension.type) {
-#define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE)        \
-      case WireFormatLite::TYPE_##UPPERCASE:                                   \
-        while (input->BytesUntilLimit() > 0) {                                 \
-          CPP_LOWERCASE value;                                                 \
-          if (!WireFormatLite::ReadPrimitive<                                  \
-                  CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>(            \
-                input, &value)) return false;                                  \
-          Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE,         \
-                             extension.is_packed, value,                       \
-                             extension.descriptor);                            \
-        }                                                                      \
-        break
+#define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE)                \
+  case WireFormatLite::TYPE_##UPPERCASE:                                    \
+    while (input->BytesUntilLimit() > 0) {                                  \
+      CPP_LOWERCASE value;                                                  \
+      if (!WireFormatLite::ReadPrimitive<CPP_LOWERCASE,                     \
+                                         WireFormatLite::TYPE_##UPPERCASE>( \
+              input, &value))                                               \
+        return false;                                                       \
+      Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE,          \
+                         extension.is_packed, value, extension.descriptor); \
+    }                                                                       \
+    break
 
-      HANDLE_TYPE(   INT32,  Int32,   int32);
-      HANDLE_TYPE(   INT64,  Int64,   int64);
-      HANDLE_TYPE(  UINT32, UInt32,  uint32);
-      HANDLE_TYPE(  UINT64, UInt64,  uint64);
-      HANDLE_TYPE(  SINT32,  Int32,   int32);
-      HANDLE_TYPE(  SINT64,  Int64,   int64);
-      HANDLE_TYPE( FIXED32, UInt32,  uint32);
-      HANDLE_TYPE( FIXED64, UInt64,  uint64);
-      HANDLE_TYPE(SFIXED32,  Int32,   int32);
-      HANDLE_TYPE(SFIXED64,  Int64,   int64);
-      HANDLE_TYPE(   FLOAT,  Float,   float);
-      HANDLE_TYPE(  DOUBLE, Double,  double);
-      HANDLE_TYPE(    BOOL,   Bool,    bool);
+      HANDLE_TYPE(INT32, Int32, int32);
+      HANDLE_TYPE(INT64, Int64, int64);
+      HANDLE_TYPE(UINT32, UInt32, uint32);
+      HANDLE_TYPE(UINT64, UInt64, uint64);
+      HANDLE_TYPE(SINT32, Int32, int32);
+      HANDLE_TYPE(SINT64, Int64, int64);
+      HANDLE_TYPE(FIXED32, UInt32, uint32);
+      HANDLE_TYPE(FIXED64, UInt64, uint64);
+      HANDLE_TYPE(SFIXED32, Int32, int32);
+      HANDLE_TYPE(SFIXED64, Int64, int64);
+      HANDLE_TYPE(FLOAT, Float, float);
+      HANDLE_TYPE(DOUBLE, Double, double);
+      HANDLE_TYPE(BOOL, Bool, bool);
 #undef HANDLE_TYPE
 
       case WireFormatLite::TYPE_ENUM:
         while (input->BytesUntilLimit() > 0) {
           int value;
           if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
-                  input, &value)) return false;
+                  input, &value))
+            return false;
           if (extension.enum_validity_check.func(
                   extension.enum_validity_check.arg, value)) {
             AddEnum(number, WireFormatLite::TYPE_ENUM, extension.is_packed,
@@ -1292,41 +1291,42 @@
     input->PopLimit(limit);
   } else {
     switch (extension.type) {
-#define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE)                   \
-      case WireFormatLite::TYPE_##UPPERCASE: {                                 \
-        CPP_LOWERCASE value;                                                   \
-        if (!WireFormatLite::ReadPrimitive<                                    \
-                CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>(              \
-               input, &value)) return false;                                   \
-        if (extension.is_repeated) {                                           \
-          Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE,         \
-                             extension.is_packed, value,                       \
-                             extension.descriptor);                            \
-        } else {                                                               \
-          Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value,  \
-                             extension.descriptor);                            \
-        }                                                                      \
-      } break
+#define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE)                \
+  case WireFormatLite::TYPE_##UPPERCASE: {                                  \
+    CPP_LOWERCASE value;                                                    \
+    if (!WireFormatLite::ReadPrimitive<CPP_LOWERCASE,                       \
+                                       WireFormatLite::TYPE_##UPPERCASE>(   \
+            input, &value))                                                 \
+      return false;                                                         \
+    if (extension.is_repeated) {                                            \
+      Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE,          \
+                         extension.is_packed, value, extension.descriptor); \
+    } else {                                                                \
+      Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value,   \
+                         extension.descriptor);                             \
+    }                                                                       \
+  } break
 
-      HANDLE_TYPE(   INT32,  Int32,   int32);
-      HANDLE_TYPE(   INT64,  Int64,   int64);
-      HANDLE_TYPE(  UINT32, UInt32,  uint32);
-      HANDLE_TYPE(  UINT64, UInt64,  uint64);
-      HANDLE_TYPE(  SINT32,  Int32,   int32);
-      HANDLE_TYPE(  SINT64,  Int64,   int64);
-      HANDLE_TYPE( FIXED32, UInt32,  uint32);
-      HANDLE_TYPE( FIXED64, UInt64,  uint64);
-      HANDLE_TYPE(SFIXED32,  Int32,   int32);
-      HANDLE_TYPE(SFIXED64,  Int64,   int64);
-      HANDLE_TYPE(   FLOAT,  Float,   float);
-      HANDLE_TYPE(  DOUBLE, Double,  double);
-      HANDLE_TYPE(    BOOL,   Bool,    bool);
+      HANDLE_TYPE(INT32, Int32, int32);
+      HANDLE_TYPE(INT64, Int64, int64);
+      HANDLE_TYPE(UINT32, UInt32, uint32);
+      HANDLE_TYPE(UINT64, UInt64, uint64);
+      HANDLE_TYPE(SINT32, Int32, int32);
+      HANDLE_TYPE(SINT64, Int64, int64);
+      HANDLE_TYPE(FIXED32, UInt32, uint32);
+      HANDLE_TYPE(FIXED64, UInt64, uint64);
+      HANDLE_TYPE(SFIXED32, Int32, int32);
+      HANDLE_TYPE(SFIXED64, Int64, int64);
+      HANDLE_TYPE(FLOAT, Float, float);
+      HANDLE_TYPE(DOUBLE, Double, double);
+      HANDLE_TYPE(BOOL, Bool, bool);
 #undef HANDLE_TYPE
 
       case WireFormatLite::TYPE_ENUM: {
         int value;
         if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
-                input, &value)) return false;
+                input, &value))
+          return false;
 
         if (!extension.enum_validity_check.func(
                 extension.enum_validity_check.arg, value)) {
@@ -1342,7 +1342,7 @@
         break;
       }
 
-      case WireFormatLite::TYPE_STRING:  {
+      case WireFormatLite::TYPE_STRING: {
         std::string* value =
             extension.is_repeated
                 ? AddString(number, WireFormatLite::TYPE_STRING,
@@ -1353,7 +1353,7 @@
         break;
       }
 
-      case WireFormatLite::TYPE_BYTES:  {
+      case WireFormatLite::TYPE_BYTES: {
         std::string* value =
             extension.is_repeated
                 ? AddString(number, WireFormatLite::TYPE_BYTES,
@@ -1510,20 +1510,20 @@
 void ExtensionSet::Extension::Clear() {
   if (is_repeated) {
     switch (cpp_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                          \
-      case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
-        repeated_##LOWERCASE##_value->Clear();                     \
-        break
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE)   \
+  case WireFormatLite::CPPTYPE_##UPPERCASE: \
+    repeated_##LOWERCASE##_value->Clear();  \
+    break
 
-      HANDLE_TYPE(  INT32,   int32);
-      HANDLE_TYPE(  INT64,   int64);
-      HANDLE_TYPE( UINT32,  uint32);
-      HANDLE_TYPE( UINT64,  uint64);
-      HANDLE_TYPE(  FLOAT,   float);
-      HANDLE_TYPE( DOUBLE,  double);
-      HANDLE_TYPE(   BOOL,    bool);
-      HANDLE_TYPE(   ENUM,    enum);
-      HANDLE_TYPE( STRING,  string);
+      HANDLE_TYPE(INT32, int32);
+      HANDLE_TYPE(INT64, int64);
+      HANDLE_TYPE(UINT32, uint32);
+      HANDLE_TYPE(UINT64, uint64);
+      HANDLE_TYPE(FLOAT, float);
+      HANDLE_TYPE(DOUBLE, double);
+      HANDLE_TYPE(BOOL, bool);
+      HANDLE_TYPE(ENUM, enum);
+      HANDLE_TYPE(STRING, string);
       HANDLE_TYPE(MESSAGE, message);
 #undef HANDLE_TYPE
     }
@@ -1553,39 +1553,38 @@
 }
 
 void ExtensionSet::Extension::SerializeFieldWithCachedSizes(
-    int number,
-    io::CodedOutputStream* output) const {
+    int number, io::CodedOutputStream* output) const {
   if (is_repeated) {
     if (is_packed) {
       if (cached_size == 0) return;
 
-      WireFormatLite::WriteTag(number,
-          WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
+      WireFormatLite::WriteTag(
+          number, WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
       output->WriteVarint32(cached_size);
 
       switch (real_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
-        case WireFormatLite::TYPE_##UPPERCASE:                              \
-          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
-            WireFormatLite::Write##CAMELCASE##NoTag(                        \
-              repeated_##LOWERCASE##_value->Get(i), output);                \
-          }                                                                 \
-          break
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                 \
+  case WireFormatLite::TYPE_##UPPERCASE:                             \
+    for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
+      WireFormatLite::Write##CAMELCASE##NoTag(                       \
+          repeated_##LOWERCASE##_value->Get(i), output);             \
+    }                                                                \
+    break
 
-        HANDLE_TYPE(   INT32,    Int32,   int32);
-        HANDLE_TYPE(   INT64,    Int64,   int64);
-        HANDLE_TYPE(  UINT32,   UInt32,  uint32);
-        HANDLE_TYPE(  UINT64,   UInt64,  uint64);
-        HANDLE_TYPE(  SINT32,   SInt32,   int32);
-        HANDLE_TYPE(  SINT64,   SInt64,   int64);
-        HANDLE_TYPE( FIXED32,  Fixed32,  uint32);
-        HANDLE_TYPE( FIXED64,  Fixed64,  uint64);
-        HANDLE_TYPE(SFIXED32, SFixed32,   int32);
-        HANDLE_TYPE(SFIXED64, SFixed64,   int64);
-        HANDLE_TYPE(   FLOAT,    Float,   float);
-        HANDLE_TYPE(  DOUBLE,   Double,  double);
-        HANDLE_TYPE(    BOOL,     Bool,    bool);
-        HANDLE_TYPE(    ENUM,     Enum,    enum);
+        HANDLE_TYPE(INT32, Int32, int32);
+        HANDLE_TYPE(INT64, Int64, int64);
+        HANDLE_TYPE(UINT32, UInt32, uint32);
+        HANDLE_TYPE(UINT64, UInt64, uint64);
+        HANDLE_TYPE(SINT32, SInt32, int32);
+        HANDLE_TYPE(SINT64, SInt64, int64);
+        HANDLE_TYPE(FIXED32, Fixed32, uint32);
+        HANDLE_TYPE(FIXED64, Fixed64, uint64);
+        HANDLE_TYPE(SFIXED32, SFixed32, int32);
+        HANDLE_TYPE(SFIXED64, SFixed64, int64);
+        HANDLE_TYPE(FLOAT, Float, float);
+        HANDLE_TYPE(DOUBLE, Double, double);
+        HANDLE_TYPE(BOOL, Bool, bool);
+        HANDLE_TYPE(ENUM, Enum, enum);
 #undef HANDLE_TYPE
 
         case WireFormatLite::TYPE_STRING:
@@ -1597,59 +1596,59 @@
       }
     } else {
       switch (real_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
-        case WireFormatLite::TYPE_##UPPERCASE:                              \
-          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
-            WireFormatLite::Write##CAMELCASE(number,                        \
-              repeated_##LOWERCASE##_value->Get(i), output);                \
-          }                                                                 \
-          break
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                 \
+  case WireFormatLite::TYPE_##UPPERCASE:                             \
+    for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
+      WireFormatLite::Write##CAMELCASE(                              \
+          number, repeated_##LOWERCASE##_value->Get(i), output);     \
+    }                                                                \
+    break
 
-        HANDLE_TYPE(   INT32,    Int32,   int32);
-        HANDLE_TYPE(   INT64,    Int64,   int64);
-        HANDLE_TYPE(  UINT32,   UInt32,  uint32);
-        HANDLE_TYPE(  UINT64,   UInt64,  uint64);
-        HANDLE_TYPE(  SINT32,   SInt32,   int32);
-        HANDLE_TYPE(  SINT64,   SInt64,   int64);
-        HANDLE_TYPE( FIXED32,  Fixed32,  uint32);
-        HANDLE_TYPE( FIXED64,  Fixed64,  uint64);
-        HANDLE_TYPE(SFIXED32, SFixed32,   int32);
-        HANDLE_TYPE(SFIXED64, SFixed64,   int64);
-        HANDLE_TYPE(   FLOAT,    Float,   float);
-        HANDLE_TYPE(  DOUBLE,   Double,  double);
-        HANDLE_TYPE(    BOOL,     Bool,    bool);
-        HANDLE_TYPE(  STRING,   String,  string);
-        HANDLE_TYPE(   BYTES,    Bytes,  string);
-        HANDLE_TYPE(    ENUM,     Enum,    enum);
-        HANDLE_TYPE(   GROUP,    Group, message);
-        HANDLE_TYPE( MESSAGE,  Message, message);
+        HANDLE_TYPE(INT32, Int32, int32);
+        HANDLE_TYPE(INT64, Int64, int64);
+        HANDLE_TYPE(UINT32, UInt32, uint32);
+        HANDLE_TYPE(UINT64, UInt64, uint64);
+        HANDLE_TYPE(SINT32, SInt32, int32);
+        HANDLE_TYPE(SINT64, SInt64, int64);
+        HANDLE_TYPE(FIXED32, Fixed32, uint32);
+        HANDLE_TYPE(FIXED64, Fixed64, uint64);
+        HANDLE_TYPE(SFIXED32, SFixed32, int32);
+        HANDLE_TYPE(SFIXED64, SFixed64, int64);
+        HANDLE_TYPE(FLOAT, Float, float);
+        HANDLE_TYPE(DOUBLE, Double, double);
+        HANDLE_TYPE(BOOL, Bool, bool);
+        HANDLE_TYPE(STRING, String, string);
+        HANDLE_TYPE(BYTES, Bytes, string);
+        HANDLE_TYPE(ENUM, Enum, enum);
+        HANDLE_TYPE(GROUP, Group, message);
+        HANDLE_TYPE(MESSAGE, Message, message);
 #undef HANDLE_TYPE
       }
     }
   } else if (!is_cleared) {
     switch (real_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE)                 \
-      case WireFormatLite::TYPE_##UPPERCASE:                     \
-        WireFormatLite::Write##CAMELCASE(number, VALUE, output); \
-        break
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE)             \
+  case WireFormatLite::TYPE_##UPPERCASE:                     \
+    WireFormatLite::Write##CAMELCASE(number, VALUE, output); \
+    break
 
-      HANDLE_TYPE(   INT32,    Int32,    int32_value);
-      HANDLE_TYPE(   INT64,    Int64,    int64_value);
-      HANDLE_TYPE(  UINT32,   UInt32,   uint32_value);
-      HANDLE_TYPE(  UINT64,   UInt64,   uint64_value);
-      HANDLE_TYPE(  SINT32,   SInt32,    int32_value);
-      HANDLE_TYPE(  SINT64,   SInt64,    int64_value);
-      HANDLE_TYPE( FIXED32,  Fixed32,   uint32_value);
-      HANDLE_TYPE( FIXED64,  Fixed64,   uint64_value);
-      HANDLE_TYPE(SFIXED32, SFixed32,    int32_value);
-      HANDLE_TYPE(SFIXED64, SFixed64,    int64_value);
-      HANDLE_TYPE(   FLOAT,    Float,    float_value);
-      HANDLE_TYPE(  DOUBLE,   Double,   double_value);
-      HANDLE_TYPE(    BOOL,     Bool,     bool_value);
-      HANDLE_TYPE(  STRING,   String,  *string_value);
-      HANDLE_TYPE(   BYTES,    Bytes,  *string_value);
-      HANDLE_TYPE(    ENUM,     Enum,     enum_value);
-      HANDLE_TYPE(   GROUP,    Group, *message_value);
+      HANDLE_TYPE(INT32, Int32, int32_value);
+      HANDLE_TYPE(INT64, Int64, int64_value);
+      HANDLE_TYPE(UINT32, UInt32, uint32_value);
+      HANDLE_TYPE(UINT64, UInt64, uint64_value);
+      HANDLE_TYPE(SINT32, SInt32, int32_value);
+      HANDLE_TYPE(SINT64, SInt64, int64_value);
+      HANDLE_TYPE(FIXED32, Fixed32, uint32_value);
+      HANDLE_TYPE(FIXED64, Fixed64, uint64_value);
+      HANDLE_TYPE(SFIXED32, SFixed32, int32_value);
+      HANDLE_TYPE(SFIXED64, SFixed64, int64_value);
+      HANDLE_TYPE(FLOAT, Float, float_value);
+      HANDLE_TYPE(DOUBLE, Double, double_value);
+      HANDLE_TYPE(BOOL, Bool, bool_value);
+      HANDLE_TYPE(STRING, String, *string_value);
+      HANDLE_TYPE(BYTES, Bytes, *string_value);
+      HANDLE_TYPE(ENUM, Enum, enum_value);
+      HANDLE_TYPE(GROUP, Group, *message_value);
 #undef HANDLE_TYPE
       case WireFormatLite::TYPE_MESSAGE:
         if (is_lazy) {
@@ -1668,36 +1667,36 @@
   if (is_repeated) {
     if (is_packed) {
       switch (real_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
-        case WireFormatLite::TYPE_##UPPERCASE:                              \
-          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
-            result += WireFormatLite::CAMELCASE##Size(                      \
-              repeated_##LOWERCASE##_value->Get(i));                        \
-          }                                                                 \
-          break
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                 \
+  case WireFormatLite::TYPE_##UPPERCASE:                             \
+    for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
+      result += WireFormatLite::CAMELCASE##Size(                     \
+          repeated_##LOWERCASE##_value->Get(i));                     \
+    }                                                                \
+    break
 
-        HANDLE_TYPE(   INT32,    Int32,   int32);
-        HANDLE_TYPE(   INT64,    Int64,   int64);
-        HANDLE_TYPE(  UINT32,   UInt32,  uint32);
-        HANDLE_TYPE(  UINT64,   UInt64,  uint64);
-        HANDLE_TYPE(  SINT32,   SInt32,   int32);
-        HANDLE_TYPE(  SINT64,   SInt64,   int64);
-        HANDLE_TYPE(    ENUM,     Enum,    enum);
+        HANDLE_TYPE(INT32, Int32, int32);
+        HANDLE_TYPE(INT64, Int64, int64);
+        HANDLE_TYPE(UINT32, UInt32, uint32);
+        HANDLE_TYPE(UINT64, UInt64, uint64);
+        HANDLE_TYPE(SINT32, SInt32, int32);
+        HANDLE_TYPE(SINT64, SInt64, int64);
+        HANDLE_TYPE(ENUM, Enum, enum);
 #undef HANDLE_TYPE
 
         // Stuff with fixed size.
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
-        case WireFormatLite::TYPE_##UPPERCASE:                              \
-          result += WireFormatLite::k##CAMELCASE##Size *                    \
-                    FromIntSize(repeated_##LOWERCASE##_value->size());      \
-          break
-        HANDLE_TYPE( FIXED32,  Fixed32, uint32);
-        HANDLE_TYPE( FIXED64,  Fixed64, uint64);
-        HANDLE_TYPE(SFIXED32, SFixed32,  int32);
-        HANDLE_TYPE(SFIXED64, SFixed64,  int64);
-        HANDLE_TYPE(   FLOAT,    Float,  float);
-        HANDLE_TYPE(  DOUBLE,   Double, double);
-        HANDLE_TYPE(    BOOL,     Bool,   bool);
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)             \
+  case WireFormatLite::TYPE_##UPPERCASE:                         \
+    result += WireFormatLite::k##CAMELCASE##Size *               \
+              FromIntSize(repeated_##LOWERCASE##_value->size()); \
+    break
+        HANDLE_TYPE(FIXED32, Fixed32, uint32);
+        HANDLE_TYPE(FIXED64, Fixed64, uint64);
+        HANDLE_TYPE(SFIXED32, SFixed32, int32);
+        HANDLE_TYPE(SFIXED64, SFixed64, int64);
+        HANDLE_TYPE(FLOAT, Float, float);
+        HANDLE_TYPE(DOUBLE, Double, double);
+        HANDLE_TYPE(BOOL, Bool, bool);
 #undef HANDLE_TYPE
 
         case WireFormatLite::TYPE_STRING:
@@ -1711,71 +1710,69 @@
       cached_size = ToCachedSize(result);
       if (result > 0) {
         result += io::CodedOutputStream::VarintSize32(result);
-        result += io::CodedOutputStream::VarintSize32(
-            WireFormatLite::MakeTag(number,
-                WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
+        result += io::CodedOutputStream::VarintSize32(WireFormatLite::MakeTag(
+            number, WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
       }
     } else {
       size_t tag_size = WireFormatLite::TagSize(number, real_type(type));
 
       switch (real_type(type)) {
 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
-        case WireFormatLite::TYPE_##UPPERCASE:                              \
-          result += tag_size *                                              \
-                    FromIntSize(repeated_##LOWERCASE##_value->size());      \
-          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
-            result += WireFormatLite::CAMELCASE##Size(                      \
-              repeated_##LOWERCASE##_value->Get(i));                        \
-          }                                                                 \
-          break
+  case WireFormatLite::TYPE_##UPPERCASE:                                    \
+    result += tag_size * FromIntSize(repeated_##LOWERCASE##_value->size()); \
+    for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {        \
+      result += WireFormatLite::CAMELCASE##Size(                            \
+          repeated_##LOWERCASE##_value->Get(i));                            \
+    }                                                                       \
+    break
 
-        HANDLE_TYPE(   INT32,    Int32,   int32);
-        HANDLE_TYPE(   INT64,    Int64,   int64);
-        HANDLE_TYPE(  UINT32,   UInt32,  uint32);
-        HANDLE_TYPE(  UINT64,   UInt64,  uint64);
-        HANDLE_TYPE(  SINT32,   SInt32,   int32);
-        HANDLE_TYPE(  SINT64,   SInt64,   int64);
-        HANDLE_TYPE(  STRING,   String,  string);
-        HANDLE_TYPE(   BYTES,    Bytes,  string);
-        HANDLE_TYPE(    ENUM,     Enum,    enum);
-        HANDLE_TYPE(   GROUP,    Group, message);
-        HANDLE_TYPE( MESSAGE,  Message, message);
+        HANDLE_TYPE(INT32, Int32, int32);
+        HANDLE_TYPE(INT64, Int64, int64);
+        HANDLE_TYPE(UINT32, UInt32, uint32);
+        HANDLE_TYPE(UINT64, UInt64, uint64);
+        HANDLE_TYPE(SINT32, SInt32, int32);
+        HANDLE_TYPE(SINT64, SInt64, int64);
+        HANDLE_TYPE(STRING, String, string);
+        HANDLE_TYPE(BYTES, Bytes, string);
+        HANDLE_TYPE(ENUM, Enum, enum);
+        HANDLE_TYPE(GROUP, Group, message);
+        HANDLE_TYPE(MESSAGE, Message, message);
 #undef HANDLE_TYPE
 
         // Stuff with fixed size.
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
-        case WireFormatLite::TYPE_##UPPERCASE:                              \
-          result += (tag_size + WireFormatLite::k##CAMELCASE##Size) *       \
-                    FromIntSize(repeated_##LOWERCASE##_value->size());      \
-          break
-        HANDLE_TYPE( FIXED32,  Fixed32, uint32);
-        HANDLE_TYPE( FIXED64,  Fixed64, uint64);
-        HANDLE_TYPE(SFIXED32, SFixed32,  int32);
-        HANDLE_TYPE(SFIXED64, SFixed64,  int64);
-        HANDLE_TYPE(   FLOAT,    Float,  float);
-        HANDLE_TYPE(  DOUBLE,   Double, double);
-        HANDLE_TYPE(    BOOL,     Bool,   bool);
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)             \
+  case WireFormatLite::TYPE_##UPPERCASE:                         \
+    result += (tag_size + WireFormatLite::k##CAMELCASE##Size) *  \
+              FromIntSize(repeated_##LOWERCASE##_value->size()); \
+    break
+        HANDLE_TYPE(FIXED32, Fixed32, uint32);
+        HANDLE_TYPE(FIXED64, Fixed64, uint64);
+        HANDLE_TYPE(SFIXED32, SFixed32, int32);
+        HANDLE_TYPE(SFIXED64, SFixed64, int64);
+        HANDLE_TYPE(FLOAT, Float, float);
+        HANDLE_TYPE(DOUBLE, Double, double);
+        HANDLE_TYPE(BOOL, Bool, bool);
 #undef HANDLE_TYPE
       }
     }
   } else if (!is_cleared) {
     result += WireFormatLite::TagSize(number, real_type(type));
     switch (real_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                      \
-      case WireFormatLite::TYPE_##UPPERCASE:                              \
-        result += WireFormatLite::CAMELCASE##Size(LOWERCASE);             \
-        break
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)      \
+  case WireFormatLite::TYPE_##UPPERCASE:                  \
+    result += WireFormatLite::CAMELCASE##Size(LOWERCASE); \
+    break
 
-      HANDLE_TYPE(   INT32,    Int32,    int32_value);
-      HANDLE_TYPE(   INT64,    Int64,    int64_value);
-      HANDLE_TYPE(  UINT32,   UInt32,   uint32_value);
-      HANDLE_TYPE(  UINT64,   UInt64,   uint64_value);
-      HANDLE_TYPE(  SINT32,   SInt32,    int32_value);
-      HANDLE_TYPE(  SINT64,   SInt64,    int64_value);
-      HANDLE_TYPE(  STRING,   String,  *string_value);
-      HANDLE_TYPE(   BYTES,    Bytes,  *string_value);
-      HANDLE_TYPE(    ENUM,     Enum,     enum_value);
-      HANDLE_TYPE(   GROUP,    Group, *message_value);
+      HANDLE_TYPE(INT32, Int32, int32_value);
+      HANDLE_TYPE(INT64, Int64, int64_value);
+      HANDLE_TYPE(UINT32, UInt32, uint32_value);
+      HANDLE_TYPE(UINT64, UInt64, uint64_value);
+      HANDLE_TYPE(SINT32, SInt32, int32_value);
+      HANDLE_TYPE(SINT64, SInt64, int64_value);
+      HANDLE_TYPE(STRING, String, *string_value);
+      HANDLE_TYPE(BYTES, Bytes, *string_value);
+      HANDLE_TYPE(ENUM, Enum, enum_value);
+      HANDLE_TYPE(GROUP, Group, *message_value);
 #undef HANDLE_TYPE
       case WireFormatLite::TYPE_MESSAGE: {
         if (is_lazy) {
@@ -1788,17 +1785,17 @@
       }
 
       // Stuff with fixed size.
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE)                                 \
-      case WireFormatLite::TYPE_##UPPERCASE:                              \
-        result += WireFormatLite::k##CAMELCASE##Size;                     \
-        break
-      HANDLE_TYPE( FIXED32,  Fixed32);
-      HANDLE_TYPE( FIXED64,  Fixed64);
-      HANDLE_TYPE(SFIXED32, SFixed32);
-      HANDLE_TYPE(SFIXED64, SFixed64);
-      HANDLE_TYPE(   FLOAT,    Float);
-      HANDLE_TYPE(  DOUBLE,   Double);
-      HANDLE_TYPE(    BOOL,     Bool);
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE)         \
+  case WireFormatLite::TYPE_##UPPERCASE:          \
+    result += WireFormatLite::k##CAMELCASE##Size; \
+    break
+        HANDLE_TYPE(FIXED32, Fixed32);
+        HANDLE_TYPE(FIXED64, Fixed64);
+        HANDLE_TYPE(SFIXED32, SFixed32);
+        HANDLE_TYPE(SFIXED64, SFixed64);
+        HANDLE_TYPE(FLOAT, Float);
+        HANDLE_TYPE(DOUBLE, Double);
+        HANDLE_TYPE(BOOL, Bool);
 #undef HANDLE_TYPE
     }
   }
@@ -1809,19 +1806,19 @@
 int ExtensionSet::Extension::GetSize() const {
   GOOGLE_DCHECK(is_repeated);
   switch (cpp_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                        \
-    case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
-      return repeated_##LOWERCASE##_value->size()
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE)   \
+  case WireFormatLite::CPPTYPE_##UPPERCASE: \
+    return repeated_##LOWERCASE##_value->size()
 
-    HANDLE_TYPE(  INT32,   int32);
-    HANDLE_TYPE(  INT64,   int64);
-    HANDLE_TYPE( UINT32,  uint32);
-    HANDLE_TYPE( UINT64,  uint64);
-    HANDLE_TYPE(  FLOAT,   float);
-    HANDLE_TYPE( DOUBLE,  double);
-    HANDLE_TYPE(   BOOL,    bool);
-    HANDLE_TYPE(   ENUM,    enum);
-    HANDLE_TYPE( STRING,  string);
+    HANDLE_TYPE(INT32, int32);
+    HANDLE_TYPE(INT64, int64);
+    HANDLE_TYPE(UINT32, uint32);
+    HANDLE_TYPE(UINT64, uint64);
+    HANDLE_TYPE(FLOAT, float);
+    HANDLE_TYPE(DOUBLE, double);
+    HANDLE_TYPE(BOOL, bool);
+    HANDLE_TYPE(ENUM, enum);
+    HANDLE_TYPE(STRING, string);
     HANDLE_TYPE(MESSAGE, message);
 #undef HANDLE_TYPE
   }
@@ -1835,20 +1832,20 @@
 void ExtensionSet::Extension::Free() {
   if (is_repeated) {
     switch (cpp_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                          \
-      case WireFormatLite::CPPTYPE_##UPPERCASE:                    \
-        delete repeated_##LOWERCASE##_value;                       \
-        break
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE)   \
+  case WireFormatLite::CPPTYPE_##UPPERCASE: \
+    delete repeated_##LOWERCASE##_value;    \
+    break
 
-      HANDLE_TYPE(  INT32,   int32);
-      HANDLE_TYPE(  INT64,   int64);
-      HANDLE_TYPE( UINT32,  uint32);
-      HANDLE_TYPE( UINT64,  uint64);
-      HANDLE_TYPE(  FLOAT,   float);
-      HANDLE_TYPE( DOUBLE,  double);
-      HANDLE_TYPE(   BOOL,    bool);
-      HANDLE_TYPE(   ENUM,    enum);
-      HANDLE_TYPE( STRING,  string);
+      HANDLE_TYPE(INT32, int32);
+      HANDLE_TYPE(INT64, int64);
+      HANDLE_TYPE(UINT32, uint32);
+      HANDLE_TYPE(UINT64, uint64);
+      HANDLE_TYPE(FLOAT, float);
+      HANDLE_TYPE(DOUBLE, double);
+      HANDLE_TYPE(BOOL, bool);
+      HANDLE_TYPE(ENUM, enum);
+      HANDLE_TYPE(STRING, string);
       HANDLE_TYPE(MESSAGE, message);
 #undef HANDLE_TYPE
     }
@@ -2029,8 +2026,7 @@
 }
 
 void ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizes(
-    int number,
-    io::CodedOutputStream* output) const {
+    int number, io::CodedOutputStream* output) const {
   if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) {
     // Not a valid MessageSet extension, but serialize it the normal way.
     SerializeFieldWithCachedSizes(number, output);
@@ -2043,18 +2039,15 @@
   output->WriteTag(WireFormatLite::kMessageSetItemStartTag);
 
   // Write type ID.
-  WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber,
-                              number,
+  WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber, number,
                               output);
   // Write message.
   if (is_lazy) {
-    lazymessage_value->WriteMessage(
-        WireFormatLite::kMessageSetMessageNumber, output);
+    lazymessage_value->WriteMessage(WireFormatLite::kMessageSetMessageNumber,
+                                    output);
   } else {
     WireFormatLite::WriteMessageMaybeToArray(
-        WireFormatLite::kMessageSetMessageNumber,
-        *message_value,
-        output);
+        WireFormatLite::kMessageSetMessageNumber, *message_value, output);
   }
 
   // End group.
diff --git a/src/google/protobuf/extension_set_heavy.cc b/src/google/protobuf/extension_set_heavy.cc
index f48207b..32ca435 100644
--- a/src/google/protobuf/extension_set_heavy.cc
+++ b/src/google/protobuf/extension_set_heavy.cc
@@ -58,8 +58,7 @@
 namespace internal {
 
 // A FieldSkipper used to store unknown MessageSet fields into UnknownFieldSet.
-class MessageSetFieldSkipper
-    : public UnknownFieldSetFieldSkipper {
+class MessageSetFieldSkipper : public UnknownFieldSetFieldSkipper {
  public:
   explicit MessageSetFieldSkipper(UnknownFieldSet* unknown_fields)
       : UnknownFieldSetFieldSkipper(unknown_fields) {}
@@ -68,15 +67,15 @@
   virtual bool SkipMessageSetField(io::CodedInputStream* input,
                                    int field_number);
 };
-bool MessageSetFieldSkipper::SkipMessageSetField(
-    io::CodedInputStream* input, int field_number) {
+bool MessageSetFieldSkipper::SkipMessageSetField(io::CodedInputStream* input,
+                                                 int field_number) {
   uint32 length;
   if (!input->ReadVarint32(&length)) return false;
   if (unknown_fields_ == NULL) {
     return input->Skip(length);
   } else {
-    return input->ReadString(
-        unknown_fields_->AddLengthDelimited(field_number), length);
+    return input->ReadString(unknown_fields_->AddLengthDelimited(field_number),
+                             length);
   }
 }
 
@@ -141,10 +140,10 @@
   return static_cast<WireFormatLite::FieldType>(type);
 }
 
-#define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE)                            \
-  GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? FieldDescriptor::LABEL_REPEATED     \
-                                  : FieldDescriptor::LABEL_OPTIONAL,      \
-            FieldDescriptor::LABEL_##LABEL);                              \
+#define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE)                         \
+  GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? FieldDescriptor::LABEL_REPEATED  \
+                                    : FieldDescriptor::LABEL_OPTIONAL, \
+            FieldDescriptor::LABEL_##LABEL);                           \
   GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), FieldDescriptor::CPPTYPE_##CPPTYPE)
 
 const MessageLite& ExtensionSet::GetMessage(int number,
@@ -242,7 +241,8 @@
   }
 }
 
-ExtensionSet::Extension* ExtensionSet::MaybeNewRepeatedExtension(const FieldDescriptor* descriptor) {
+ExtensionSet::Extension* ExtensionSet::MaybeNewRepeatedExtension(
+    const FieldDescriptor* descriptor) {
   Extension* extension;
   if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) {
     extension->type = descriptor->type();
@@ -288,8 +288,8 @@
 }
 
 static bool ValidateEnumUsingDescriptor(const void* arg, int number) {
-  return reinterpret_cast<const EnumDescriptor*>(arg)
-      ->FindValueByNumber(number) != NULL;
+  return reinterpret_cast<const EnumDescriptor*>(arg)->FindValueByNumber(
+             number) != NULL;
 }
 
 bool DescriptorPoolExtensionFinder::Find(int number, ExtensionInfo* output) {
@@ -429,15 +429,15 @@
                   repeated_##LOWERCASE##_value->SpaceUsedExcludingSelfLong(); \
     break
 
-      HANDLE_TYPE(  INT32,   int32);
-      HANDLE_TYPE(  INT64,   int64);
-      HANDLE_TYPE( UINT32,  uint32);
-      HANDLE_TYPE( UINT64,  uint64);
-      HANDLE_TYPE(  FLOAT,   float);
-      HANDLE_TYPE( DOUBLE,  double);
-      HANDLE_TYPE(   BOOL,    bool);
-      HANDLE_TYPE(   ENUM,    enum);
-      HANDLE_TYPE( STRING,  string);
+      HANDLE_TYPE(INT32, int32);
+      HANDLE_TYPE(INT64, int64);
+      HANDLE_TYPE(UINT32, uint32);
+      HANDLE_TYPE(UINT64, uint64);
+      HANDLE_TYPE(FLOAT, float);
+      HANDLE_TYPE(DOUBLE, double);
+      HANDLE_TYPE(BOOL, bool);
+      HANDLE_TYPE(ENUM, enum);
+      HANDLE_TYPE(STRING, string);
 #undef HANDLE_TYPE
 
       case FieldDescriptor::CPPTYPE_MESSAGE:
@@ -522,33 +522,33 @@
     if (is_packed) {
       if (cached_size == 0) return target;
 
-      target = WireFormatLite::WriteTagToArray(number,
-          WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target);
+      target = WireFormatLite::WriteTagToArray(
+          number, WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target);
       target = WireFormatLite::WriteInt32NoTagToArray(cached_size, target);
 
       switch (real_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
-        case FieldDescriptor::TYPE_##UPPERCASE:                             \
-          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
-            target = WireFormatLite::Write##CAMELCASE##NoTagToArray(        \
-              repeated_##LOWERCASE##_value->Get(i), target);                \
-          }                                                                 \
-          break
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                 \
+  case FieldDescriptor::TYPE_##UPPERCASE:                            \
+    for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
+      target = WireFormatLite::Write##CAMELCASE##NoTagToArray(       \
+          repeated_##LOWERCASE##_value->Get(i), target);             \
+    }                                                                \
+    break
 
-        HANDLE_TYPE(   INT32,    Int32,   int32);
-        HANDLE_TYPE(   INT64,    Int64,   int64);
-        HANDLE_TYPE(  UINT32,   UInt32,  uint32);
-        HANDLE_TYPE(  UINT64,   UInt64,  uint64);
-        HANDLE_TYPE(  SINT32,   SInt32,   int32);
-        HANDLE_TYPE(  SINT64,   SInt64,   int64);
-        HANDLE_TYPE( FIXED32,  Fixed32,  uint32);
-        HANDLE_TYPE( FIXED64,  Fixed64,  uint64);
-        HANDLE_TYPE(SFIXED32, SFixed32,   int32);
-        HANDLE_TYPE(SFIXED64, SFixed64,   int64);
-        HANDLE_TYPE(   FLOAT,    Float,   float);
-        HANDLE_TYPE(  DOUBLE,   Double,  double);
-        HANDLE_TYPE(    BOOL,     Bool,    bool);
-        HANDLE_TYPE(    ENUM,     Enum,    enum);
+        HANDLE_TYPE(INT32, Int32, int32);
+        HANDLE_TYPE(INT64, Int64, int64);
+        HANDLE_TYPE(UINT32, UInt32, uint32);
+        HANDLE_TYPE(UINT64, UInt64, uint64);
+        HANDLE_TYPE(SINT32, SInt32, int32);
+        HANDLE_TYPE(SINT64, SInt64, int64);
+        HANDLE_TYPE(FIXED32, Fixed32, uint32);
+        HANDLE_TYPE(FIXED64, Fixed64, uint64);
+        HANDLE_TYPE(SFIXED32, SFixed32, int32);
+        HANDLE_TYPE(SFIXED64, SFixed64, int64);
+        HANDLE_TYPE(FLOAT, Float, float);
+        HANDLE_TYPE(DOUBLE, Double, double);
+        HANDLE_TYPE(BOOL, Bool, bool);
+        HANDLE_TYPE(ENUM, Enum, enum);
 #undef HANDLE_TYPE
 
         case FieldDescriptor::TYPE_STRING:
@@ -560,30 +560,30 @@
       }
     } else {
       switch (real_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                        \
-        case FieldDescriptor::TYPE_##UPPERCASE:                             \
-          for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) {  \
-            target = WireFormatLite::Write##CAMELCASE##ToArray(number,      \
-              repeated_##LOWERCASE##_value->Get(i), target);                \
-          }                                                                 \
-          break
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                 \
+  case FieldDescriptor::TYPE_##UPPERCASE:                            \
+    for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \
+      target = WireFormatLite::Write##CAMELCASE##ToArray(            \
+          number, repeated_##LOWERCASE##_value->Get(i), target);     \
+    }                                                                \
+    break
 
-        HANDLE_TYPE(   INT32,    Int32,   int32);
-        HANDLE_TYPE(   INT64,    Int64,   int64);
-        HANDLE_TYPE(  UINT32,   UInt32,  uint32);
-        HANDLE_TYPE(  UINT64,   UInt64,  uint64);
-        HANDLE_TYPE(  SINT32,   SInt32,   int32);
-        HANDLE_TYPE(  SINT64,   SInt64,   int64);
-        HANDLE_TYPE( FIXED32,  Fixed32,  uint32);
-        HANDLE_TYPE( FIXED64,  Fixed64,  uint64);
-        HANDLE_TYPE(SFIXED32, SFixed32,   int32);
-        HANDLE_TYPE(SFIXED64, SFixed64,   int64);
-        HANDLE_TYPE(   FLOAT,    Float,   float);
-        HANDLE_TYPE(  DOUBLE,   Double,  double);
-        HANDLE_TYPE(    BOOL,     Bool,    bool);
-        HANDLE_TYPE(  STRING,   String,  string);
-        HANDLE_TYPE(   BYTES,    Bytes,  string);
-        HANDLE_TYPE(    ENUM,     Enum,    enum);
+        HANDLE_TYPE(INT32, Int32, int32);
+        HANDLE_TYPE(INT64, Int64, int64);
+        HANDLE_TYPE(UINT32, UInt32, uint32);
+        HANDLE_TYPE(UINT64, UInt64, uint64);
+        HANDLE_TYPE(SINT32, SInt32, int32);
+        HANDLE_TYPE(SINT64, SInt64, int64);
+        HANDLE_TYPE(FIXED32, Fixed32, uint32);
+        HANDLE_TYPE(FIXED64, Fixed64, uint64);
+        HANDLE_TYPE(SFIXED32, SFixed32, int32);
+        HANDLE_TYPE(SFIXED64, SFixed64, int64);
+        HANDLE_TYPE(FLOAT, Float, float);
+        HANDLE_TYPE(DOUBLE, Double, double);
+        HANDLE_TYPE(BOOL, Bool, bool);
+        HANDLE_TYPE(STRING, String, string);
+        HANDLE_TYPE(BYTES, Bytes, string);
+        HANDLE_TYPE(ENUM, Enum, enum);
 #undef HANDLE_TYPE
 #define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE)                 \
   case FieldDescriptor::TYPE_##UPPERCASE:                            \
@@ -593,36 +593,35 @@
     }                                                                \
     break
 
-        HANDLE_TYPE(   GROUP,    Group, message);
-        HANDLE_TYPE( MESSAGE,  Message, message);
+        HANDLE_TYPE(GROUP, Group, message);
+        HANDLE_TYPE(MESSAGE, Message, message);
 #undef HANDLE_TYPE
       }
     }
   } else if (!is_cleared) {
     switch (real_type(type)) {
-#define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE)                 \
-      case FieldDescriptor::TYPE_##UPPERCASE:                    \
-        target = WireFormatLite::Write##CAMELCASE##ToArray(      \
-            number, VALUE, target); \
-        break
+#define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE)                               \
+  case FieldDescriptor::TYPE_##UPPERCASE:                                      \
+    target = WireFormatLite::Write##CAMELCASE##ToArray(number, VALUE, target); \
+    break
 
-      HANDLE_TYPE(   INT32,    Int32,    int32_value);
-      HANDLE_TYPE(   INT64,    Int64,    int64_value);
-      HANDLE_TYPE(  UINT32,   UInt32,   uint32_value);
-      HANDLE_TYPE(  UINT64,   UInt64,   uint64_value);
-      HANDLE_TYPE(  SINT32,   SInt32,    int32_value);
-      HANDLE_TYPE(  SINT64,   SInt64,    int64_value);
-      HANDLE_TYPE( FIXED32,  Fixed32,   uint32_value);
-      HANDLE_TYPE( FIXED64,  Fixed64,   uint64_value);
-      HANDLE_TYPE(SFIXED32, SFixed32,    int32_value);
-      HANDLE_TYPE(SFIXED64, SFixed64,    int64_value);
-      HANDLE_TYPE(   FLOAT,    Float,    float_value);
-      HANDLE_TYPE(  DOUBLE,   Double,   double_value);
-      HANDLE_TYPE(    BOOL,     Bool,     bool_value);
-      HANDLE_TYPE(  STRING,   String,  *string_value);
-      HANDLE_TYPE(   BYTES,    Bytes,  *string_value);
-      HANDLE_TYPE(    ENUM,     Enum,     enum_value);
-      HANDLE_TYPE(   GROUP,    Group, *message_value);
+      HANDLE_TYPE(INT32, Int32, int32_value);
+      HANDLE_TYPE(INT64, Int64, int64_value);
+      HANDLE_TYPE(UINT32, UInt32, uint32_value);
+      HANDLE_TYPE(UINT64, UInt64, uint64_value);
+      HANDLE_TYPE(SINT32, SInt32, int32_value);
+      HANDLE_TYPE(SINT64, SInt64, int64_value);
+      HANDLE_TYPE(FIXED32, Fixed32, uint32_value);
+      HANDLE_TYPE(FIXED64, Fixed64, uint64_value);
+      HANDLE_TYPE(SFIXED32, SFixed32, int32_value);
+      HANDLE_TYPE(SFIXED64, SFixed64, int64_value);
+      HANDLE_TYPE(FLOAT, Float, float_value);
+      HANDLE_TYPE(DOUBLE, Double, double_value);
+      HANDLE_TYPE(BOOL, Bool, bool_value);
+      HANDLE_TYPE(STRING, String, *string_value);
+      HANDLE_TYPE(BYTES, Bytes, *string_value);
+      HANDLE_TYPE(ENUM, Enum, enum_value);
+      HANDLE_TYPE(GROUP, Group, *message_value);
 #undef HANDLE_TYPE
       case FieldDescriptor::TYPE_MESSAGE:
         if (is_lazy) {
@@ -670,11 +669,11 @@
 
 bool ExtensionSet::ParseFieldMaybeLazily(
     int wire_type, int field_number, io::CodedInputStream* input,
-    ExtensionFinder* extension_finder,
-    MessageSetFieldSkipper* field_skipper) {
-  return ParseField(WireFormatLite::MakeTag(
-      field_number, static_cast<WireFormatLite::WireType>(wire_type)),
-                    input, extension_finder, field_skipper);
+    ExtensionFinder* extension_finder, MessageSetFieldSkipper* field_skipper) {
+  return ParseField(
+      WireFormatLite::MakeTag(field_number,
+                              static_cast<WireFormatLite::WireType>(wire_type)),
+      input, extension_finder, field_skipper);
 }
 
 bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input,
diff --git a/src/google/protobuf/extension_set_unittest.cc b/src/google/protobuf/extension_set_unittest.cc
index e33d14d..6dd6f7d 100644
--- a/src/google/protobuf/extension_set_unittest.cc
+++ b/src/google/protobuf/extension_set_unittest.cc
@@ -78,9 +78,9 @@
             &message.GetExtension(unittest::optionalgroup_extension));
   EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(),
             &message.GetExtension(unittest::optional_nested_message_extension));
-  EXPECT_EQ(&unittest::ForeignMessage::default_instance(),
-            &message.GetExtension(
-              unittest::optional_foreign_message_extension));
+  EXPECT_EQ(
+      &unittest::ForeignMessage::default_instance(),
+      &message.GetExtension(unittest::optional_foreign_message_extension));
   EXPECT_EQ(&unittest_import::ImportMessage::default_instance(),
             &message.GetExtension(unittest::optional_import_message_extension));
 }
@@ -114,9 +114,9 @@
             &message.GetExtension(unittest::optionalgroup_extension));
   EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
             &message.GetExtension(unittest::optional_nested_message_extension));
-  EXPECT_NE(&unittest::ForeignMessage::default_instance(),
-            &message.GetExtension(
-              unittest::optional_foreign_message_extension));
+  EXPECT_NE(
+      &unittest::ForeignMessage::default_instance(),
+      &message.GetExtension(unittest::optional_foreign_message_extension));
   EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
             &message.GetExtension(unittest::optional_import_message_extension));
 
@@ -133,7 +133,7 @@
 
   TestUtil::SetAllExtensions(&message);
   int64 original_value =
-    message.GetExtension(unittest::optional_int64_extension);
+      message.GetExtension(unittest::optional_int64_extension);
 
   // Clear the field and make sure it shows up as cleared.
   message.ClearExtension(unittest::optional_int64_extension);
@@ -151,20 +151,18 @@
 
 TEST(ExtensionSetTest, SetAllocatedExtension) {
   unittest::TestAllExtensions message;
-  EXPECT_FALSE(message.HasExtension(
-      unittest::optional_foreign_message_extension));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_foreign_message_extension));
   // Add a extension using SetAllocatedExtension
   unittest::ForeignMessage* foreign_message = new unittest::ForeignMessage();
   message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
                                 foreign_message);
-  EXPECT_TRUE(message.HasExtension(
-      unittest::optional_foreign_message_extension));
-  EXPECT_EQ(foreign_message,
-            message.MutableExtension(
-                unittest::optional_foreign_message_extension));
-  EXPECT_EQ(foreign_message,
-            &message.GetExtension(
-                unittest::optional_foreign_message_extension));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::optional_foreign_message_extension));
+  EXPECT_EQ(foreign_message, message.MutableExtension(
+                                 unittest::optional_foreign_message_extension));
+  EXPECT_EQ(foreign_message, &message.GetExtension(
+                                 unittest::optional_foreign_message_extension));
 
   // SetAllocatedExtension should delete the previously existing extension.
   // (We reply on unittest to check memory leaks for this case)
@@ -174,8 +172,8 @@
   // SetAllocatedExtension with a NULL parameter is equivalent to ClearExtenion.
   message.SetAllocatedExtension(unittest::optional_foreign_message_extension,
                                 NULL);
-  EXPECT_FALSE(message.HasExtension(
-      unittest::optional_foreign_message_extension));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_foreign_message_extension));
 }
 
 TEST(ExtensionSetTest, ReleaseExtension) {
@@ -186,8 +184,7 @@
   unittest::TestMessageSetExtension1* extension =
       new unittest::TestMessageSetExtension1();
   message.SetAllocatedExtension(
-      unittest::TestMessageSetExtension1::message_set_extension,
-      extension);
+      unittest::TestMessageSetExtension1::message_set_extension, extension);
   EXPECT_TRUE(message.HasExtension(
       unittest::TestMessageSetExtension1::message_set_extension));
   // Release the extension using ReleaseExtension
@@ -200,8 +197,7 @@
   // ReleaseExtension will return the underlying object even after
   // ClearExtension is called.
   message.SetAllocatedExtension(
-      unittest::TestMessageSetExtension1::message_set_extension,
-      extension);
+      unittest::TestMessageSetExtension1::message_set_extension, extension);
   message.ClearExtension(
       unittest::TestMessageSetExtension1::message_set_extension);
   released_extension = message.ReleaseExtension(
@@ -216,8 +212,7 @@
       Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
   unittest::ForeignMessage extension;
   message->UnsafeArenaSetAllocatedExtension(
-      unittest::optional_foreign_message_extension,
-      &extension);
+      unittest::optional_foreign_message_extension, &extension);
   // No copy when set.
   unittest::ForeignMessage* mutable_extension =
       message->MutableExtension(unittest::optional_foreign_message_extension);
@@ -227,21 +222,19 @@
       message->UnsafeArenaReleaseExtension(
           unittest::optional_foreign_message_extension);
   EXPECT_EQ(&extension, released_extension);
-  EXPECT_FALSE(message->HasExtension(
-      unittest::optional_foreign_message_extension));
+  EXPECT_FALSE(
+      message->HasExtension(unittest::optional_foreign_message_extension));
   // Set the ownership back and let the destructors run.  It should not take
   // ownership, so this should not crash.
   message->UnsafeArenaSetAllocatedExtension(
-      unittest::optional_foreign_message_extension,
-      &extension);
+      unittest::optional_foreign_message_extension, &extension);
 }
 
 TEST(ExtensionSetTest, UnsafeArenaSetAllocatedAndRelease) {
   unittest::TestAllExtensions message;
   unittest::ForeignMessage* extension = new unittest::ForeignMessage();
   message.UnsafeArenaSetAllocatedExtension(
-      unittest::optional_foreign_message_extension,
-      extension);
+      unittest::optional_foreign_message_extension, extension);
   // No copy when set.
   unittest::ForeignMessage* mutable_extension =
       message.MutableExtension(unittest::optional_foreign_message_extension);
@@ -251,13 +244,12 @@
       message.UnsafeArenaReleaseExtension(
           unittest::optional_foreign_message_extension);
   EXPECT_EQ(extension, released_extension);
-  EXPECT_FALSE(message.HasExtension(
-      unittest::optional_foreign_message_extension));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_foreign_message_extension));
   // Set the ownership back and let the destructors run.  It should take
   // ownership, so this should not leak.
   message.UnsafeArenaSetAllocatedExtension(
-      unittest::optional_foreign_message_extension,
-      extension);
+      unittest::optional_foreign_message_extension, extension);
 }
 
 TEST(ExtensionSetTest, ArenaUnsafeArenaReleaseOfHeapAlloc) {
@@ -265,17 +257,16 @@
   unittest::TestAllExtensions* message =
       Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
   unittest::ForeignMessage* extension = new unittest::ForeignMessage;
-  message->SetAllocatedExtension(
-      unittest::optional_foreign_message_extension,
-      extension);
+  message->SetAllocatedExtension(unittest::optional_foreign_message_extension,
+                                 extension);
   // The arena should maintain ownership of the heap allocated proto because we
   // used UnsafeArenaReleaseExtension.  The leak checker will ensure this.
   unittest::ForeignMessage* released_extension =
       message->UnsafeArenaReleaseExtension(
           unittest::optional_foreign_message_extension);
   EXPECT_EQ(extension, released_extension);
-  EXPECT_FALSE(message->HasExtension(
-      unittest::optional_foreign_message_extension));
+  EXPECT_FALSE(
+      message->HasExtension(unittest::optional_foreign_message_extension));
 }
 
 
@@ -345,10 +336,8 @@
   TestUtil::ExpectExtensionsClear(message2);
 
   // Swap two extensions.
-  fields.push_back(
-      reflection->FindKnownExtensionByNumber(12));
-  fields.push_back(
-      reflection->FindKnownExtensionByNumber(25));
+  fields.push_back(reflection->FindKnownExtensionByNumber(12));
+  fields.push_back(reflection->FindKnownExtensionByNumber(25));
   reflection->SwapFields(&message1, &message2, fields);
 
   EXPECT_TRUE(message1.HasExtension(unittest::optional_int32_extension));
@@ -427,23 +416,22 @@
   Arena arena;
   unittest::TestAllExtensions* message =
       Arena::CreateMessage<unittest::TestAllExtensions>(&arena);
-  EXPECT_FALSE(message->HasExtension(
-      unittest::optional_foreign_message_extension));
+  EXPECT_FALSE(
+      message->HasExtension(unittest::optional_foreign_message_extension));
   // Add a extension using SetAllocatedExtension
   unittest::ForeignMessage* foreign_message = new unittest::ForeignMessage();
   message->SetAllocatedExtension(unittest::optional_foreign_message_extension,
                                  foreign_message);
   // foreign_message is now owned by the arena.
-  EXPECT_EQ(foreign_message,
-            message->MutableExtension(
-                unittest::optional_foreign_message_extension));
+  EXPECT_EQ(foreign_message, message->MutableExtension(
+                                 unittest::optional_foreign_message_extension));
 
   // Underlying message is copied, and returned.
-  unittest::ForeignMessage* released_message = message->ReleaseExtension(
-      unittest::optional_foreign_message_extension);
+  unittest::ForeignMessage* released_message =
+      message->ReleaseExtension(unittest::optional_foreign_message_extension);
   delete released_message;
-  EXPECT_FALSE(message->HasExtension(
-      unittest::optional_foreign_message_extension));
+  EXPECT_FALSE(
+      message->HasExtension(unittest::optional_foreign_message_extension));
 }
 
 TEST(ExtensionSetTest, SwapExtensionBothFullWithArena) {
@@ -615,14 +603,20 @@
   source.set_optional_foreign_enum(unittest::FOREIGN_BAZ);
   source.SerializeToString(&data);
   EXPECT_TRUE(destination.ParseFromString(data));
-  EXPECT_TRUE(destination.GetExtension(
-      unittest::TestNestedExtension::optionalgroup_extension).has_a());
-  EXPECT_EQ(117, destination.GetExtension(
-      unittest::TestNestedExtension::optionalgroup_extension).a());
+  EXPECT_TRUE(
+      destination
+          .GetExtension(unittest::TestNestedExtension::optionalgroup_extension)
+          .has_a());
+  EXPECT_EQ(117, destination
+                     .GetExtension(
+                         unittest::TestNestedExtension::optionalgroup_extension)
+                     .a());
   EXPECT_TRUE(destination.HasExtension(
       unittest::TestNestedExtension::optional_foreign_enum_extension));
-  EXPECT_EQ(unittest::FOREIGN_BAZ, destination.GetExtension(
-      unittest::TestNestedExtension::optional_foreign_enum_extension));
+  EXPECT_EQ(
+      unittest::FOREIGN_BAZ,
+      destination.GetExtension(
+          unittest::TestNestedExtension::optional_foreign_enum_extension));
 }
 
 TEST(ExtensionSetTest, Parsing) {
@@ -743,36 +737,38 @@
 TEST(ExtensionSetTest, SpaceUsedExcludingSelf) {
   // Scalar primitive extensions should increase the extension set size by a
   // minimum of the size of the primitive type.
-#define TEST_SCALAR_EXTENSIONS_SPACE_USED(type, value)                        \
-  do {                                                                        \
-    unittest::TestAllExtensions message;                                      \
-    const int base_size = message.SpaceUsed();                                \
-    message.SetExtension(unittest::optional_##type##_extension, value);       \
-    int min_expected_size = base_size +                                       \
-        sizeof(message.GetExtension(unittest::optional_##type##_extension));  \
-    EXPECT_LE(min_expected_size, message.SpaceUsed());                        \
+#define TEST_SCALAR_EXTENSIONS_SPACE_USED(type, value)                       \
+  do {                                                                       \
+    unittest::TestAllExtensions message;                                     \
+    const int base_size = message.SpaceUsed();                               \
+    message.SetExtension(unittest::optional_##type##_extension, value);      \
+    int min_expected_size =                                                  \
+        base_size +                                                          \
+        sizeof(message.GetExtension(unittest::optional_##type##_extension)); \
+    EXPECT_LE(min_expected_size, message.SpaceUsed());                       \
   } while (0)
 
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(int32   , 101);
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(int64   , 102);
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(uint32  , 103);
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(uint64  , 104);
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(sint32  , 105);
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(sint64  , 106);
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed32 , 107);
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed64 , 108);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(int32, 101);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(int64, 102);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(uint32, 103);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(uint64, 104);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(sint32, 105);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(sint64, 106);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed32, 107);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed64, 108);
   TEST_SCALAR_EXTENSIONS_SPACE_USED(sfixed32, 109);
   TEST_SCALAR_EXTENSIONS_SPACE_USED(sfixed64, 110);
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(float   , 111);
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(double  , 112);
-  TEST_SCALAR_EXTENSIONS_SPACE_USED(bool    , true);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(float, 111);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(double, 112);
+  TEST_SCALAR_EXTENSIONS_SPACE_USED(bool, true);
 #undef TEST_SCALAR_EXTENSIONS_SPACE_USED
   {
     unittest::TestAllExtensions message;
     const int base_size = message.SpaceUsed();
     message.SetExtension(unittest::optional_nested_enum_extension,
                          unittest::TestAllTypes::FOO);
-    int min_expected_size = base_size +
+    int min_expected_size =
+        base_size +
         sizeof(message.GetExtension(unittest::optional_nested_enum_extension));
     EXPECT_LE(min_expected_size, message.SpaceUsed());
   }
@@ -794,8 +790,8 @@
     const int base_size = message.SpaceUsed();
     unittest::ForeignMessage foreign;
     foreign.set_c(42);
-    message.MutableExtension(unittest::optional_foreign_message_extension)->
-        CopyFrom(foreign);
+    message.MutableExtension(unittest::optional_foreign_message_extension)
+        ->CopyFrom(foreign);
     int min_expected_size = base_size + foreign.SpaceUsed();
     EXPECT_LE(min_expected_size, message.SpaceUsed());
   }
@@ -810,45 +806,49 @@
   //     SpaceUsed()
   //   - Adds a large number of values (requiring allocation in the repeated
   //     field), and ensures that that allocation is included in SpaceUsed()
-#define TEST_REPEATED_EXTENSIONS_SPACE_USED(type, cpptype, value)              \
-  do {                                                                         \
-    unittest::TestAllExtensions message;                                       \
-    const int base_size = message.SpaceUsed();                                 \
-    int min_expected_size = sizeof(RepeatedField<cpptype>) + base_size;        \
-    message.AddExtension(unittest::repeated_##type##_extension, value);        \
-    message.ClearExtension(unittest::repeated_##type##_extension);             \
-    const int empty_repeated_field_size = message.SpaceUsed();                 \
-    EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type;          \
-    message.AddExtension(unittest::repeated_##type##_extension, value);        \
-    message.AddExtension(unittest::repeated_##type##_extension, value);        \
-    EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type;        \
-    message.ClearExtension(unittest::repeated_##type##_extension);             \
-    const int old_capacity =                                                   \
-        message.GetRepeatedExtension(unittest::repeated_##type##_extension)    \
-        .Capacity();                                                           \
-    EXPECT_GE(old_capacity, kMinRepeatedFieldAllocationSize);                  \
-    for (int i = 0; i < 16; ++i) {                                             \
-      message.AddExtension(unittest::repeated_##type##_extension, value);      \
-    }                                                                          \
-    int expected_size = sizeof(cpptype) *                                      \
-        (message.GetRepeatedExtension(unittest::repeated_##type##_extension)   \
-         .Capacity() - old_capacity) + empty_repeated_field_size;              \
-    EXPECT_LE(expected_size, message.SpaceUsed()) << #type;                    \
+#define TEST_REPEATED_EXTENSIONS_SPACE_USED(type, cpptype, value)             \
+  do {                                                                        \
+    unittest::TestAllExtensions message;                                      \
+    const int base_size = message.SpaceUsed();                                \
+    int min_expected_size = sizeof(RepeatedField<cpptype>) + base_size;       \
+    message.AddExtension(unittest::repeated_##type##_extension, value);       \
+    message.ClearExtension(unittest::repeated_##type##_extension);            \
+    const int empty_repeated_field_size = message.SpaceUsed();                \
+    EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type;         \
+    message.AddExtension(unittest::repeated_##type##_extension, value);       \
+    message.AddExtension(unittest::repeated_##type##_extension, value);       \
+    EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type;       \
+    message.ClearExtension(unittest::repeated_##type##_extension);            \
+    const int old_capacity =                                                  \
+        message.GetRepeatedExtension(unittest::repeated_##type##_extension)   \
+            .Capacity();                                                      \
+    EXPECT_GE(old_capacity, kMinRepeatedFieldAllocationSize);                 \
+    for (int i = 0; i < 16; ++i) {                                            \
+      message.AddExtension(unittest::repeated_##type##_extension, value);     \
+    }                                                                         \
+    int expected_size =                                                       \
+        sizeof(cpptype) *                                                     \
+            (message                                                          \
+                 .GetRepeatedExtension(unittest::repeated_##type##_extension) \
+                 .Capacity() -                                                \
+             old_capacity) +                                                  \
+        empty_repeated_field_size;                                            \
+    EXPECT_LE(expected_size, message.SpaceUsed()) << #type;                   \
   } while (0)
 
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(int32   , int32 , 101);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(int64   , int64 , 102);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32  , uint32, 103);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64  , uint64, 104);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32  , int32 , 105);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64  , int64 , 106);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32 , uint32, 107);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64 , uint64, 108);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed32, int32 , 109);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed64, int64 , 110);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(float   , float , 111);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(double  , double, 112);
-  TEST_REPEATED_EXTENSIONS_SPACE_USED(bool    , bool  , true);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(int32, int32, 101);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(int64, int64, 102);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32, uint32, 103);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64, uint64, 104);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32, int32, 105);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64, int64, 106);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32, uint32, 107);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64, uint64, 108);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed32, int32, 109);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed64, int64, 110);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(float, float, 111);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(double, double, 112);
+  TEST_REPEATED_EXTENSIONS_SPACE_USED(bool, bool, true);
   TEST_REPEATED_EXTENSIONS_SPACE_USED(nested_enum, int,
                                       unittest::TestAllTypes::FOO);
 #undef TEST_REPEATED_EXTENSIONS_SPACE_USED
@@ -864,21 +864,21 @@
     for (int i = 0; i < 16; ++i) {
       message.AddExtension(unittest::repeated_string_extension, value);
     }
-    min_expected_size += (sizeof(value) + value.size()) *
-        (16 - kMinRepeatedFieldAllocationSize);
+    min_expected_size +=
+        (sizeof(value) + value.size()) * (16 - kMinRepeatedFieldAllocationSize);
     EXPECT_LE(min_expected_size, message.SpaceUsed());
   }
   // Repeated messages
   {
     unittest::TestAllExtensions message;
     const int base_size = message.SpaceUsed();
-    int min_expected_size = sizeof(RepeatedPtrField<unittest::ForeignMessage>) +
-        base_size;
+    int min_expected_size =
+        sizeof(RepeatedPtrField<unittest::ForeignMessage>) + base_size;
     unittest::ForeignMessage prototype;
     prototype.set_c(2);
     for (int i = 0; i < 16; ++i) {
-      message.AddExtension(unittest::repeated_foreign_message_extension)->
-          CopyFrom(prototype);
+      message.AddExtension(unittest::repeated_foreign_message_extension)
+          ->CopyFrom(prototype);
     }
     min_expected_size +=
         (16 - kMinRepeatedFieldAllocationSize) * prototype.SpaceUsed();
@@ -887,7 +887,7 @@
 }
 
 // N.B.: We do not test range-based for here because we remain C++03 compatible.
-template<typename T, typename M, typename ID>
+template <typename T, typename M, typename ID>
 inline T SumAllExtensions(const M& message, ID extension, T zero) {
   T sum = zero;
   typename RepeatedField<T>::const_iterator iter =
@@ -900,12 +900,11 @@
   return sum;
 }
 
-template<typename T, typename M, typename ID>
-inline void IncAllExtensions(M* message, ID extension,
-                          T val) {
+template <typename T, typename M, typename ID>
+inline void IncAllExtensions(M* message, ID extension, T val) {
   typename RepeatedField<T>::iterator iter =
       message->MutableRepeatedExtension(extension)->begin();
-  typename RepeatedField<T>::iterator end  =
+  typename RepeatedField<T>::iterator end =
       message->MutableRepeatedExtension(extension)->end();
   for (; iter != end; ++iter) {
     *iter += val;
@@ -916,14 +915,19 @@
   unittest::TestAllExtensions message;
 
   // Test empty repeated-field case (b/12926163)
-  ASSERT_EQ(0, message.GetRepeatedExtension(
-      unittest::repeated_int32_extension).size());
-  ASSERT_EQ(0, message.GetRepeatedExtension(
-      unittest::repeated_nested_enum_extension).size());
-  ASSERT_EQ(0, message.GetRepeatedExtension(
-      unittest::repeated_string_extension).size());
-  ASSERT_EQ(0, message.GetRepeatedExtension(
-      unittest::repeated_nested_message_extension).size());
+  ASSERT_EQ(
+      0,
+      message.GetRepeatedExtension(unittest::repeated_int32_extension).size());
+  ASSERT_EQ(
+      0, message.GetRepeatedExtension(unittest::repeated_nested_enum_extension)
+             .size());
+  ASSERT_EQ(
+      0,
+      message.GetRepeatedExtension(unittest::repeated_string_extension).size());
+  ASSERT_EQ(
+      0,
+      message.GetRepeatedExtension(unittest::repeated_nested_message_extension)
+          .size());
 
   unittest::TestAllTypes::NestedMessage nested_message;
   nested_message.set_bb(42);
@@ -949,111 +953,110 @@
                          std::string("test"));
     message.AddExtension(unittest::repeated_bytes_extension,
                          std::string("test\xFF"));
-    message.AddExtension(
-        unittest::repeated_nested_message_extension)->CopyFrom(nested_message);
-    message.AddExtension(unittest::repeated_nested_enum_extension,
-                         nested_enum);
+    message.AddExtension(unittest::repeated_nested_message_extension)
+        ->CopyFrom(nested_message);
+    message.AddExtension(unittest::repeated_nested_enum_extension, nested_enum);
   }
 
-  ASSERT_EQ(10, SumAllExtensions<int32>(
-      message, unittest::repeated_int32_extension, 0));
-  IncAllExtensions<int32>(
-      &message, unittest::repeated_int32_extension, 1);
-  ASSERT_EQ(20, SumAllExtensions<int32>(
-      message, unittest::repeated_int32_extension, 0));
+  ASSERT_EQ(10, SumAllExtensions<int32>(message,
+                                        unittest::repeated_int32_extension, 0));
+  IncAllExtensions<int32>(&message, unittest::repeated_int32_extension, 1);
+  ASSERT_EQ(20, SumAllExtensions<int32>(message,
+                                        unittest::repeated_int32_extension, 0));
 
-  ASSERT_EQ(20, SumAllExtensions<int64>(
-      message, unittest::repeated_int64_extension, 0));
-  IncAllExtensions<int64>(
-      &message, unittest::repeated_int64_extension, 1);
-  ASSERT_EQ(30, SumAllExtensions<int64>(
-      message, unittest::repeated_int64_extension, 0));
+  ASSERT_EQ(20, SumAllExtensions<int64>(message,
+                                        unittest::repeated_int64_extension, 0));
+  IncAllExtensions<int64>(&message, unittest::repeated_int64_extension, 1);
+  ASSERT_EQ(30, SumAllExtensions<int64>(message,
+                                        unittest::repeated_int64_extension, 0));
 
   ASSERT_EQ(30, SumAllExtensions<uint32>(
-      message, unittest::repeated_uint32_extension, 0));
-  IncAllExtensions<uint32>(
-      &message, unittest::repeated_uint32_extension, 1);
+                    message, unittest::repeated_uint32_extension, 0));
+  IncAllExtensions<uint32>(&message, unittest::repeated_uint32_extension, 1);
   ASSERT_EQ(40, SumAllExtensions<uint32>(
-      message, unittest::repeated_uint32_extension, 0));
+                    message, unittest::repeated_uint32_extension, 0));
 
   ASSERT_EQ(40, SumAllExtensions<uint64>(
-      message, unittest::repeated_uint64_extension, 0));
-  IncAllExtensions<uint64>(
-      &message, unittest::repeated_uint64_extension, 1);
+                    message, unittest::repeated_uint64_extension, 0));
+  IncAllExtensions<uint64>(&message, unittest::repeated_uint64_extension, 1);
   ASSERT_EQ(50, SumAllExtensions<uint64>(
-      message, unittest::repeated_uint64_extension, 0));
+                    message, unittest::repeated_uint64_extension, 0));
 
   ASSERT_EQ(50, SumAllExtensions<int32>(
-      message, unittest::repeated_sint32_extension, 0));
-  IncAllExtensions<int32>(
-      &message, unittest::repeated_sint32_extension, 1);
+                    message, unittest::repeated_sint32_extension, 0));
+  IncAllExtensions<int32>(&message, unittest::repeated_sint32_extension, 1);
   ASSERT_EQ(60, SumAllExtensions<int32>(
-      message, unittest::repeated_sint32_extension, 0));
+                    message, unittest::repeated_sint32_extension, 0));
 
   ASSERT_EQ(60, SumAllExtensions<int64>(
-      message, unittest::repeated_sint64_extension, 0));
-  IncAllExtensions<int64>(
-      &message, unittest::repeated_sint64_extension, 1);
+                    message, unittest::repeated_sint64_extension, 0));
+  IncAllExtensions<int64>(&message, unittest::repeated_sint64_extension, 1);
   ASSERT_EQ(70, SumAllExtensions<int64>(
-      message, unittest::repeated_sint64_extension, 0));
+                    message, unittest::repeated_sint64_extension, 0));
 
   ASSERT_EQ(70, SumAllExtensions<uint32>(
-      message, unittest::repeated_fixed32_extension, 0));
-  IncAllExtensions<uint32>(
-      &message, unittest::repeated_fixed32_extension, 1);
+                    message, unittest::repeated_fixed32_extension, 0));
+  IncAllExtensions<uint32>(&message, unittest::repeated_fixed32_extension, 1);
   ASSERT_EQ(80, SumAllExtensions<uint32>(
-      message, unittest::repeated_fixed32_extension, 0));
+                    message, unittest::repeated_fixed32_extension, 0));
 
   ASSERT_EQ(80, SumAllExtensions<uint64>(
-      message, unittest::repeated_fixed64_extension, 0));
-  IncAllExtensions<uint64>(
-      &message, unittest::repeated_fixed64_extension, 1);
+                    message, unittest::repeated_fixed64_extension, 0));
+  IncAllExtensions<uint64>(&message, unittest::repeated_fixed64_extension, 1);
   ASSERT_EQ(90, SumAllExtensions<uint64>(
-      message, unittest::repeated_fixed64_extension, 0));
+                    message, unittest::repeated_fixed64_extension, 0));
 
   // Usually, floating-point arithmetic cannot be trusted to be exact, so it is
   // a Bad Idea to assert equality in a test like this. However, we're dealing
   // with integers with a small number of significant mantissa bits, so we
   // should actually have exact precision here.
-  ASSERT_EQ(90, SumAllExtensions<float>(
-      message, unittest::repeated_float_extension, 0));
-  IncAllExtensions<float>(
-      &message, unittest::repeated_float_extension, 1);
+  ASSERT_EQ(90, SumAllExtensions<float>(message,
+                                        unittest::repeated_float_extension, 0));
+  IncAllExtensions<float>(&message, unittest::repeated_float_extension, 1);
   ASSERT_EQ(100, SumAllExtensions<float>(
-      message, unittest::repeated_float_extension, 0));
+                     message, unittest::repeated_float_extension, 0));
 
   ASSERT_EQ(100, SumAllExtensions<double>(
-      message, unittest::repeated_double_extension, 0));
-  IncAllExtensions<double>(
-      &message, unittest::repeated_double_extension, 1);
+                     message, unittest::repeated_double_extension, 0));
+  IncAllExtensions<double>(&message, unittest::repeated_double_extension, 1);
   ASSERT_EQ(110, SumAllExtensions<double>(
-      message, unittest::repeated_double_extension, 0));
+                     message, unittest::repeated_double_extension, 0));
 
   RepeatedPtrField<std::string>::iterator string_iter;
   RepeatedPtrField<std::string>::iterator string_end;
-  for (string_iter = message.MutableRepeatedExtension(
-          unittest::repeated_string_extension)->begin(),
-       string_end  = message.MutableRepeatedExtension(
-           unittest::repeated_string_extension)->end();
+  for (string_iter =
+           message
+               .MutableRepeatedExtension(unittest::repeated_string_extension)
+               ->begin(),
+      string_end =
+           message
+               .MutableRepeatedExtension(unittest::repeated_string_extension)
+               ->end();
        string_iter != string_end; ++string_iter) {
     *string_iter += "test";
   }
   RepeatedPtrField<std::string>::const_iterator string_const_iter;
   RepeatedPtrField<std::string>::const_iterator string_const_end;
-  for (string_const_iter = message.GetRepeatedExtension(
-           unittest::repeated_string_extension).begin(),
-       string_const_end  = message.GetRepeatedExtension(
-           unittest::repeated_string_extension).end();
+  for (string_const_iter =
+           message.GetRepeatedExtension(unittest::repeated_string_extension)
+               .begin(),
+      string_const_end =
+           message.GetRepeatedExtension(unittest::repeated_string_extension)
+               .end();
        string_iter != string_end; ++string_iter) {
     ASSERT_TRUE(*string_iter == "testtest");
   }
 
   RepeatedField<unittest::TestAllTypes_NestedEnum>::iterator enum_iter;
   RepeatedField<unittest::TestAllTypes_NestedEnum>::iterator enum_end;
-  for (enum_iter = message.MutableRepeatedExtension(
-           unittest::repeated_nested_enum_extension)->begin(),
-       enum_end  = message.MutableRepeatedExtension(
-           unittest::repeated_nested_enum_extension)->end();
+  for (enum_iter = message
+                       .MutableRepeatedExtension(
+                           unittest::repeated_nested_enum_extension)
+                       ->begin(),
+      enum_end = message
+                     .MutableRepeatedExtension(
+                         unittest::repeated_nested_enum_extension)
+                     ->end();
        enum_iter != enum_end; ++enum_iter) {
     *enum_iter = unittest::TestAllTypes::NestedEnum_MAX;
   }
@@ -1073,25 +1076,31 @@
     ASSERT_EQ(*enum_const_iter, unittest::TestAllTypes::NestedEnum_MAX);
   }
 
-  RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::iterator
-      msg_iter;
-  RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::iterator
-      msg_end;
-  for (msg_iter = message.MutableRepeatedExtension(
-           unittest::repeated_nested_message_extension)->begin(),
-       msg_end  = message.MutableRepeatedExtension(
-           unittest::repeated_nested_message_extension)->end();
+  RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::iterator msg_iter;
+  RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::iterator msg_end;
+  for (msg_iter = message
+                      .MutableRepeatedExtension(
+                          unittest::repeated_nested_message_extension)
+                      ->begin(),
+      msg_end = message
+                    .MutableRepeatedExtension(
+                        unittest::repeated_nested_message_extension)
+                    ->end();
        msg_iter != msg_end; ++msg_iter) {
     msg_iter->set_bb(1234);
   }
-  RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::
-      const_iterator msg_const_iter;
-  RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::
-      const_iterator msg_const_end;
-  for (msg_const_iter = message.GetRepeatedExtension(
-           unittest::repeated_nested_message_extension).begin(),
-       msg_const_end  = message.GetRepeatedExtension(
-           unittest::repeated_nested_message_extension).end();
+  RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::const_iterator
+      msg_const_iter;
+  RepeatedPtrField<unittest::TestAllTypes_NestedMessage>::const_iterator
+      msg_const_end;
+  for (msg_const_iter = message
+                            .GetRepeatedExtension(
+                                unittest::repeated_nested_message_extension)
+                            .begin(),
+      msg_const_end = message
+                          .GetRepeatedExtension(
+                              unittest::repeated_nested_message_extension)
+                          .end();
        msg_const_iter != msg_const_end; ++msg_const_iter) {
     ASSERT_EQ(msg_const_iter->bb(), 1234);
   }
@@ -1099,30 +1108,30 @@
   // Test range-based for as well, but only if compiled as C++11.
 #if __cplusplus >= 201103L
   // Test one primitive field.
-  for (auto& x : *message.MutableRepeatedExtension(
-          unittest::repeated_int32_extension)) {
+  for (auto& x :
+       *message.MutableRepeatedExtension(unittest::repeated_int32_extension)) {
     x = 4321;
   }
-  for (const auto& x : message.GetRepeatedExtension(
-          unittest::repeated_int32_extension)) {
+  for (const auto& x :
+       message.GetRepeatedExtension(unittest::repeated_int32_extension)) {
     ASSERT_EQ(x, 4321);
   }
   // Test one string field.
-  for (auto& x : *message.MutableRepeatedExtension(
-          unittest::repeated_string_extension)) {
+  for (auto& x :
+       *message.MutableRepeatedExtension(unittest::repeated_string_extension)) {
     x = "test_range_based_for";
   }
-  for (const auto& x : message.GetRepeatedExtension(
-          unittest::repeated_string_extension)) {
+  for (const auto& x :
+       message.GetRepeatedExtension(unittest::repeated_string_extension)) {
     ASSERT_TRUE(x == "test_range_based_for");
   }
   // Test one message field.
   for (auto& x : *message.MutableRepeatedExtension(
-          unittest::repeated_nested_message_extension)) {
+           unittest::repeated_nested_message_extension)) {
     x.set_bb(4321);
   }
   for (const auto& x : *message.MutableRepeatedExtension(
-          unittest::repeated_nested_message_extension)) {
+           unittest::repeated_nested_message_extension)) {
     ASSERT_EQ(x.bb(), 4321);
   }
 #endif
@@ -1132,12 +1141,13 @@
 TEST(ExtensionSetTest, AbsentExtension) {
   unittest::TestAllExtensions message;
   message.MutableRepeatedExtension(unittest::repeated_nested_message_extension)
-      ->Add()->set_bb(123);
-  ASSERT_EQ(1, message.ExtensionSize(
-      unittest::repeated_nested_message_extension));
-  EXPECT_EQ(
-      123, message.GetExtension(
-          unittest::repeated_nested_message_extension, 0).bb());
+      ->Add()
+      ->set_bb(123);
+  ASSERT_EQ(1,
+            message.ExtensionSize(unittest::repeated_nested_message_extension));
+  EXPECT_EQ(123,
+            message.GetExtension(unittest::repeated_nested_message_extension, 0)
+                .bb());
 }
 
 #ifdef PROTOBUF_HAS_DEATH_TEST
@@ -1145,9 +1155,9 @@
 TEST(ExtensionSetTest, InvalidEnumDeath) {
   unittest::TestAllExtensions message;
   EXPECT_DEBUG_DEATH(
-    message.SetExtension(unittest::optional_foreign_enum_extension,
-                         static_cast<unittest::ForeignEnum>(53)),
-    "IsValid");
+      message.SetExtension(unittest::optional_foreign_enum_extension,
+                           static_cast<unittest::ForeignEnum>(53)),
+      "IsValid");
 }
 
 #endif  // PROTOBUF_HAS_DEATH_TEST
@@ -1223,8 +1233,8 @@
 
     // An unknown enum value (for a known field).
     message.mutable_unknown_fields()->AddVarint(
-      unittest::TestDynamicExtensions::kDynamicEnumExtensionFieldNumber,
-      12345);
+        unittest::TestDynamicExtensions::kDynamicEnumExtensionFieldNumber,
+        12345);
     // A regular unknown field.
     message.mutable_unknown_fields()->AddLengthDelimited(54321, "unknown");
 
@@ -1244,24 +1254,24 @@
 
   // Can we print it?
   EXPECT_EQ(
-    "[dynamic_extensions.scalar_extension]: 123\n"
-    "[dynamic_extensions.enum_extension]: FOREIGN_BAR\n"
-    "[dynamic_extensions.dynamic_enum_extension]: DYNAMIC_BAZ\n"
-    "[dynamic_extensions.message_extension] {\n"
-    "  c: 456\n"
-    "}\n"
-    "[dynamic_extensions.dynamic_message_extension] {\n"
-    "  dynamic_field: 789\n"
-    "}\n"
-    "[dynamic_extensions.repeated_extension]: \"foo\"\n"
-    "[dynamic_extensions.repeated_extension]: \"bar\"\n"
-    "[dynamic_extensions.packed_extension]: 12\n"
-    "[dynamic_extensions.packed_extension]: -34\n"
-    "[dynamic_extensions.packed_extension]: 56\n"
-    "[dynamic_extensions.packed_extension]: -78\n"
-    "2002: 12345\n"
-    "54321: \"unknown\"\n",
-    message.DebugString());
+      "[dynamic_extensions.scalar_extension]: 123\n"
+      "[dynamic_extensions.enum_extension]: FOREIGN_BAR\n"
+      "[dynamic_extensions.dynamic_enum_extension]: DYNAMIC_BAZ\n"
+      "[dynamic_extensions.message_extension] {\n"
+      "  c: 456\n"
+      "}\n"
+      "[dynamic_extensions.dynamic_message_extension] {\n"
+      "  dynamic_field: 789\n"
+      "}\n"
+      "[dynamic_extensions.repeated_extension]: \"foo\"\n"
+      "[dynamic_extensions.repeated_extension]: \"bar\"\n"
+      "[dynamic_extensions.packed_extension]: 12\n"
+      "[dynamic_extensions.packed_extension]: -34\n"
+      "[dynamic_extensions.packed_extension]: 56\n"
+      "[dynamic_extensions.packed_extension]: -78\n"
+      "2002: 12345\n"
+      "54321: \"unknown\"\n",
+      message.DebugString());
 
   // Can we serialize it?
   EXPECT_TRUE(
@@ -1302,9 +1312,8 @@
         file->FindExtensionByName("dynamic_message_extension");
     ASSERT_TRUE(dynamic_message_extension != NULL);
     const Message& parent = unittest::TestAllExtensions::default_instance();
-    const Message& sub_message =
-        parent.GetReflection()->GetMessage(parent, dynamic_message_extension,
-                                           &dynamic_factory);
+    const Message& sub_message = parent.GetReflection()->GetMessage(
+        parent, dynamic_message_extension, &dynamic_factory);
     const Message* prototype =
         dynamic_factory.GetPrototype(dynamic_message_extension->message_type());
     EXPECT_EQ(prototype, &sub_message);
diff --git a/src/google/protobuf/field_mask.pb.cc b/src/google/protobuf/field_mask.pb.cc
index 0c54eb7..e360a6d 100644
--- a/src/google/protobuf/field_mask.pb.cc
+++ b/src/google/protobuf/field_mask.pb.cc
@@ -36,10 +36,6 @@
 PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_FieldMask_google_2fprotobuf_2ffield_5fmask_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsFieldMask_google_2fprotobuf_2ffield_5fmask_2eproto}, {}};
 
-void InitDefaults_google_2fprotobuf_2ffield_5fmask_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FieldMask_google_2fprotobuf_2ffield_5fmask_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2ffield_5fmask_2eproto[1];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2ffield_5fmask_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2ffield_5fmask_2eproto = nullptr;
@@ -75,8 +71,7 @@
   "rotobuf.WellKnownTypesb\006proto3"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2ffield_5fmask_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2ffield_5fmask_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2ffield_5fmask_2eproto,
   "google/protobuf/field_mask.proto", &assign_descriptors_table_google_2fprotobuf_2ffield_5fmask_2eproto, 230,
 };
 
@@ -84,6 +79,7 @@
   static constexpr ::PROTOBUF_NAMESPACE_ID::internal::InitFunc deps[1] =
   {
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FieldMask_google_2fprotobuf_2ffield_5fmask_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2ffield_5fmask_2eproto, deps, 0);
 }
 
@@ -165,35 +161,43 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* FieldMask::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated string paths = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(add_paths(), ptr, ctx, "google.protobuf.FieldMask.paths");
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 10 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 10) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool FieldMask::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/generated_enum_reflection.h b/src/google/protobuf/generated_enum_reflection.h
index c683368..c25e51b 100644
--- a/src/google/protobuf/generated_enum_reflection.h
+++ b/src/google/protobuf/generated_enum_reflection.h
@@ -41,8 +41,8 @@
 
 #include <string>
 
-#include <google/protobuf/port.h>
 #include <google/protobuf/generated_enum_util.h>
+#include <google/protobuf/port.h>
 
 #ifdef SWIG
 #error "You cannot SWIG proto headers"
@@ -52,7 +52,7 @@
 
 namespace google {
 namespace protobuf {
-  class EnumDescriptor;
+class EnumDescriptor;
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/generated_enum_util.h b/src/google/protobuf/generated_enum_util.h
index 5c4dd65..55db124 100644
--- a/src/google/protobuf/generated_enum_util.h
+++ b/src/google/protobuf/generated_enum_util.h
@@ -42,7 +42,8 @@
 
 // This type trait can be used to cause templates to only match proto2 enum
 // types.
-template <typename T> struct is_proto_enum : ::std::false_type {};
+template <typename T>
+struct is_proto_enum : ::std::false_type {};
 
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc
index 443a5db..9b2209a 100644
--- a/src/google/protobuf/generated_message_reflection.cc
+++ b/src/google/protobuf/generated_message_reflection.cc
@@ -59,9 +59,7 @@
 namespace internal {
 
 namespace {
-bool IsMapFieldInApi(const FieldDescriptor* field) {
-  return field->is_map();
-}
+bool IsMapFieldInApi(const FieldDescriptor* field) { return field->is_map(); }
 }  // anonymous namespace
 
 bool ParseNamedEnum(const EnumDescriptor* descriptor, const std::string& name,
@@ -99,89 +97,102 @@
   return *GetConstPointerAtOffset<To>(&message, offset);
 }
 
-void ReportReflectionUsageError(
-    const Descriptor* descriptor, const FieldDescriptor* field,
-    const char* method, const char* description) {
-  GOOGLE_LOG(FATAL)
-    << "Protocol Buffer reflection usage error:\n"
-       "  Method      : google::protobuf::Reflection::" << method << "\n"
-       "  Message type: " << descriptor->full_name() << "\n"
-       "  Field       : " << field->full_name() << "\n"
-       "  Problem     : " << description;
+void ReportReflectionUsageError(const Descriptor* descriptor,
+                                const FieldDescriptor* field,
+                                const char* method, const char* description) {
+  GOOGLE_LOG(FATAL) << "Protocol Buffer reflection usage error:\n"
+                "  Method      : google::protobuf::Reflection::"
+             << method
+             << "\n"
+                "  Message type: "
+             << descriptor->full_name()
+             << "\n"
+                "  Field       : "
+             << field->full_name()
+             << "\n"
+                "  Problem     : "
+             << description;
 }
 
 const char* cpptype_names_[FieldDescriptor::MAX_CPPTYPE + 1] = {
-  "INVALID_CPPTYPE",
-  "CPPTYPE_INT32",
-  "CPPTYPE_INT64",
-  "CPPTYPE_UINT32",
-  "CPPTYPE_UINT64",
-  "CPPTYPE_DOUBLE",
-  "CPPTYPE_FLOAT",
-  "CPPTYPE_BOOL",
-  "CPPTYPE_ENUM",
-  "CPPTYPE_STRING",
-  "CPPTYPE_MESSAGE"
-};
+    "INVALID_CPPTYPE", "CPPTYPE_INT32",  "CPPTYPE_INT64",  "CPPTYPE_UINT32",
+    "CPPTYPE_UINT64",  "CPPTYPE_DOUBLE", "CPPTYPE_FLOAT",  "CPPTYPE_BOOL",
+    "CPPTYPE_ENUM",    "CPPTYPE_STRING", "CPPTYPE_MESSAGE"};
 
 static void ReportReflectionUsageTypeError(
     const Descriptor* descriptor, const FieldDescriptor* field,
-    const char* method,
-    FieldDescriptor::CppType expected_type) {
+    const char* method, FieldDescriptor::CppType expected_type) {
   GOOGLE_LOG(FATAL)
-    << "Protocol Buffer reflection usage error:\n"
-       "  Method      : google::protobuf::Reflection::" << method << "\n"
-       "  Message type: " << descriptor->full_name() << "\n"
-       "  Field       : " << field->full_name() << "\n"
-       "  Problem     : Field is not the right type for this message:\n"
-       "    Expected  : " << cpptype_names_[expected_type] << "\n"
-       "    Field type: " << cpptype_names_[field->cpp_type()];
+      << "Protocol Buffer reflection usage error:\n"
+         "  Method      : google::protobuf::Reflection::"
+      << method
+      << "\n"
+         "  Message type: "
+      << descriptor->full_name()
+      << "\n"
+         "  Field       : "
+      << field->full_name()
+      << "\n"
+         "  Problem     : Field is not the right type for this message:\n"
+         "    Expected  : "
+      << cpptype_names_[expected_type]
+      << "\n"
+         "    Field type: "
+      << cpptype_names_[field->cpp_type()];
 }
 
 static void ReportReflectionUsageEnumTypeError(
     const Descriptor* descriptor, const FieldDescriptor* field,
     const char* method, const EnumValueDescriptor* value) {
-  GOOGLE_LOG(FATAL)
-    << "Protocol Buffer reflection usage error:\n"
-       "  Method      : google::protobuf::Reflection::" << method << "\n"
-       "  Message type: " << descriptor->full_name() << "\n"
-       "  Field       : " << field->full_name() << "\n"
-       "  Problem     : Enum value did not match field type:\n"
-       "    Expected  : " << field->enum_type()->full_name() << "\n"
-       "    Actual    : " << value->full_name();
+  GOOGLE_LOG(FATAL) << "Protocol Buffer reflection usage error:\n"
+                "  Method      : google::protobuf::Reflection::"
+             << method
+             << "\n"
+                "  Message type: "
+             << descriptor->full_name()
+             << "\n"
+                "  Field       : "
+             << field->full_name()
+             << "\n"
+                "  Problem     : Enum value did not match field type:\n"
+                "    Expected  : "
+             << field->enum_type()->full_name()
+             << "\n"
+                "    Actual    : "
+             << value->full_name();
 }
 
-#define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION)                      \
-  if (!(CONDITION))                                                            \
-    ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION)
-#define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION)                        \
+#define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION) \
+  if (!(CONDITION))                                       \
+  ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION)
+#define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION) \
   USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION)
-#define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION)                        \
+#define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION) \
   USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION)
 
-#define USAGE_CHECK_TYPE(METHOD, CPPTYPE)                                      \
-  if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE)                 \
-    ReportReflectionUsageTypeError(descriptor_, field, #METHOD,                \
-                                   FieldDescriptor::CPPTYPE_##CPPTYPE)
+#define USAGE_CHECK_TYPE(METHOD, CPPTYPE)                      \
+  if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE) \
+  ReportReflectionUsageTypeError(descriptor_, field, #METHOD,  \
+                                 FieldDescriptor::CPPTYPE_##CPPTYPE)
 
-#define USAGE_CHECK_ENUM_VALUE(METHOD)                                         \
-  if (value->type() != field->enum_type())                                     \
-    ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value)
+#define USAGE_CHECK_ENUM_VALUE(METHOD)     \
+  if (value->type() != field->enum_type()) \
+  ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value)
 
-#define USAGE_CHECK_MESSAGE_TYPE(METHOD)                                       \
-  USAGE_CHECK_EQ(field->containing_type(), descriptor_,                        \
-                 METHOD, "Field does not match message type.");
-#define USAGE_CHECK_SINGULAR(METHOD)                                           \
-  USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD,      \
+#define USAGE_CHECK_MESSAGE_TYPE(METHOD)                        \
+  USAGE_CHECK_EQ(field->containing_type(), descriptor_, METHOD, \
+                 "Field does not match message type.");
+#define USAGE_CHECK_SINGULAR(METHOD)                                      \
+  USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \
                  "Field is repeated; the method requires a singular field.")
-#define USAGE_CHECK_REPEATED(METHOD)                                           \
-  USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD,      \
+#define USAGE_CHECK_REPEATED(METHOD)                                      \
+  USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \
                  "Field is singular; the method requires a repeated field.")
 
-#define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE)                       \
-    USAGE_CHECK_MESSAGE_TYPE(METHOD);                                 \
-    USAGE_CHECK_##LABEL(METHOD);                                      \
-    USAGE_CHECK_TYPE(METHOD, CPPTYPE)
+#define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE) \
+  USAGE_CHECK_MESSAGE_TYPE(METHOD);             \
+  USAGE_CHECK_##LABEL(METHOD);                  \
+  USAGE_CHECK_TYPE(METHOD, CPPTYPE)
 
 }  // namespace
 
@@ -226,20 +237,20 @@
     const FieldDescriptor* field = descriptor_->field(i);
     if (field->is_repeated()) {
       switch (field->cpp_type()) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
-        case FieldDescriptor::CPPTYPE_##UPPERCASE :                           \
-          total_size += GetRaw<RepeatedField<LOWERCASE> >(message, field)     \
-                          .SpaceUsedExcludingSelfLong();                      \
-          break
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                           \
+  case FieldDescriptor::CPPTYPE_##UPPERCASE:                        \
+    total_size += GetRaw<RepeatedField<LOWERCASE> >(message, field) \
+                      .SpaceUsedExcludingSelfLong();                \
+    break
 
-        HANDLE_TYPE( INT32,  int32);
-        HANDLE_TYPE( INT64,  int64);
+        HANDLE_TYPE(INT32, int32);
+        HANDLE_TYPE(INT64, int64);
         HANDLE_TYPE(UINT32, uint32);
         HANDLE_TYPE(UINT64, uint64);
         HANDLE_TYPE(DOUBLE, double);
-        HANDLE_TYPE( FLOAT,  float);
-        HANDLE_TYPE(  BOOL,   bool);
-        HANDLE_TYPE(  ENUM,    int);
+        HANDLE_TYPE(FLOAT, float);
+        HANDLE_TYPE(BOOL, bool);
+        HANDLE_TYPE(ENUM, int);
 #undef HANDLE_TYPE
 
         case FieldDescriptor::CPPTYPE_STRING:
@@ -272,14 +283,14 @@
         continue;
       }
       switch (field->cpp_type()) {
-        case FieldDescriptor::CPPTYPE_INT32 :
-        case FieldDescriptor::CPPTYPE_INT64 :
+        case FieldDescriptor::CPPTYPE_INT32:
+        case FieldDescriptor::CPPTYPE_INT64:
         case FieldDescriptor::CPPTYPE_UINT32:
         case FieldDescriptor::CPPTYPE_UINT64:
         case FieldDescriptor::CPPTYPE_DOUBLE:
-        case FieldDescriptor::CPPTYPE_FLOAT :
-        case FieldDescriptor::CPPTYPE_BOOL  :
-        case FieldDescriptor::CPPTYPE_ENUM  :
+        case FieldDescriptor::CPPTYPE_FLOAT:
+        case FieldDescriptor::CPPTYPE_BOOL:
+        case FieldDescriptor::CPPTYPE_ENUM:
           // Field is inline, so we've already counted it.
           break;
 
@@ -331,26 +342,24 @@
   return total_size;
 }
 
-void GeneratedMessageReflection::SwapField(
-    Message* message1,
-    Message* message2,
-    const FieldDescriptor* field) const {
+void GeneratedMessageReflection::SwapField(Message* message1, Message* message2,
+                                           const FieldDescriptor* field) const {
   if (field->is_repeated()) {
     switch (field->cpp_type()) {
-#define SWAP_ARRAYS(CPPTYPE, TYPE)                                      \
-      case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
-        MutableRaw<RepeatedField<TYPE> >(message1, field)->Swap(        \
-            MutableRaw<RepeatedField<TYPE> >(message2, field));         \
-        break;
+#define SWAP_ARRAYS(CPPTYPE, TYPE)                                 \
+  case FieldDescriptor::CPPTYPE_##CPPTYPE:                         \
+    MutableRaw<RepeatedField<TYPE> >(message1, field)              \
+        ->Swap(MutableRaw<RepeatedField<TYPE> >(message2, field)); \
+    break;
 
-      SWAP_ARRAYS(INT32 , int32 );
-      SWAP_ARRAYS(INT64 , int64 );
+      SWAP_ARRAYS(INT32, int32);
+      SWAP_ARRAYS(INT64, int64);
       SWAP_ARRAYS(UINT32, uint32);
       SWAP_ARRAYS(UINT64, uint64);
-      SWAP_ARRAYS(FLOAT , float );
+      SWAP_ARRAYS(FLOAT, float);
       SWAP_ARRAYS(DOUBLE, double);
-      SWAP_ARRAYS(BOOL  , bool  );
-      SWAP_ARRAYS(ENUM  , int   );
+      SWAP_ARRAYS(BOOL, bool);
+      SWAP_ARRAYS(ENUM, int);
 #undef SWAP_ARRAYS
 
       case FieldDescriptor::CPPTYPE_STRING:
@@ -365,8 +374,8 @@
         break;
       case FieldDescriptor::CPPTYPE_MESSAGE:
         if (IsMapFieldInApi(field)) {
-          MutableRaw<MapFieldBase>(message1, field)->Swap(
-              MutableRaw<MapFieldBase>(message2, field));
+          MutableRaw<MapFieldBase>(message1, field)
+              ->Swap(MutableRaw<MapFieldBase>(message2, field));
         } else {
           MutableRaw<RepeatedPtrFieldBase>(message1, field)
               ->Swap<GenericTypeHandler<Message> >(
@@ -379,20 +388,20 @@
     }
   } else {
     switch (field->cpp_type()) {
-#define SWAP_VALUES(CPPTYPE, TYPE)                                      \
-      case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
-        std::swap(*MutableRaw<TYPE>(message1, field),                   \
-                  *MutableRaw<TYPE>(message2, field));                  \
-        break;
+#define SWAP_VALUES(CPPTYPE, TYPE)                 \
+  case FieldDescriptor::CPPTYPE_##CPPTYPE:         \
+    std::swap(*MutableRaw<TYPE>(message1, field),  \
+              *MutableRaw<TYPE>(message2, field)); \
+    break;
 
-      SWAP_VALUES(INT32 , int32 );
-      SWAP_VALUES(INT64 , int64 );
+      SWAP_VALUES(INT32, int32);
+      SWAP_VALUES(INT64, int64);
       SWAP_VALUES(UINT32, uint32);
       SWAP_VALUES(UINT64, uint64);
-      SWAP_VALUES(FLOAT , float );
+      SWAP_VALUES(FLOAT, float);
       SWAP_VALUES(DOUBLE, double);
-      SWAP_VALUES(BOOL  , bool  );
-      SWAP_VALUES(ENUM  , int   );
+      SWAP_VALUES(BOOL, bool);
+      SWAP_VALUES(ENUM, int);
 #undef SWAP_VALUES
       case FieldDescriptor::CPPTYPE_MESSAGE:
         if (GetArena(message1) == GetArena(message2)) {
@@ -421,35 +430,33 @@
       case FieldDescriptor::CPPTYPE_STRING:
         switch (field->options().ctype()) {
           default:  // TODO(kenton):  Support other string reps.
-          case FieldOptions::STRING:
-            {
-              Arena* arena1 = GetArena(message1);
-              Arena* arena2 = GetArena(message2);
+          case FieldOptions::STRING: {
+            Arena* arena1 = GetArena(message1);
+            Arena* arena2 = GetArena(message2);
 
-              if (IsInlined(field)) {
-                InlinedStringField* string1 =
-                    MutableRaw<InlinedStringField>(message1, field);
-                InlinedStringField* string2 =
-                    MutableRaw<InlinedStringField>(message2, field);
-                string1->Swap(string2);
-                break;
-              }
-
-              ArenaStringPtr* string1 =
-                  MutableRaw<ArenaStringPtr>(message1, field);
-              ArenaStringPtr* string2 =
-                  MutableRaw<ArenaStringPtr>(message2, field);
-              const std::string* default_ptr =
-                  &DefaultRaw<ArenaStringPtr>(field).Get();
-              if (arena1 == arena2) {
-                string1->Swap(string2, default_ptr, arena1);
-              } else {
-                const std::string temp = string1->Get();
-                string1->Set(default_ptr, string2->Get(), arena1);
-                string2->Set(default_ptr, temp, arena2);
-              }
+            if (IsInlined(field)) {
+              InlinedStringField* string1 =
+                  MutableRaw<InlinedStringField>(message1, field);
+              InlinedStringField* string2 =
+                  MutableRaw<InlinedStringField>(message2, field);
+              string1->Swap(string2);
+              break;
             }
-            break;
+
+            ArenaStringPtr* string1 =
+                MutableRaw<ArenaStringPtr>(message1, field);
+            ArenaStringPtr* string2 =
+                MutableRaw<ArenaStringPtr>(message2, field);
+            const std::string* default_ptr =
+                &DefaultRaw<ArenaStringPtr>(field).Get();
+            if (arena1 == arena2) {
+              string1->Swap(string2, default_ptr, arena1);
+            } else {
+              const std::string temp = string1->Get();
+              string1->Set(default_ptr, string2->Get(), arena1);
+              string2->Set(default_ptr, temp, arena2);
+            }
+          } break;
         }
         break;
 
@@ -460,8 +467,7 @@
 }
 
 void GeneratedMessageReflection::SwapOneofField(
-    Message* message1,
-    Message* message2,
+    Message* message1, Message* message2,
     const OneofDescriptor* oneof_descriptor) const {
   uint32 oneof_case1 = GetOneofCase(*message1, oneof_descriptor);
   uint32 oneof_case2 = GetOneofCase(*message2, oneof_descriptor);
@@ -481,21 +487,21 @@
   const FieldDescriptor* field1 = NULL;
   if (oneof_case1 > 0) {
     field1 = descriptor_->FindFieldByNumber(oneof_case1);
-    //oneof_descriptor->field(oneof_case1);
+    // oneof_descriptor->field(oneof_case1);
     switch (field1->cpp_type()) {
-#define GET_TEMP_VALUE(CPPTYPE, TYPE)                                   \
-      case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
-        temp_##TYPE = GetField<TYPE>(*message1, field1);                \
-        break;
+#define GET_TEMP_VALUE(CPPTYPE, TYPE)                \
+  case FieldDescriptor::CPPTYPE_##CPPTYPE:           \
+    temp_##TYPE = GetField<TYPE>(*message1, field1); \
+    break;
 
-      GET_TEMP_VALUE(INT32 , int32 );
-      GET_TEMP_VALUE(INT64 , int64 );
+      GET_TEMP_VALUE(INT32, int32);
+      GET_TEMP_VALUE(INT64, int64);
       GET_TEMP_VALUE(UINT32, uint32);
       GET_TEMP_VALUE(UINT64, uint64);
-      GET_TEMP_VALUE(FLOAT , float );
+      GET_TEMP_VALUE(FLOAT, float);
       GET_TEMP_VALUE(DOUBLE, double);
-      GET_TEMP_VALUE(BOOL  , bool  );
-      GET_TEMP_VALUE(ENUM  , int   );
+      GET_TEMP_VALUE(BOOL, bool);
+      GET_TEMP_VALUE(ENUM, int);
 #undef GET_TEMP_VALUE
       case FieldDescriptor::CPPTYPE_MESSAGE:
         temp_message = ReleaseMessage(message1, field1);
@@ -512,27 +518,24 @@
 
   // Sets message1's oneof field from the message2's oneof field.
   if (oneof_case2 > 0) {
-    const FieldDescriptor* field2 =
-        descriptor_->FindFieldByNumber(oneof_case2);
+    const FieldDescriptor* field2 = descriptor_->FindFieldByNumber(oneof_case2);
     switch (field2->cpp_type()) {
-#define SET_ONEOF_VALUE1(CPPTYPE, TYPE)                                 \
-      case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
-        SetField<TYPE>(message1, field2, GetField<TYPE>(*message2, field2)); \
-        break;
+#define SET_ONEOF_VALUE1(CPPTYPE, TYPE)                                  \
+  case FieldDescriptor::CPPTYPE_##CPPTYPE:                               \
+    SetField<TYPE>(message1, field2, GetField<TYPE>(*message2, field2)); \
+    break;
 
-      SET_ONEOF_VALUE1(INT32 , int32 );
-      SET_ONEOF_VALUE1(INT64 , int64 );
+      SET_ONEOF_VALUE1(INT32, int32);
+      SET_ONEOF_VALUE1(INT64, int64);
       SET_ONEOF_VALUE1(UINT32, uint32);
       SET_ONEOF_VALUE1(UINT64, uint64);
-      SET_ONEOF_VALUE1(FLOAT , float );
+      SET_ONEOF_VALUE1(FLOAT, float);
       SET_ONEOF_VALUE1(DOUBLE, double);
-      SET_ONEOF_VALUE1(BOOL  , bool  );
-      SET_ONEOF_VALUE1(ENUM  , int   );
+      SET_ONEOF_VALUE1(BOOL, bool);
+      SET_ONEOF_VALUE1(ENUM, int);
 #undef SET_ONEOF_VALUE1
       case FieldDescriptor::CPPTYPE_MESSAGE:
-        SetAllocatedMessage(message1,
-                            ReleaseMessage(message2, field2),
-                            field2);
+        SetAllocatedMessage(message1, ReleaseMessage(message2, field2), field2);
         break;
 
       case FieldDescriptor::CPPTYPE_STRING:
@@ -549,19 +552,19 @@
   // Sets message2's oneof field from the temp variable.
   if (oneof_case1 > 0) {
     switch (field1->cpp_type()) {
-#define SET_ONEOF_VALUE2(CPPTYPE, TYPE)                                 \
-      case FieldDescriptor::CPPTYPE_##CPPTYPE:                          \
-        SetField<TYPE>(message2, field1, temp_##TYPE);                  \
-        break;
+#define SET_ONEOF_VALUE2(CPPTYPE, TYPE)            \
+  case FieldDescriptor::CPPTYPE_##CPPTYPE:         \
+    SetField<TYPE>(message2, field1, temp_##TYPE); \
+    break;
 
-      SET_ONEOF_VALUE2(INT32 , int32 );
-      SET_ONEOF_VALUE2(INT64 , int64 );
+      SET_ONEOF_VALUE2(INT32, int32);
+      SET_ONEOF_VALUE2(INT64, int64);
       SET_ONEOF_VALUE2(UINT32, uint32);
       SET_ONEOF_VALUE2(UINT64, uint64);
-      SET_ONEOF_VALUE2(FLOAT , float );
+      SET_ONEOF_VALUE2(FLOAT, float);
       SET_ONEOF_VALUE2(DOUBLE, double);
-      SET_ONEOF_VALUE2(BOOL  , bool  );
-      SET_ONEOF_VALUE2(ENUM  , int   );
+      SET_ONEOF_VALUE2(BOOL, bool);
+      SET_ONEOF_VALUE2(ENUM, int);
 #undef SET_ONEOF_VALUE2
       case FieldDescriptor::CPPTYPE_MESSAGE:
         SetAllocatedMessage(message2, temp_message, field1);
@@ -579,26 +582,27 @@
   }
 }
 
-void GeneratedMessageReflection::Swap(
-    Message* message1,
-    Message* message2) const {
+void GeneratedMessageReflection::Swap(Message* message1,
+                                      Message* message2) const {
   if (message1 == message2) return;
 
   // TODO(kenton):  Other Reflection methods should probably check this too.
   GOOGLE_CHECK_EQ(message1->GetReflection(), this)
-    << "First argument to Swap() (of type \""
-    << message1->GetDescriptor()->full_name()
-    << "\") is not compatible with this reflection object (which is for type \""
-    << descriptor_->full_name()
-    << "\").  Note that the exact same class is required; not just the same "
-       "descriptor.";
+      << "First argument to Swap() (of type \""
+      << message1->GetDescriptor()->full_name()
+      << "\") is not compatible with this reflection object (which is for type "
+         "\""
+      << descriptor_->full_name()
+      << "\").  Note that the exact same class is required; not just the same "
+         "descriptor.";
   GOOGLE_CHECK_EQ(message2->GetReflection(), this)
-    << "Second argument to Swap() (of type \""
-    << message2->GetDescriptor()->full_name()
-    << "\") is not compatible with this reflection object (which is for type \""
-    << descriptor_->full_name()
-    << "\").  Note that the exact same class is required; not just the same "
-       "descriptor.";
+      << "Second argument to Swap() (of type \""
+      << message2->GetDescriptor()->full_name()
+      << "\") is not compatible with this reflection object (which is for type "
+         "\""
+      << descriptor_->full_name()
+      << "\").  Note that the exact same class is required; not just the same "
+         "descriptor.";
 
   // Check that both messages are in the same arena (or both on the heap). We
   // need to copy all data if not, due to ownership semantics.
@@ -653,26 +657,27 @@
 }
 
 void GeneratedMessageReflection::SwapFields(
-    Message* message1,
-    Message* message2,
+    Message* message1, Message* message2,
     const std::vector<const FieldDescriptor*>& fields) const {
   if (message1 == message2) return;
 
   // TODO(kenton):  Other Reflection methods should probably check this too.
   GOOGLE_CHECK_EQ(message1->GetReflection(), this)
-    << "First argument to SwapFields() (of type \""
-    << message1->GetDescriptor()->full_name()
-    << "\") is not compatible with this reflection object (which is for type \""
-    << descriptor_->full_name()
-    << "\").  Note that the exact same class is required; not just the same "
-       "descriptor.";
+      << "First argument to SwapFields() (of type \""
+      << message1->GetDescriptor()->full_name()
+      << "\") is not compatible with this reflection object (which is for type "
+         "\""
+      << descriptor_->full_name()
+      << "\").  Note that the exact same class is required; not just the same "
+         "descriptor.";
   GOOGLE_CHECK_EQ(message2->GetReflection(), this)
-    << "Second argument to SwapFields() (of type \""
-    << message2->GetDescriptor()->full_name()
-    << "\") is not compatible with this reflection object (which is for type \""
-    << descriptor_->full_name()
-    << "\").  Note that the exact same class is required; not just the same "
-       "descriptor.";
+      << "Second argument to SwapFields() (of type \""
+      << message2->GetDescriptor()->full_name()
+      << "\") is not compatible with this reflection object (which is for type "
+         "\""
+      << descriptor_->full_name()
+      << "\").  Note that the exact same class is required; not just the same "
+         "descriptor.";
 
   std::set<int> swapped_oneof;
 
@@ -681,8 +686,7 @@
     const FieldDescriptor* field = fields[i];
     if (field->is_extension()) {
       MutableExtensionSet(message1)->SwapExtension(
-          MutableExtensionSet(message2),
-          field->number());
+          MutableExtensionSet(message2), field->number());
     } else {
       if (field->containing_oneof()) {
         int oneof_index = field->containing_oneof()->index();
@@ -732,18 +736,18 @@
     return GetExtensionSet(message).ExtensionSize(field->number());
   } else {
     switch (field->cpp_type()) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
-      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
-        return GetRaw<RepeatedField<LOWERCASE> >(message, field).size()
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE)    \
+  case FieldDescriptor::CPPTYPE_##UPPERCASE: \
+    return GetRaw<RepeatedField<LOWERCASE> >(message, field).size()
 
-      HANDLE_TYPE( INT32,  int32);
-      HANDLE_TYPE( INT64,  int64);
+      HANDLE_TYPE(INT32, int32);
+      HANDLE_TYPE(INT64, int64);
       HANDLE_TYPE(UINT32, uint32);
       HANDLE_TYPE(UINT64, uint64);
       HANDLE_TYPE(DOUBLE, double);
-      HANDLE_TYPE( FLOAT,  float);
-      HANDLE_TYPE(  BOOL,   bool);
-      HANDLE_TYPE(  ENUM,    int);
+      HANDLE_TYPE(FLOAT, float);
+      HANDLE_TYPE(BOOL, bool);
+      HANDLE_TYPE(ENUM, int);
 #undef HANDLE_TYPE
 
       case FieldDescriptor::CPPTYPE_STRING:
@@ -784,24 +788,23 @@
 
       // We need to set the field back to its default value.
       switch (field->cpp_type()) {
-#define CLEAR_TYPE(CPPTYPE, TYPE)                                            \
-        case FieldDescriptor::CPPTYPE_##CPPTYPE:                             \
-          *MutableRaw<TYPE>(message, field) =                                \
-            field->default_value_##TYPE();                                   \
-          break;
+#define CLEAR_TYPE(CPPTYPE, TYPE)                                      \
+  case FieldDescriptor::CPPTYPE_##CPPTYPE:                             \
+    *MutableRaw<TYPE>(message, field) = field->default_value_##TYPE(); \
+    break;
 
-        CLEAR_TYPE(INT32 , int32 );
-        CLEAR_TYPE(INT64 , int64 );
+        CLEAR_TYPE(INT32, int32);
+        CLEAR_TYPE(INT64, int64);
         CLEAR_TYPE(UINT32, uint32);
         CLEAR_TYPE(UINT64, uint64);
-        CLEAR_TYPE(FLOAT , float );
+        CLEAR_TYPE(FLOAT, float);
         CLEAR_TYPE(DOUBLE, double);
-        CLEAR_TYPE(BOOL  , bool  );
+        CLEAR_TYPE(BOOL, bool);
 #undef CLEAR_TYPE
 
         case FieldDescriptor::CPPTYPE_ENUM:
           *MutableRaw<int>(message, field) =
-            field->default_value_enum()->number();
+              field->default_value_enum()->number();
           break;
 
         case FieldDescriptor::CPPTYPE_STRING: {
@@ -811,15 +814,15 @@
               if (IsInlined(field)) {
                 const std::string* default_ptr =
                     &DefaultRaw<InlinedStringField>(field).GetNoArena();
-                MutableRaw<InlinedStringField>(message, field)->SetNoArena(
-                    default_ptr, *default_ptr);
+                MutableRaw<InlinedStringField>(message, field)
+                    ->SetNoArena(default_ptr, *default_ptr);
                 break;
               }
 
               const std::string* default_ptr =
                   &DefaultRaw<ArenaStringPtr>(field).Get();
-              MutableRaw<ArenaStringPtr>(message, field)->SetAllocated(
-                  default_ptr, NULL, GetArena(message));
+              MutableRaw<ArenaStringPtr>(message, field)
+                  ->SetAllocated(default_ptr, NULL, GetArena(message));
               break;
             }
           }
@@ -842,19 +845,19 @@
     }
   } else {
     switch (field->cpp_type()) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
-      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
-        MutableRaw<RepeatedField<LOWERCASE> >(message, field)->Clear();       \
-        break
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                           \
+  case FieldDescriptor::CPPTYPE_##UPPERCASE:                        \
+    MutableRaw<RepeatedField<LOWERCASE> >(message, field)->Clear(); \
+    break
 
-      HANDLE_TYPE( INT32,  int32);
-      HANDLE_TYPE( INT64,  int64);
+      HANDLE_TYPE(INT32, int32);
+      HANDLE_TYPE(INT64, int64);
       HANDLE_TYPE(UINT32, uint32);
       HANDLE_TYPE(UINT64, uint64);
       HANDLE_TYPE(DOUBLE, double);
-      HANDLE_TYPE( FLOAT,  float);
-      HANDLE_TYPE(  BOOL,   bool);
-      HANDLE_TYPE(  ENUM,    int);
+      HANDLE_TYPE(FLOAT, float);
+      HANDLE_TYPE(BOOL, bool);
+      HANDLE_TYPE(ENUM, int);
 #undef HANDLE_TYPE
 
       case FieldDescriptor::CPPTYPE_STRING: {
@@ -883,8 +886,7 @@
 }
 
 void GeneratedMessageReflection::RemoveLast(
-    Message* message,
-    const FieldDescriptor* field) const {
+    Message* message, const FieldDescriptor* field) const {
   USAGE_CHECK_MESSAGE_TYPE(RemoveLast);
   USAGE_CHECK_REPEATED(RemoveLast);
 
@@ -892,19 +894,19 @@
     MutableExtensionSet(message)->RemoveLast(field->number());
   } else {
     switch (field->cpp_type()) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
-      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
-        MutableRaw<RepeatedField<LOWERCASE> >(message, field)->RemoveLast();  \
-        break
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                \
+  case FieldDescriptor::CPPTYPE_##UPPERCASE:                             \
+    MutableRaw<RepeatedField<LOWERCASE> >(message, field)->RemoveLast(); \
+    break
 
-      HANDLE_TYPE( INT32,  int32);
-      HANDLE_TYPE( INT64,  int64);
+      HANDLE_TYPE(INT32, int32);
+      HANDLE_TYPE(INT64, int64);
       HANDLE_TYPE(UINT32, uint32);
       HANDLE_TYPE(UINT64, uint64);
       HANDLE_TYPE(DOUBLE, double);
-      HANDLE_TYPE( FLOAT,  float);
-      HANDLE_TYPE(  BOOL,   bool);
-      HANDLE_TYPE(  ENUM,    int);
+      HANDLE_TYPE(FLOAT, float);
+      HANDLE_TYPE(BOOL, bool);
+      HANDLE_TYPE(ENUM, int);
 #undef HANDLE_TYPE
 
       case FieldDescriptor::CPPTYPE_STRING:
@@ -924,7 +926,7 @@
               ->RemoveLast<GenericTypeHandler<Message> >();
         } else {
           MutableRaw<RepeatedPtrFieldBase>(message, field)
-            ->RemoveLast<GenericTypeHandler<Message> >();
+              ->RemoveLast<GenericTypeHandler<Message> >();
         }
         break;
     }
@@ -932,8 +934,7 @@
 }
 
 Message* GeneratedMessageReflection::ReleaseLast(
-    Message* message,
-    const FieldDescriptor* field) const {
+    Message* message, const FieldDescriptor* field) const {
   USAGE_CHECK_ALL(ReleaseLast, REPEATED, MESSAGE);
 
   if (field->is_extension()) {
@@ -946,16 +947,14 @@
           ->ReleaseLast<GenericTypeHandler<Message> >();
     } else {
       return MutableRaw<RepeatedPtrFieldBase>(message, field)
-        ->ReleaseLast<GenericTypeHandler<Message> >();
+          ->ReleaseLast<GenericTypeHandler<Message> >();
     }
   }
 }
 
-void GeneratedMessageReflection::SwapElements(
-    Message* message,
-    const FieldDescriptor* field,
-    int index1,
-    int index2) const {
+void GeneratedMessageReflection::SwapElements(Message* message,
+                                              const FieldDescriptor* field,
+                                              int index1, int index2) const {
   USAGE_CHECK_MESSAGE_TYPE(Swap);
   USAGE_CHECK_REPEATED(Swap);
 
@@ -963,20 +962,20 @@
     MutableExtensionSet(message)->SwapElements(field->number(), index1, index2);
   } else {
     switch (field->cpp_type()) {
-#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                                     \
-      case FieldDescriptor::CPPTYPE_##UPPERCASE :                             \
-        MutableRaw<RepeatedField<LOWERCASE> >(message, field)                 \
-            ->SwapElements(index1, index2);                                   \
-        break
+#define HANDLE_TYPE(UPPERCASE, LOWERCASE)                 \
+  case FieldDescriptor::CPPTYPE_##UPPERCASE:              \
+    MutableRaw<RepeatedField<LOWERCASE> >(message, field) \
+        ->SwapElements(index1, index2);                   \
+    break
 
-      HANDLE_TYPE( INT32,  int32);
-      HANDLE_TYPE( INT64,  int64);
+      HANDLE_TYPE(INT32, int32);
+      HANDLE_TYPE(INT64, int64);
       HANDLE_TYPE(UINT32, uint32);
       HANDLE_TYPE(UINT64, uint64);
       HANDLE_TYPE(DOUBLE, double);
-      HANDLE_TYPE( FLOAT,  float);
-      HANDLE_TYPE(  BOOL,   bool);
-      HANDLE_TYPE(  ENUM,    int);
+      HANDLE_TYPE(FLOAT, float);
+      HANDLE_TYPE(BOOL, bool);
+      HANDLE_TYPE(ENUM, int);
 #undef HANDLE_TYPE
 
       case FieldDescriptor::CPPTYPE_STRING:
@@ -987,7 +986,7 @@
               ->SwapElements(index1, index2);
         } else {
           MutableRaw<RepeatedPtrFieldBase>(message, field)
-            ->SwapElements(index1, index2);
+              ->SwapElements(index1, index2);
         }
         break;
     }
@@ -1003,8 +1002,8 @@
   }
 };
 
-inline bool IsIndexInHasBitSet(
-    const uint32* has_bit_set, uint32 has_bit_index) {
+inline bool IsIndexInHasBitSet(const uint32* has_bit_set,
+                               uint32 has_bit_index) {
   GOOGLE_DCHECK_NE(has_bit_index, ~0u);
   return ((has_bit_set[has_bit_index / 32] >> (has_bit_index % 32)) &
           static_cast<uint32>(1)) != 0;
@@ -1012,8 +1011,7 @@
 }  // namespace
 
 void GeneratedMessageReflection::ListFields(
-    const Message& message,
-    std::vector<const FieldDescriptor*>* output) const {
+    const Message& message, std::vector<const FieldDescriptor*>* output) const {
   output->clear();
 
   // Optimization:  The default instance never has any fields set.
@@ -1065,74 +1063,71 @@
 // -------------------------------------------------------------------
 
 #undef DEFINE_PRIMITIVE_ACCESSORS
-#define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE)        \
-  PASSTYPE GeneratedMessageReflection::Get##TYPENAME(                        \
-      const Message& message, const FieldDescriptor* field) const {          \
-    USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE);                       \
-    if (field->is_extension()) {                                             \
-      return GetExtensionSet(message).Get##TYPENAME(                         \
-        field->number(), field->default_value_##PASSTYPE());                 \
-    } else {                                                                 \
-      return GetField<TYPE>(message, field);                                 \
-    }                                                                        \
-  }                                                                          \
-                                                                             \
-  void GeneratedMessageReflection::Set##TYPENAME(                            \
-      Message* message, const FieldDescriptor* field,                        \
-      PASSTYPE value) const {                                                \
-    USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE);                       \
-    if (field->is_extension()) {                                             \
-      return MutableExtensionSet(message)->Set##TYPENAME(                    \
-        field->number(), field->type(), value, field);                       \
-    } else {                                                                 \
-      SetField<TYPE>(message, field, value);                                 \
-    }                                                                        \
-  }                                                                          \
-                                                                             \
-  PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME(                \
-      const Message& message,                                                \
-      const FieldDescriptor* field, int index) const {                       \
-    USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE);               \
-    if (field->is_extension()) {                                             \
-      return GetExtensionSet(message).GetRepeated##TYPENAME(                 \
-        field->number(), index);                                             \
-    } else {                                                                 \
-      return GetRepeatedField<TYPE>(message, field, index);                  \
-    }                                                                        \
-  }                                                                          \
-                                                                             \
-  void GeneratedMessageReflection::SetRepeated##TYPENAME(                    \
-      Message* message, const FieldDescriptor* field,                        \
-      int index, PASSTYPE value) const {                                     \
-    USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE);               \
-    if (field->is_extension()) {                                             \
-      MutableExtensionSet(message)->SetRepeated##TYPENAME(                   \
-        field->number(), index, value);                                      \
-    } else {                                                                 \
-      SetRepeatedField<TYPE>(message, field, index, value);                  \
-    }                                                                        \
-  }                                                                          \
-                                                                             \
-  void GeneratedMessageReflection::Add##TYPENAME(                            \
-      Message* message, const FieldDescriptor* field,                        \
-      PASSTYPE value) const {                                                \
-    USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE);                       \
-    if (field->is_extension()) {                                             \
-      MutableExtensionSet(message)->Add##TYPENAME(                           \
-        field->number(), field->type(), field->options().packed(), value,    \
-        field);                                                              \
-    } else {                                                                 \
-      AddField<TYPE>(message, field, value);                                 \
-    }                                                                        \
+#define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE)          \
+  PASSTYPE GeneratedMessageReflection::Get##TYPENAME(                          \
+      const Message& message, const FieldDescriptor* field) const {            \
+    USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE);                         \
+    if (field->is_extension()) {                                               \
+      return GetExtensionSet(message).Get##TYPENAME(                           \
+          field->number(), field->default_value_##PASSTYPE());                 \
+    } else {                                                                   \
+      return GetField<TYPE>(message, field);                                   \
+    }                                                                          \
+  }                                                                            \
+                                                                               \
+  void GeneratedMessageReflection::Set##TYPENAME(                              \
+      Message* message, const FieldDescriptor* field, PASSTYPE value) const {  \
+    USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE);                         \
+    if (field->is_extension()) {                                               \
+      return MutableExtensionSet(message)->Set##TYPENAME(                      \
+          field->number(), field->type(), value, field);                       \
+    } else {                                                                   \
+      SetField<TYPE>(message, field, value);                                   \
+    }                                                                          \
+  }                                                                            \
+                                                                               \
+  PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME(                  \
+      const Message& message, const FieldDescriptor* field, int index) const { \
+    USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE);                 \
+    if (field->is_extension()) {                                               \
+      return GetExtensionSet(message).GetRepeated##TYPENAME(field->number(),   \
+                                                            index);            \
+    } else {                                                                   \
+      return GetRepeatedField<TYPE>(message, field, index);                    \
+    }                                                                          \
+  }                                                                            \
+                                                                               \
+  void GeneratedMessageReflection::SetRepeated##TYPENAME(                      \
+      Message* message, const FieldDescriptor* field, int index,               \
+      PASSTYPE value) const {                                                  \
+    USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE);                 \
+    if (field->is_extension()) {                                               \
+      MutableExtensionSet(message)->SetRepeated##TYPENAME(field->number(),     \
+                                                          index, value);       \
+    } else {                                                                   \
+      SetRepeatedField<TYPE>(message, field, index, value);                    \
+    }                                                                          \
+  }                                                                            \
+                                                                               \
+  void GeneratedMessageReflection::Add##TYPENAME(                              \
+      Message* message, const FieldDescriptor* field, PASSTYPE value) const {  \
+    USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE);                         \
+    if (field->is_extension()) {                                               \
+      MutableExtensionSet(message)->Add##TYPENAME(                             \
+          field->number(), field->type(), field->options().packed(), value,    \
+          field);                                                              \
+    } else {                                                                   \
+      AddField<TYPE>(message, field, value);                                   \
+    }                                                                          \
   }
 
-DEFINE_PRIMITIVE_ACCESSORS(Int32 , int32 , int32 , INT32 )
-DEFINE_PRIMITIVE_ACCESSORS(Int64 , int64 , int64 , INT64 )
+DEFINE_PRIMITIVE_ACCESSORS(Int32, int32, int32, INT32)
+DEFINE_PRIMITIVE_ACCESSORS(Int64, int64, int64, INT64)
 DEFINE_PRIMITIVE_ACCESSORS(UInt32, uint32, uint32, UINT32)
 DEFINE_PRIMITIVE_ACCESSORS(UInt64, uint64, uint64, UINT64)
-DEFINE_PRIMITIVE_ACCESSORS(Float , float , float , FLOAT )
+DEFINE_PRIMITIVE_ACCESSORS(Float, float, float, FLOAT)
 DEFINE_PRIMITIVE_ACCESSORS(Double, double, double, DOUBLE)
-DEFINE_PRIMITIVE_ACCESSORS(Bool  , bool  , bool  , BOOL  )
+DEFINE_PRIMITIVE_ACCESSORS(Bool, bool, bool, BOOL)
 #undef DEFINE_PRIMITIVE_ACCESSORS
 
 // -------------------------------------------------------------------
@@ -1191,8 +1186,8 @@
       default:  // TODO(kenton):  Support other string reps.
       case FieldOptions::STRING: {
         if (IsInlined(field)) {
-          MutableField<InlinedStringField>(message, field)->SetNoArena(
-              NULL, value);
+          MutableField<InlinedStringField>(message, field)
+              ->SetNoArena(NULL, value);
           break;
         }
 
@@ -1200,8 +1195,8 @@
             &DefaultRaw<ArenaStringPtr>(field).Get();
         if (field->containing_oneof() && !HasOneofField(*message, field)) {
           ClearOneof(message, field->containing_oneof());
-          MutableField<ArenaStringPtr>(message, field)->UnsafeSetDefault(
-              default_ptr);
+          MutableField<ArenaStringPtr>(message, field)
+              ->UnsafeSetDefault(default_ptr);
         }
         MutableField<ArenaStringPtr>(message, field)
             ->Mutable(default_ptr, GetArena(message))
@@ -1248,8 +1243,8 @@
     const std::string& value) const {
   USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING);
   if (field->is_extension()) {
-    MutableExtensionSet(message)->SetRepeatedString(
-      field->number(), index, value);
+    MutableExtensionSet(message)->SetRepeatedString(field->number(), index,
+                                                    value);
   } else {
     switch (field->options().ctype()) {
       default:  // TODO(kenton):  Support other string reps.
@@ -1266,8 +1261,8 @@
                                            const std::string& value) const {
   USAGE_CHECK_ALL(AddString, REPEATED, STRING);
   if (field->is_extension()) {
-    MutableExtensionSet(message)->AddString(field->number(),
-                                            field->type(), value, field);
+    MutableExtensionSet(message)->AddString(field->number(), field->type(),
+                                            value, field);
   } else {
     switch (field->options().ctype()) {
       default:  // TODO(kenton):  Support other string reps.
@@ -1299,7 +1294,7 @@
   int32 value;
   if (field->is_extension()) {
     value = GetExtensionSet(message).GetEnum(
-      field->number(), field->default_value_enum()->number());
+        field->number(), field->default_value_enum()->number());
   } else {
     value = GetField<int>(message, field);
   }
@@ -1314,9 +1309,9 @@
   SetEnumValueInternal(message, field, value->number());
 }
 
-void GeneratedMessageReflection::SetEnumValue(
-    Message* message, const FieldDescriptor* field,
-    int value) const {
+void GeneratedMessageReflection::SetEnumValue(Message* message,
+                                              const FieldDescriptor* field,
+                                              int value) const {
   USAGE_CHECK_ALL(SetEnumValue, SINGULAR, ENUM);
   if (!CreateUnknownEnumValues(descriptor_->file())) {
     // Check that the value is valid if we don't support direct storage of
@@ -1332,11 +1327,10 @@
 }
 
 void GeneratedMessageReflection::SetEnumValueInternal(
-    Message* message, const FieldDescriptor* field,
-    int value) const {
+    Message* message, const FieldDescriptor* field, int value) const {
   if (field->is_extension()) {
-    MutableExtensionSet(message)->SetEnum(field->number(), field->type(),
-                                          value, field);
+    MutableExtensionSet(message)->SetEnum(field->number(), field->type(), value,
+                                          field);
   } else {
     SetField<int>(message, field, value);
   }
@@ -1363,8 +1357,7 @@
 }
 
 void GeneratedMessageReflection::SetRepeatedEnum(
-    Message* message,
-    const FieldDescriptor* field, int index,
+    Message* message, const FieldDescriptor* field, int index,
     const EnumValueDescriptor* value) const {
   // Usage checked by SetRepeatedEnumValue.
   USAGE_CHECK_ENUM_VALUE(SetRepeatedEnum);
@@ -1372,8 +1365,7 @@
 }
 
 void GeneratedMessageReflection::SetRepeatedEnumValue(
-    Message* message,
-    const FieldDescriptor* field, int index,
+    Message* message, const FieldDescriptor* field, int index,
     int value) const {
   USAGE_CHECK_ALL(SetRepeatedEnum, REPEATED, ENUM);
   if (!CreateUnknownEnumValues(descriptor_->file())) {
@@ -1390,12 +1382,11 @@
 }
 
 void GeneratedMessageReflection::SetRepeatedEnumValueInternal(
-    Message* message,
-    const FieldDescriptor* field, int index,
+    Message* message, const FieldDescriptor* field, int index,
     int value) const {
   if (field->is_extension()) {
-    MutableExtensionSet(message)->SetRepeatedEnum(
-      field->number(), index, value);
+    MutableExtensionSet(message)->SetRepeatedEnum(field->number(), index,
+                                                  value);
   } else {
     SetRepeatedField<int>(message, field, index, value);
   }
@@ -1409,9 +1400,9 @@
   AddEnumValueInternal(message, field, value->number());
 }
 
-void GeneratedMessageReflection::AddEnumValue(
-    Message* message, const FieldDescriptor* field,
-    int value) const {
+void GeneratedMessageReflection::AddEnumValue(Message* message,
+                                              const FieldDescriptor* field,
+                                              int value) const {
   USAGE_CHECK_ALL(AddEnum, REPEATED, ENUM);
   if (!CreateUnknownEnumValues(descriptor_->file())) {
     // Check that the value is valid if we don't support direct storage of
@@ -1427,12 +1418,11 @@
 }
 
 void GeneratedMessageReflection::AddEnumValueInternal(
-    Message* message, const FieldDescriptor* field,
-    int value) const {
+    Message* message, const FieldDescriptor* field, int value) const {
   if (field->is_extension()) {
     MutableExtensionSet(message)->AddEnum(field->number(), field->type(),
-                                          field->options().packed(),
-                                          value, field);
+                                          field->options().packed(), value,
+                                          field);
   } else {
     AddField<int>(message, field, value);
   }
@@ -1448,9 +1438,8 @@
   if (factory == NULL) factory = message_factory_;
 
   if (field->is_extension()) {
-    return static_cast<const Message&>(
-        GetExtensionSet(message).GetMessage(
-          field->number(), field->message_type(), factory));
+    return static_cast<const Message&>(GetExtensionSet(message).GetMessage(
+        field->number(), field->message_type(), factory));
   } else {
     const Message* result = GetRaw<const Message*>(message, field);
     if (result == NULL) {
@@ -1496,8 +1485,7 @@
 }
 
 void GeneratedMessageReflection::UnsafeArenaSetAllocatedMessage(
-    Message* message,
-    Message* sub_message,
+    Message* message, Message* sub_message,
     const FieldDescriptor* field) const {
   USAGE_CHECK_ALL(SetAllocatedMessage, SINGULAR, MESSAGE);
 
@@ -1530,14 +1518,12 @@
 }
 
 void GeneratedMessageReflection::SetAllocatedMessage(
-    Message* message,
-    Message* sub_message,
+    Message* message, Message* sub_message,
     const FieldDescriptor* field) const {
   // If message and sub-message are in different memory ownership domains
   // (different arenas, or one is on heap and one is not), then we may need to
   // do a copy.
-  if (sub_message != NULL &&
-      sub_message->GetArena() != message->GetArena()) {
+  if (sub_message != NULL && sub_message->GetArena() != message->GetArena()) {
     if (sub_message->GetArena() == NULL && message->GetArena() != NULL) {
       // Case 1: parent is on an arena and child is heap-allocated. We can add
       // the child to the arena's Own() list to free on arena destruction, then
@@ -1558,8 +1544,7 @@
 }
 
 Message* GeneratedMessageReflection::UnsafeArenaReleaseMessage(
-    Message* message,
-    const FieldDescriptor* field,
+    Message* message, const FieldDescriptor* field,
     MessageFactory* factory) const {
   USAGE_CHECK_ALL(ReleaseMessage, SINGULAR, MESSAGE);
 
@@ -1588,8 +1573,7 @@
 }
 
 Message* GeneratedMessageReflection::ReleaseMessage(
-    Message* message,
-    const FieldDescriptor* field,
+    Message* message, const FieldDescriptor* field,
     MessageFactory* factory) const {
   Message* released = UnsafeArenaReleaseMessage(message, field, factory);
   if (GetArena(message) != NULL && released != NULL) {
@@ -1625,8 +1609,8 @@
 
   if (field->is_extension()) {
     return static_cast<Message*>(
-        MutableExtensionSet(message)->MutableRepeatedMessage(
-          field->number(), index));
+        MutableExtensionSet(message)->MutableRepeatedMessage(field->number(),
+                                                             index));
   } else {
     if (IsMapFieldInApi(field)) {
       return MutableRaw<MapFieldBase>(message, field)
@@ -1634,14 +1618,14 @@
           ->Mutable<GenericTypeHandler<Message> >(index);
     } else {
       return MutableRaw<RepeatedPtrFieldBase>(message, field)
-        ->Mutable<GenericTypeHandler<Message> >(index);
+          ->Mutable<GenericTypeHandler<Message> >(index);
     }
   }
 }
 
-Message* GeneratedMessageReflection::AddMessage(
-    Message* message, const FieldDescriptor* field,
-    MessageFactory* factory) const {
+Message* GeneratedMessageReflection::AddMessage(Message* message,
+                                                const FieldDescriptor* field,
+                                                MessageFactory* factory) const {
   USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE);
 
   if (factory == NULL) factory = message_factory_;
@@ -1682,8 +1666,7 @@
 }
 
 void GeneratedMessageReflection::AddAllocatedMessage(
-    Message* message, const FieldDescriptor* field,
-    Message* new_entry) const {
+    Message* message, const FieldDescriptor* field, Message* new_entry) const {
   USAGE_CHECK_ALL(AddAllocatedMessage, REPEATED, MESSAGE);
 
   if (field->is_extension()) {
@@ -1702,12 +1685,11 @@
 
 void* GeneratedMessageReflection::MutableRawRepeatedField(
     Message* message, const FieldDescriptor* field,
-    FieldDescriptor::CppType cpptype,
-    int ctype, const Descriptor* desc) const {
+    FieldDescriptor::CppType cpptype, int ctype, const Descriptor* desc) const {
   USAGE_CHECK_REPEATED("MutableRawRepeatedField");
   if (field->cpp_type() != cpptype)
-    ReportReflectionUsageTypeError(descriptor_,
-        field, "MutableRawRepeatedField", cpptype);
+    ReportReflectionUsageTypeError(descriptor_, field,
+                                   "MutableRawRepeatedField", cpptype);
   if (desc != NULL)
     GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type";
   if (field->is_extension()) {
@@ -1725,12 +1707,11 @@
 
 const void* GeneratedMessageReflection::GetRawRepeatedField(
     const Message& message, const FieldDescriptor* field,
-    FieldDescriptor::CppType cpptype,
-    int ctype, const Descriptor* desc) const {
+    FieldDescriptor::CppType cpptype, int ctype, const Descriptor* desc) const {
   USAGE_CHECK_REPEATED("GetRawRepeatedField");
   if (field->cpp_type() != cpptype)
-    ReportReflectionUsageTypeError(descriptor_,
-        field, "GetRawRepeatedField", cpptype);
+    ReportReflectionUsageTypeError(descriptor_, field, "GetRawRepeatedField",
+                                   cpptype);
   if (ctype >= 0)
     GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch";
   if (desc != NULL)
@@ -1741,8 +1722,8 @@
     // Map is not supported in extensions, it is acceptable to use
     // extension_set::MutableRawRepeatedField which does not change the message.
     return MutableExtensionSet(const_cast<Message*>(&message))
-        ->MutableRawRepeatedField(
-        field->number(), field->type(), field->is_packed(), field);
+        ->MutableRawRepeatedField(field->number(), field->type(),
+                                  field->is_packed(), field);
   } else {
     // Trigger transform for MapField
     if (IsMapFieldInApi(field)) {
@@ -1753,8 +1734,7 @@
 }
 
 const FieldDescriptor* GeneratedMessageReflection::GetOneofFieldDescriptor(
-    const Message& message,
-    const OneofDescriptor* oneof_descriptor) const {
+    const Message& message, const OneofDescriptor* oneof_descriptor) const {
   uint32 field_number = GetOneofCase(message, oneof_descriptor);
   if (field_number == 0) {
     return NULL;
@@ -1762,67 +1742,51 @@
   return descriptor_->FindFieldByNumber(field_number);
 }
 
-bool GeneratedMessageReflection::ContainsMapKey(
-    const Message& message,
-    const FieldDescriptor* field,
-    const MapKey& key) const {
-  USAGE_CHECK(IsMapFieldInApi(field),
-              "LookupMapValue",
+bool GeneratedMessageReflection::ContainsMapKey(const Message& message,
+                                                const FieldDescriptor* field,
+                                                const MapKey& key) const {
+  USAGE_CHECK(IsMapFieldInApi(field), "LookupMapValue",
               "Field is not a map field.");
   return GetRaw<MapFieldBase>(message, field).ContainsMapKey(key);
 }
 
 bool GeneratedMessageReflection::InsertOrLookupMapValue(
-    Message* message,
-    const FieldDescriptor* field,
-    const MapKey& key,
+    Message* message, const FieldDescriptor* field, const MapKey& key,
     MapValueRef* val) const {
-  USAGE_CHECK(IsMapFieldInApi(field),
-              "InsertOrLookupMapValue",
+  USAGE_CHECK(IsMapFieldInApi(field), "InsertOrLookupMapValue",
               "Field is not a map field.");
   val->SetType(field->message_type()->FindFieldByName("value")->cpp_type());
-  return MutableRaw<MapFieldBase>(message, field)->InsertOrLookupMapValue(
-      key, val);
+  return MutableRaw<MapFieldBase>(message, field)
+      ->InsertOrLookupMapValue(key, val);
 }
 
-bool GeneratedMessageReflection::DeleteMapValue(
-    Message* message,
-    const FieldDescriptor* field,
-    const MapKey& key) const {
-  USAGE_CHECK(IsMapFieldInApi(field),
-              "DeleteMapValue",
+bool GeneratedMessageReflection::DeleteMapValue(Message* message,
+                                                const FieldDescriptor* field,
+                                                const MapKey& key) const {
+  USAGE_CHECK(IsMapFieldInApi(field), "DeleteMapValue",
               "Field is not a map field.");
   return MutableRaw<MapFieldBase>(message, field)->DeleteMapValue(key);
 }
 
 MapIterator GeneratedMessageReflection::MapBegin(
-    Message* message,
-    const FieldDescriptor* field) const {
-  USAGE_CHECK(IsMapFieldInApi(field),
-              "MapBegin",
-              "Field is not a map field.");
+    Message* message, const FieldDescriptor* field) const {
+  USAGE_CHECK(IsMapFieldInApi(field), "MapBegin", "Field is not a map field.");
   MapIterator iter(message, field);
   GetRaw<MapFieldBase>(*message, field).MapBegin(&iter);
   return iter;
 }
 
 MapIterator GeneratedMessageReflection::MapEnd(
-    Message* message,
-    const FieldDescriptor* field) const {
-  USAGE_CHECK(IsMapFieldInApi(field),
-              "MapEnd",
-              "Field is not a map field.");
+    Message* message, const FieldDescriptor* field) const {
+  USAGE_CHECK(IsMapFieldInApi(field), "MapEnd", "Field is not a map field.");
   MapIterator iter(message, field);
   GetRaw<MapFieldBase>(*message, field).MapEnd(&iter);
   return iter;
 }
 
-int GeneratedMessageReflection::MapSize(
-    const Message& message,
-    const FieldDescriptor* field) const {
-  USAGE_CHECK(IsMapFieldInApi(field),
-              "MapSize",
-              "Field is not a map field.");
+int GeneratedMessageReflection::MapSize(const Message& message,
+                                        const FieldDescriptor* field) const {
+  USAGE_CHECK(IsMapFieldInApi(field), "MapSize", "Field is not a map field.");
   return GetRaw<MapFieldBase>(message, field).size();
 }
 
@@ -1847,8 +1811,7 @@
         const FieldDescriptor* extension = type->extension(i);
         if (extension->containing_type() == descriptor_ &&
             extension->type() == FieldDescriptor::TYPE_MESSAGE &&
-            extension->is_optional() &&
-            extension->message_type() == type) {
+            extension->is_optional() && extension->message_type() == type) {
           // Found it.
           return extension;
         }
@@ -1903,12 +1866,11 @@
 }
 
 template <typename Type>
-Type* GeneratedMessageReflection::MutableRaw(Message* message,
-                                   const FieldDescriptor* field) const {
+Type* GeneratedMessageReflection::MutableRaw(
+    Message* message, const FieldDescriptor* field) const {
   return GetPointerAtOffset<Type>(message, schema_.GetFieldOffset(field));
 }
 
-
 inline const uint32* GeneratedMessageReflection::GetHasBits(
     const Message& message) const {
   GOOGLE_DCHECK(schema_.HasHasbits());
@@ -1981,7 +1943,7 @@
   // present only if their message-field pointer is non-NULL.
   if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
     return !schema_.IsDefaultInstance(message) &&
-        GetRaw<const Message*>(message, field) != NULL;
+           GetRaw<const Message*>(message, field) != NULL;
   } else {
     // Non-message field (and non-oneof, since that was handled in HasField()
     // before calling us), and singular (again, checked in HasField). So, this
@@ -1999,7 +1961,8 @@
           default: {
             if (IsInlined(field)) {
               return !GetField<InlinedStringField>(message, field)
-                  .GetNoArena().empty();
+                          .GetNoArena()
+                          .empty();
             }
             return GetField<ArenaStringPtr>(message, field).Get().size() > 0;
           }
@@ -2109,8 +2072,8 @@
             case FieldOptions::STRING: {
               const std::string* default_ptr =
                   &DefaultRaw<ArenaStringPtr>(field).Get();
-              MutableField<ArenaStringPtr>(message, field)->
-                  Destroy(default_ptr, GetArena(message));
+              MutableField<ArenaStringPtr>(message, field)
+                  ->Destroy(default_ptr, GetArena(message));
               break;
             }
           }
@@ -2139,21 +2102,22 @@
 }
 
 template <typename Type>
-inline void GeneratedMessageReflection::SetField(
-    Message* message, const FieldDescriptor* field, const Type& value) const {
+inline void GeneratedMessageReflection::SetField(Message* message,
+                                                 const FieldDescriptor* field,
+                                                 const Type& value) const {
   if (field->containing_oneof() && !HasOneofField(*message, field)) {
     ClearOneof(message, field->containing_oneof());
   }
   *MutableRaw<Type>(message, field) = value;
-  field->containing_oneof() ?
-      SetOneofCase(message, field) : SetBit(message, field);
+  field->containing_oneof() ? SetOneofCase(message, field)
+                            : SetBit(message, field);
 }
 
 template <typename Type>
 inline Type* GeneratedMessageReflection::MutableField(
     Message* message, const FieldDescriptor* field) const {
-  field->containing_oneof() ?
-      SetOneofCase(message, field) : SetBit(message, field);
+  field->containing_oneof() ? SetOneofCase(message, field)
+                            : SetBit(message, field);
   return MutableRaw<Type>(message, field);
 }
 
@@ -2171,8 +2135,8 @@
 
 template <typename Type>
 inline void GeneratedMessageReflection::SetRepeatedField(
-    Message* message, const FieldDescriptor* field,
-    int index, Type value) const {
+    Message* message, const FieldDescriptor* field, int index,
+    Type value) const {
   MutableRaw<RepeatedField<Type> >(message, field)->Set(index, value);
 }
 
@@ -2180,13 +2144,14 @@
 inline Type* GeneratedMessageReflection::MutableRepeatedField(
     Message* message, const FieldDescriptor* field, int index) const {
   RepeatedPtrField<Type>* repeated =
-    MutableRaw<RepeatedPtrField<Type> >(message, field);
+      MutableRaw<RepeatedPtrField<Type> >(message, field);
   return repeated->Mutable(index);
 }
 
 template <typename Type>
-inline void GeneratedMessageReflection::AddField(
-    Message* message, const FieldDescriptor* field, const Type& value) const {
+inline void GeneratedMessageReflection::AddField(Message* message,
+                                                 const FieldDescriptor* field,
+                                                 const Type& value) const {
   MutableRaw<RepeatedField<Type> >(message, field)->Add(value);
 }
 
@@ -2194,7 +2159,7 @@
 inline Type* GeneratedMessageReflection::AddField(
     Message* message, const FieldDescriptor* field) const {
   RepeatedPtrField<Type>* repeated =
-    MutableRaw<RepeatedPtrField<Type> >(message, field);
+      MutableRaw<RepeatedPtrField<Type> >(message, field);
   return repeated->Add();
 }
 
@@ -2204,8 +2169,7 @@
 
 void* GeneratedMessageReflection::RepeatedFieldData(
     Message* message, const FieldDescriptor* field,
-    FieldDescriptor::CppType cpp_type,
-    const Descriptor* message_type) const {
+    FieldDescriptor::CppType cpp_type, const Descriptor* message_type) const {
   GOOGLE_CHECK(field->is_repeated());
   GOOGLE_CHECK(field->cpp_type() == cpp_type ||
         (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM &&
@@ -2226,16 +2190,14 @@
 
 MapFieldBase* GeneratedMessageReflection::MutableMapData(
     Message* message, const FieldDescriptor* field) const {
-  USAGE_CHECK(IsMapFieldInApi(field),
-              "GetMapData",
+  USAGE_CHECK(IsMapFieldInApi(field), "GetMapData",
               "Field is not a map field.");
   return MutableRaw<MapFieldBase>(message, field);
 }
 
 const MapFieldBase* GeneratedMessageReflection::GetMapData(
     const Message& message, const FieldDescriptor* field) const {
-  USAGE_CHECK(IsMapFieldInApi(field),
-              "GetMapData",
+  USAGE_CHECK(IsMapFieldInApi(field), "GetMapData",
               "Field is not a map field.");
   return &(GetRaw<MapFieldBase>(message, field));
 }
@@ -2261,7 +2223,7 @@
   return result;
 }
 
-template<typename Schema>
+template <typename Schema>
 class AssignDescriptorsHelper {
  public:
   AssignDescriptorsHelper(MessageFactory* factory,
@@ -2309,7 +2271,7 @@
   Metadata* file_level_metadata_;
   const EnumDescriptor** file_level_enum_descriptors_;
   const Schema* schemas_;
-  const Message* const * default_instance_data_;
+  const Message* const* default_instance_data_;
   const uint32* offsets_;
 };
 
@@ -2382,8 +2344,6 @@
 
 void AddDescriptorsImpl(const DescriptorTable* table, const InitFunc* deps,
                         int num_deps) {
-  // Ensure default instances of this proto file are initialized.
-  table->init_defaults();
   // Ensure all dependent descriptors are registered to the generated descriptor
   // pool and message factory.
   for (int i = 0; i < num_deps; i++) {
@@ -2419,7 +2379,7 @@
   for (int i = 0; i < size; i++) {
     const GeneratedMessageReflection* reflection =
         static_cast<const GeneratedMessageReflection*>(
-           file_level_metadata[i].reflection);
+            file_level_metadata[i].reflection);
     if (reflection) {
       // It's not a map type
       MessageFactory::InternalRegisterGeneratedMessage(
diff --git a/src/google/protobuf/generated_message_reflection.h b/src/google/protobuf/generated_message_reflection.h
index 17a41bf..820a148 100644
--- a/src/google/protobuf/generated_message_reflection.h
+++ b/src/google/protobuf/generated_message_reflection.h
@@ -83,8 +83,8 @@
 class GeneratedMessageReflection;
 
 // Defined in other files.
-class ExtensionSet;             // extension_set.h
-class WeakFieldMap;             // weak_field_map.h
+class ExtensionSet;  // extension_set.h
+class WeakFieldMap;  // weak_field_map.h
 
 // This struct describes the internal layout of the message, hence this is
 // used to act on the message reflectively.
@@ -146,7 +146,7 @@
     if (field->containing_oneof()) {
       size_t offset =
           static_cast<size_t>(field->containing_type()->field_count() +
-          field->containing_oneof()->index());
+                              field->containing_oneof()->index());
       return OffsetValue(offsets_[offset], field->type());
     } else {
       return GetFieldOffsetNonOneof(field);
@@ -166,8 +166,8 @@
 
   uint32 GetOneofCaseOffset(const OneofDescriptor* oneof_descriptor) const {
     return static_cast<uint32>(oneof_case_offset_) +
-           static_cast<uint32>(
-               static_cast<size_t>(oneof_descriptor->index()) * sizeof(uint32));
+           static_cast<uint32>(static_cast<size_t>(oneof_descriptor->index()) *
+                               sizeof(uint32));
   }
 
   bool HasHasbits() const { return has_bits_offset_ != -1; }
@@ -211,7 +211,7 @@
 
   // Returns a pointer to the default value for this field.  The size and type
   // of the underlying data depends on the field's type.
-  const void *GetFieldDefault(const FieldDescriptor* field) const {
+  const void* GetFieldDefault(const FieldDescriptor* field) const {
     return reinterpret_cast<const uint8*>(default_instance_) +
            OffsetValue(offsets_[field->index()], field->type());
   }
@@ -224,7 +224,7 @@
   // them, ie.
   //
   //   ReflectionSchema schema = {a, b, c, d, e, ...};
- // private:
+  // private:
   const Message* default_instance_;
   const uint32* offsets_;
   const uint32* has_bit_indices_;
@@ -552,21 +552,18 @@
 
   template <typename Type>
   const Type& GetRaw(const Message& message,
-                            const FieldDescriptor* field) const;
+                     const FieldDescriptor* field) const;
   template <typename Type>
-  inline Type* MutableRaw(Message* message,
-                          const FieldDescriptor* field) const;
+  inline Type* MutableRaw(Message* message, const FieldDescriptor* field) const;
   template <typename Type>
   inline const Type& DefaultRaw(const FieldDescriptor* field) const;
 
   inline const uint32* GetHasBits(const Message& message) const;
   inline uint32* MutableHasBits(Message* message) const;
-  inline uint32 GetOneofCase(
-      const Message& message,
-      const OneofDescriptor* oneof_descriptor) const;
+  inline uint32 GetOneofCase(const Message& message,
+                             const OneofDescriptor* oneof_descriptor) const;
   inline uint32* MutableOneofCase(
-      Message* message,
-      const OneofDescriptor* oneof_descriptor) const;
+      Message* message, const OneofDescriptor* oneof_descriptor) const;
   inline const ExtensionSet& GetExtensionSet(const Message& message) const;
   inline ExtensionSet* MutableExtensionSet(Message* message) const;
   inline Arena* GetArena(Message* message) const;
@@ -574,29 +571,24 @@
   inline const InternalMetadataWithArena& GetInternalMetadataWithArena(
       const Message& message) const;
 
-  inline InternalMetadataWithArena*
-      MutableInternalMetadataWithArena(Message* message) const;
+  inline InternalMetadataWithArena* MutableInternalMetadataWithArena(
+      Message* message) const;
 
   inline bool IsInlined(const FieldDescriptor* field) const;
 
   inline bool HasBit(const Message& message,
                      const FieldDescriptor* field) const;
-  inline void SetBit(Message* message,
-                     const FieldDescriptor* field) const;
-  inline void ClearBit(Message* message,
-                       const FieldDescriptor* field) const;
-  inline void SwapBit(Message* message1,
-                      Message* message2,
+  inline void SetBit(Message* message, const FieldDescriptor* field) const;
+  inline void ClearBit(Message* message, const FieldDescriptor* field) const;
+  inline void SwapBit(Message* message1, Message* message2,
                       const FieldDescriptor* field) const;
 
   // This function only swaps the field. Should swap corresponding has_bit
   // before or after using this function.
-  void SwapField(Message* message1,
-                 Message* message2,
+  void SwapField(Message* message1, Message* message2,
                  const FieldDescriptor* field) const;
 
-  void SwapOneofField(Message* message1,
-                      Message* message2,
+  void SwapOneofField(Message* message1, Message* message2,
                       const OneofDescriptor* oneof_descriptor) const;
 
   inline bool HasOneofField(const Message& message,
@@ -610,8 +602,8 @@
   inline const Type& GetField(const Message& message,
                               const FieldDescriptor* field) const;
   template <typename Type>
-  inline void SetField(Message* message,
-                       const FieldDescriptor* field, const Type& value) const;
+  inline void SetField(Message* message, const FieldDescriptor* field,
+                       const Type& value) const;
   template <typename Type>
   inline Type* MutableField(Message* message,
                             const FieldDescriptor* field) const;
@@ -624,42 +616,35 @@
                                          const FieldDescriptor* field,
                                          int index) const;
   template <typename Type>
-  inline void SetRepeatedField(Message* message,
-                               const FieldDescriptor* field, int index,
-                               Type value) const;
+  inline void SetRepeatedField(Message* message, const FieldDescriptor* field,
+                               int index, Type value) const;
   template <typename Type>
   inline Type* MutableRepeatedField(Message* message,
                                     const FieldDescriptor* field,
                                     int index) const;
   template <typename Type>
-  inline void AddField(Message* message,
-                       const FieldDescriptor* field, const Type& value) const;
+  inline void AddField(Message* message, const FieldDescriptor* field,
+                       const Type& value) const;
   template <typename Type>
-  inline Type* AddField(Message* message,
-                        const FieldDescriptor* field) const;
+  inline Type* AddField(Message* message, const FieldDescriptor* field) const;
 
   int GetExtensionNumberOrDie(const Descriptor* type) const;
 
   // Internal versions of EnumValue API perform no checking. Called after checks
   // by public methods.
-  void SetEnumValueInternal(Message* message,
-                            const FieldDescriptor* field,
+  void SetEnumValueInternal(Message* message, const FieldDescriptor* field,
                             int value) const;
   void SetRepeatedEnumValueInternal(Message* message,
-                                    const FieldDescriptor* field,
-                                    int index,
+                                    const FieldDescriptor* field, int index,
                                     int value) const;
-  void AddEnumValueInternal(Message* message,
-                            const FieldDescriptor* field,
+  void AddEnumValueInternal(Message* message, const FieldDescriptor* field,
                             int value) const;
 
-
   Message* UnsafeArenaReleaseMessage(Message* message,
                                      const FieldDescriptor* field,
                                      MessageFactory* factory = NULL) const;
 
-  void UnsafeArenaSetAllocatedMessage(Message* message,
-                                      Message* sub_message,
+  void UnsafeArenaSetAllocatedMessage(Message* message, Message* sub_message,
                                       const FieldDescriptor* field) const;
 
   internal::MapFieldBase* MutableMapData(
@@ -694,7 +679,6 @@
 
 struct PROTOBUF_EXPORT DescriptorTable {
   bool is_initialized;
-  InitFunc init_defaults;
   const char* descriptor;
   const char* filename;
   AssignDescriptorsTable* assign_descriptors_table;
diff --git a/src/google/protobuf/generated_message_reflection_unittest.cc b/src/google/protobuf/generated_message_reflection_unittest.cc
index 82f5dc1..eea5da5 100644
--- a/src/google/protobuf/generated_message_reflection_unittest.cc
+++ b/src/google/protobuf/generated_message_reflection_unittest.cc
@@ -63,7 +63,7 @@
 // Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes.
 const FieldDescriptor* F(const std::string& name) {
   const FieldDescriptor* result =
-    unittest::TestAllTypes::descriptor()->FindFieldByName(name);
+      unittest::TestAllTypes::descriptor()->FindFieldByName(name);
   GOOGLE_CHECK(result != NULL);
   return result;
 }
@@ -72,7 +72,7 @@
   // Check that all default values are set correctly in the initial message.
   unittest::TestAllTypes message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllTypes::descriptor());
+      unittest::TestAllTypes::descriptor());
 
   reflection_tester.ExpectClearViaReflection(message);
 
@@ -96,7 +96,7 @@
   // values.
   unittest::TestAllTypes message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllTypes::descriptor());
+      unittest::TestAllTypes::descriptor());
 
   reflection_tester.SetAllFieldsViaReflection(&message);
   TestUtil::ExpectAllFieldsSet(message);
@@ -135,7 +135,7 @@
   // embedded message does NOT return the default instance.
   unittest::TestAllTypes message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllTypes::descriptor());
+      unittest::TestAllTypes::descriptor());
 
   TestUtil::SetAllFields(&message);
   message.Clear();
@@ -152,7 +152,6 @@
             &reflection->GetMessage(message, F("optional_import_message")));
 }
 
-
 TEST(GeneratedMessageReflectionTest, Swap) {
   unittest::TestAllTypes message1;
   unittest::TestAllTypes message2;
@@ -321,7 +320,7 @@
 TEST(GeneratedMessageReflectionTest, RemoveLast) {
   unittest::TestAllTypes message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllTypes::descriptor());
+      unittest::TestAllTypes::descriptor());
 
   TestUtil::SetAllFields(&message);
 
@@ -333,7 +332,7 @@
 TEST(GeneratedMessageReflectionTest, RemoveLastExtensions) {
   unittest::TestAllExtensions message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllExtensions::descriptor());
+      unittest::TestAllExtensions::descriptor());
 
   TestUtil::SetAllExtensions(&message);
 
@@ -378,21 +377,20 @@
   // Now test that we actually release the right message.
   message.Clear();
   TestUtil::SetAllExtensions(&message);
-  ASSERT_EQ(2, message.ExtensionSize(
-      unittest::repeated_foreign_message_extension));
-  const protobuf_unittest::ForeignMessage* expected = message.MutableExtension(
-      unittest::repeated_foreign_message_extension, 1);
+  ASSERT_EQ(
+      2, message.ExtensionSize(unittest::repeated_foreign_message_extension));
+  const protobuf_unittest::ForeignMessage* expected =
+      message.MutableExtension(unittest::repeated_foreign_message_extension, 1);
   std::unique_ptr<Message> released(message.GetReflection()->ReleaseLast(
       &message, descriptor->file()->FindExtensionByName(
                     "repeated_foreign_message_extension")));
   EXPECT_EQ(expected, released.get());
-
 }
 
 TEST(GeneratedMessageReflectionTest, SwapRepeatedElements) {
   unittest::TestAllTypes message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllTypes::descriptor());
+      unittest::TestAllTypes::descriptor());
 
   TestUtil::SetAllFields(&message);
 
@@ -408,7 +406,7 @@
 TEST(GeneratedMessageReflectionTest, SwapRepeatedElementsExtension) {
   unittest::TestAllExtensions message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllExtensions::descriptor());
+      unittest::TestAllExtensions::descriptor());
 
   TestUtil::SetAllExtensions(&message);
 
@@ -426,7 +424,7 @@
   // values.
   unittest::TestAllExtensions message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllExtensions::descriptor());
+      unittest::TestAllExtensions::descriptor());
 
   reflection_tester.SetAllFieldsViaReflection(&message);
   TestUtil::ExpectAllExtensionsSet(message);
@@ -438,14 +436,14 @@
 
 TEST(GeneratedMessageReflectionTest, FindExtensionTypeByNumber) {
   const Reflection* reflection =
-    unittest::TestAllExtensions::default_instance().GetReflection();
+      unittest::TestAllExtensions::default_instance().GetReflection();
 
   const FieldDescriptor* extension1 =
-    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
-      "optional_int32_extension");
+      unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
+          "optional_int32_extension");
   const FieldDescriptor* extension2 =
-    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
-      "repeated_string_extension");
+      unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
+          "repeated_string_extension");
 
   EXPECT_EQ(extension1,
             reflection->FindKnownExtensionByNumber(extension1->number()));
@@ -457,20 +455,21 @@
 
   // Extensions of TestAllExtensions should not show up as extensions of
   // other types.
-  EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()->
-              FindKnownExtensionByNumber(extension1->number()) == NULL);
+  EXPECT_TRUE(unittest::TestAllTypes::default_instance()
+                  .GetReflection()
+                  ->FindKnownExtensionByNumber(extension1->number()) == NULL);
 }
 
 TEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) {
   const Reflection* reflection =
-    unittest::TestAllExtensions::default_instance().GetReflection();
+      unittest::TestAllExtensions::default_instance().GetReflection();
 
   const FieldDescriptor* extension1 =
-    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
-      "optional_int32_extension");
+      unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
+          "optional_int32_extension");
   const FieldDescriptor* extension2 =
-    unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
-      "repeated_string_extension");
+      unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName(
+          "repeated_string_extension");
 
   EXPECT_EQ(extension1,
             reflection->FindKnownExtensionByName(extension1->full_name()));
@@ -482,8 +481,9 @@
 
   // Extensions of TestAllExtensions should not show up as extensions of
   // other types.
-  EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()->
-              FindKnownExtensionByName(extension1->full_name()) == NULL);
+  EXPECT_TRUE(unittest::TestAllTypes::default_instance()
+                  .GetReflection()
+                  ->FindKnownExtensionByName(extension1->full_name()) == NULL);
 }
 
 TEST(GeneratedMessageReflectionTest, SetAllocatedMessageTest) {
@@ -491,7 +491,7 @@
   unittest::TestAllTypes from_message2;
   unittest::TestAllTypes to_message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllTypes::descriptor());
+      unittest::TestAllTypes::descriptor());
   reflection_tester.SetAllFieldsViaReflection(&from_message1);
   reflection_tester.SetAllFieldsViaReflection(&from_message2);
 
@@ -526,7 +526,7 @@
   unittest::TestAllTypes* to_message =
       Arena::CreateMessage<unittest::TestAllTypes>(&arena);
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllTypes::descriptor());
+      unittest::TestAllTypes::descriptor());
   reflection_tester.SetAllFieldsViaReflection(&from_message1);
   reflection_tester.SetAllFieldsViaReflection(&from_message2);
 
@@ -559,7 +559,7 @@
   unittest::TestAllExtensions from_message2;
   unittest::TestAllExtensions to_message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllExtensions::descriptor());
+      unittest::TestAllExtensions::descriptor());
   reflection_tester.SetAllFieldsViaReflection(&from_message1);
   reflection_tester.SetAllFieldsViaReflection(&from_message2);
 
@@ -594,7 +594,7 @@
   unittest::TestAllExtensions from_message1;
   unittest::TestAllExtensions from_message2;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllExtensions::descriptor());
+      unittest::TestAllExtensions::descriptor());
   reflection_tester.SetAllFieldsViaReflection(&from_message1);
   reflection_tester.SetAllFieldsViaReflection(&from_message2);
 
@@ -633,8 +633,8 @@
       unittest::TestAllTypes::NestedMessage::descriptor()->FindFieldByName(
           "bb");
 
-  Message* nested = reflection->AddMessage(
-      &message, F("repeated_nested_message"));
+  Message* nested =
+      reflection->AddMessage(&message, F("repeated_nested_message"));
   nested_reflection->SetInt32(nested, nested_bb, 11);
 
   EXPECT_EQ(11, message.repeated_nested_message(0).bb());
@@ -668,7 +668,8 @@
   unittest::TestAllTypes::NestedMessage* nested =
       new unittest::TestAllTypes::NestedMessage();
   nested->set_bb(11);
-  reflection->AddAllocatedMessage(&message, F("repeated_nested_message"), nested);
+  reflection->AddAllocatedMessage(&message, F("repeated_nested_message"),
+                                  nested);
   EXPECT_EQ(1, message.repeated_nested_message_size());
   EXPECT_EQ(11, message.repeated_nested_message(0).bb());
 }
@@ -689,62 +690,68 @@
   const Reflection* reflection = message.GetReflection();
 
   // Check default values.
-  EXPECT_EQ(0, reflection->GetInt32(
-      message, descriptor->FindFieldByName("foo_int")));
+  EXPECT_EQ(
+      0, reflection->GetInt32(message, descriptor->FindFieldByName("foo_int")));
   EXPECT_EQ("", reflection->GetString(
-      message, descriptor->FindFieldByName("foo_string")));
+                    message, descriptor->FindFieldByName("foo_string")));
+  EXPECT_EQ("", reflection->GetString(message,
+                                      descriptor->FindFieldByName("foo_cord")));
   EXPECT_EQ("", reflection->GetString(
-      message, descriptor->FindFieldByName("foo_cord")));
+                    message, descriptor->FindFieldByName("foo_string_piece")));
   EXPECT_EQ("", reflection->GetString(
-      message, descriptor->FindFieldByName("foo_string_piece")));
-  EXPECT_EQ("", reflection->GetString(
-      message, descriptor->FindFieldByName("foo_bytes")));
-  EXPECT_EQ(unittest::TestOneof2::FOO, reflection->GetEnum(
-      message, descriptor->FindFieldByName("foo_enum"))->number());
+                    message, descriptor->FindFieldByName("foo_bytes")));
+  EXPECT_EQ(
+      unittest::TestOneof2::FOO,
+      reflection->GetEnum(message, descriptor->FindFieldByName("foo_enum"))
+          ->number());
   EXPECT_EQ(&unittest::TestOneof2::NestedMessage::default_instance(),
             &reflection->GetMessage(
                 message, descriptor->FindFieldByName("foo_message")));
   EXPECT_EQ(&unittest::TestOneof2::FooGroup::default_instance(),
-            &reflection->GetMessage(
-                message, descriptor->FindFieldByName("foogroup")));
+            &reflection->GetMessage(message,
+                                    descriptor->FindFieldByName("foogroup")));
   EXPECT_NE(&unittest::TestOneof2::FooGroup::default_instance(),
             &reflection->GetMessage(
                 message, descriptor->FindFieldByName("foo_lazy_message")));
-  EXPECT_EQ(5, reflection->GetInt32(
-      message, descriptor->FindFieldByName("bar_int")));
+  EXPECT_EQ(
+      5, reflection->GetInt32(message, descriptor->FindFieldByName("bar_int")));
   EXPECT_EQ("STRING", reflection->GetString(
-      message, descriptor->FindFieldByName("bar_string")));
+                          message, descriptor->FindFieldByName("bar_string")));
   EXPECT_EQ("CORD", reflection->GetString(
-      message, descriptor->FindFieldByName("bar_cord")));
-  EXPECT_EQ("SPIECE", reflection->GetString(
-      message, descriptor->FindFieldByName("bar_string_piece")));
+                        message, descriptor->FindFieldByName("bar_cord")));
+  EXPECT_EQ("SPIECE",
+            reflection->GetString(
+                message, descriptor->FindFieldByName("bar_string_piece")));
   EXPECT_EQ("BYTES", reflection->GetString(
-      message, descriptor->FindFieldByName("bar_bytes")));
-  EXPECT_EQ(unittest::TestOneof2::BAR, reflection->GetEnum(
-      message, descriptor->FindFieldByName("bar_enum"))->number());
+                         message, descriptor->FindFieldByName("bar_bytes")));
+  EXPECT_EQ(
+      unittest::TestOneof2::BAR,
+      reflection->GetEnum(message, descriptor->FindFieldByName("bar_enum"))
+          ->number());
 
   // Check Set functions.
-  reflection->SetInt32(
-      &message, descriptor->FindFieldByName("foo_int"), 123);
-  EXPECT_EQ(123, reflection->GetInt32(
-      message, descriptor->FindFieldByName("foo_int")));
-  reflection->SetString(
-      &message, descriptor->FindFieldByName("foo_string"), "abc");
+  reflection->SetInt32(&message, descriptor->FindFieldByName("foo_int"), 123);
+  EXPECT_EQ(123, reflection->GetInt32(message,
+                                      descriptor->FindFieldByName("foo_int")));
+  reflection->SetString(&message, descriptor->FindFieldByName("foo_string"),
+                        "abc");
   EXPECT_EQ("abc", reflection->GetString(
-      message, descriptor->FindFieldByName("foo_string")));
-  reflection->SetString(
-      &message, descriptor->FindFieldByName("foo_bytes"), "bytes");
+                       message, descriptor->FindFieldByName("foo_string")));
+  reflection->SetString(&message, descriptor->FindFieldByName("foo_bytes"),
+                        "bytes");
   EXPECT_EQ("bytes", reflection->GetString(
-      message, descriptor->FindFieldByName("foo_bytes")));
-  reflection->SetString(
-      &message, descriptor->FindFieldByName("bar_cord"), "change_cord");
-  EXPECT_EQ("change_cord", reflection->GetString(
-      message, descriptor->FindFieldByName("bar_cord")));
-  reflection->SetString(
-      &message, descriptor->FindFieldByName("bar_string_piece"),
-      "change_spiece");
-  EXPECT_EQ("change_spiece", reflection->GetString(
-      message, descriptor->FindFieldByName("bar_string_piece")));
+                         message, descriptor->FindFieldByName("foo_bytes")));
+  reflection->SetString(&message, descriptor->FindFieldByName("bar_cord"),
+                        "change_cord");
+  EXPECT_EQ(
+      "change_cord",
+      reflection->GetString(message, descriptor->FindFieldByName("bar_cord")));
+  reflection->SetString(&message,
+                        descriptor->FindFieldByName("bar_string_piece"),
+                        "change_spiece");
+  EXPECT_EQ("change_spiece",
+            reflection->GetString(
+                message, descriptor->FindFieldByName("bar_string_piece")));
 
   message.clear_foo();
   message.clear_bar();
@@ -769,8 +776,8 @@
   TestUtil::ReflectionTester::ExpectOneofSetViaReflection(from_message1);
 
   TestUtil::ReflectionTester::
-      SetAllocatedOptionalMessageFieldsToMessageViaReflection(
-          &from_message1, &to_message);
+      SetAllocatedOptionalMessageFieldsToMessageViaReflection(&from_message1,
+                                                              &to_message);
   const Message& sub_message = reflection->GetMessage(
       to_message, descriptor->FindFieldByName("foo_lazy_message"));
   released = reflection->ReleaseMessage(
@@ -781,12 +788,12 @@
 
   TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2);
 
-  reflection->MutableMessage(
-      &from_message2, descriptor->FindFieldByName("foo_message"));
+  reflection->MutableMessage(&from_message2,
+                             descriptor->FindFieldByName("foo_message"));
 
   TestUtil::ReflectionTester::
-      SetAllocatedOptionalMessageFieldsToMessageViaReflection(
-          &from_message2, &to_message);
+      SetAllocatedOptionalMessageFieldsToMessageViaReflection(&from_message2,
+                                                              &to_message);
 
   const Message& sub_message2 = reflection->GetMessage(
       to_message, descriptor->FindFieldByName("foo_message"));
@@ -817,8 +824,8 @@
   TestUtil::ReflectionTester::ExpectOneofSetViaReflection(from_message1);
 
   TestUtil::ReflectionTester::
-      SetAllocatedOptionalMessageFieldsToMessageViaReflection(
-          &from_message1, to_message);
+      SetAllocatedOptionalMessageFieldsToMessageViaReflection(&from_message1,
+                                                              to_message);
   const Message& sub_message = reflection->GetMessage(
       *to_message, descriptor->FindFieldByName("foo_lazy_message"));
   released = reflection->ReleaseMessage(
@@ -831,12 +838,12 @@
 
   TestUtil::ReflectionTester::SetOneofViaReflection(&from_message2);
 
-  reflection->MutableMessage(
-      &from_message2, descriptor->FindFieldByName("foo_message"));
+  reflection->MutableMessage(&from_message2,
+                             descriptor->FindFieldByName("foo_message"));
 
   TestUtil::ReflectionTester::
-      SetAllocatedOptionalMessageFieldsToMessageViaReflection(
-          &from_message2, to_message);
+      SetAllocatedOptionalMessageFieldsToMessageViaReflection(&from_message2,
+                                                              to_message);
 
   const Message& sub_message2 = reflection->GetMessage(
       *to_message, descriptor->FindFieldByName("foo_message"));
@@ -849,11 +856,10 @@
   delete released;
 }
 
-
 TEST(GeneratedMessageReflectionTest, ReleaseMessageTest) {
   unittest::TestAllTypes message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllTypes::descriptor());
+      unittest::TestAllTypes::descriptor());
 
   // When nothing is set, we expect all released messages to be NULL.
   reflection_tester.ExpectMessagesReleasedViaReflection(
@@ -879,7 +885,7 @@
 TEST(GeneratedMessageReflectionTest, ReleaseExtensionMessageTest) {
   unittest::TestAllExtensions message;
   TestUtil::ReflectionTester reflection_tester(
-    unittest::TestAllExtensions::descriptor());
+      unittest::TestAllExtensions::descriptor());
 
   // When nothing is set, we expect all released messages to be NULL.
   reflection_tester.ExpectMessagesReleasedViaReflection(
@@ -1001,39 +1007,41 @@
   // Testing every single failure mode would be too much work.  Let's just
   // check a few.
   EXPECT_DEATH(
-    reflection->GetInt32(
-      message, descriptor->FindFieldByName("optional_int64")),
-    "Protocol Buffer reflection usage error:\n"
-    "  Method      : google::protobuf::Reflection::GetInt32\n"
-    "  Message type: protobuf_unittest\\.TestAllTypes\n"
-    "  Field       : protobuf_unittest\\.TestAllTypes\\.optional_int64\n"
-    "  Problem     : Field is not the right type for this message:\n"
-    "    Expected  : CPPTYPE_INT32\n"
-    "    Field type: CPPTYPE_INT64");
+      reflection->GetInt32(message,
+                           descriptor->FindFieldByName("optional_int64")),
+      "Protocol Buffer reflection usage error:\n"
+      "  Method      : google::protobuf::Reflection::GetInt32\n"
+      "  Message type: protobuf_unittest\\.TestAllTypes\n"
+      "  Field       : protobuf_unittest\\.TestAllTypes\\.optional_int64\n"
+      "  Problem     : Field is not the right type for this message:\n"
+      "    Expected  : CPPTYPE_INT32\n"
+      "    Field type: CPPTYPE_INT64");
+  EXPECT_DEATH(reflection->GetInt32(
+                   message, descriptor->FindFieldByName("repeated_int32")),
+               "Protocol Buffer reflection usage error:\n"
+               "  Method      : google::protobuf::Reflection::GetInt32\n"
+               "  Message type: protobuf_unittest.TestAllTypes\n"
+               "  Field       : protobuf_unittest.TestAllTypes.repeated_int32\n"
+               "  Problem     : Field is repeated; the method requires a "
+               "singular field.");
   EXPECT_DEATH(
-    reflection->GetInt32(
-      message, descriptor->FindFieldByName("repeated_int32")),
-    "Protocol Buffer reflection usage error:\n"
-    "  Method      : google::protobuf::Reflection::GetInt32\n"
-    "  Message type: protobuf_unittest.TestAllTypes\n"
-    "  Field       : protobuf_unittest.TestAllTypes.repeated_int32\n"
-    "  Problem     : Field is repeated; the method requires a singular field.");
+      reflection->GetInt32(
+          message,
+          unittest::ForeignMessage::descriptor()->FindFieldByName("c")),
+      "Protocol Buffer reflection usage error:\n"
+      "  Method      : google::protobuf::Reflection::GetInt32\n"
+      "  Message type: protobuf_unittest.TestAllTypes\n"
+      "  Field       : protobuf_unittest.ForeignMessage.c\n"
+      "  Problem     : Field does not match message type.");
   EXPECT_DEATH(
-    reflection->GetInt32(
-      message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")),
-    "Protocol Buffer reflection usage error:\n"
-    "  Method      : google::protobuf::Reflection::GetInt32\n"
-    "  Message type: protobuf_unittest.TestAllTypes\n"
-    "  Field       : protobuf_unittest.ForeignMessage.c\n"
-    "  Problem     : Field does not match message type.");
-  EXPECT_DEATH(
-    reflection->HasField(
-      message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")),
-    "Protocol Buffer reflection usage error:\n"
-    "  Method      : google::protobuf::Reflection::HasField\n"
-    "  Message type: protobuf_unittest.TestAllTypes\n"
-    "  Field       : protobuf_unittest.ForeignMessage.c\n"
-    "  Problem     : Field does not match message type.");
+      reflection->HasField(
+          message,
+          unittest::ForeignMessage::descriptor()->FindFieldByName("c")),
+      "Protocol Buffer reflection usage error:\n"
+      "  Method      : google::protobuf::Reflection::HasField\n"
+      "  Message type: protobuf_unittest.TestAllTypes\n"
+      "  Field       : protobuf_unittest.ForeignMessage.c\n"
+      "  Problem     : Field does not match message type.");
 
 #undef f
 }
diff --git a/src/google/protobuf/generated_message_table_driven.cc b/src/google/protobuf/generated_message_table_driven.cc
index dc2e693..fb82a8e 100644
--- a/src/google/protobuf/generated_message_table_driven.cc
+++ b/src/google/protobuf/generated_message_table_driven.cc
@@ -57,32 +57,30 @@
   static constexpr bool IsLite() { return false; }
 
   static bool Skip(MessageLite* msg, const ParseTable& table,
-                   io::CodedInputStream* input,
-                   int tag) {
+                   io::CodedInputStream* input, int tag) {
     GOOGLE_DCHECK(table.unknown_field_set);
 
     return WireFormat::SkipField(input, tag,
-        MutableUnknownFields(msg, table.arena_offset));
+                                 MutableUnknownFields(msg, table.arena_offset));
   }
 
-  static void Varint(MessageLite* msg, const ParseTable& table,
-                     int tag, int value) {
+  static void Varint(MessageLite* msg, const ParseTable& table, int tag,
+                     int value) {
     GOOGLE_DCHECK(table.unknown_field_set);
 
-    MutableUnknownFields(msg, table.arena_offset)->AddVarint(
-        WireFormatLite::GetTagFieldNumber(tag), value);
+    MutableUnknownFields(msg, table.arena_offset)
+        ->AddVarint(WireFormatLite::GetTagFieldNumber(tag), value);
   }
 
-  static bool ParseExtension(
-      MessageLite* msg, const ParseTable& table,
-      io::CodedInputStream* input, int tag) {
+  static bool ParseExtension(MessageLite* msg, const ParseTable& table,
+                             io::CodedInputStream* input, int tag) {
     ExtensionSet* extensions = GetExtensionSet(msg, table.extension_offset);
     if (extensions == NULL) {
       return false;
     }
 
-    const Message* prototype = down_cast<const Message*>(
-        table.default_instance());
+    const Message* prototype =
+        down_cast<const Message*>(table.default_instance());
 
     GOOGLE_DCHECK(prototype != NULL);
     GOOGLE_DCHECK(table.unknown_field_set);
@@ -95,8 +93,8 @@
 
 }  // namespace
 
-bool MergePartialFromCodedStream(
-    MessageLite* msg, const ParseTable& table, io::CodedInputStream* input) {
+bool MergePartialFromCodedStream(MessageLite* msg, const ParseTable& table,
+                                 io::CodedInputStream* input) {
   return MergePartialFromCodedStreamImpl<UnknownFieldHandler,
                                          InternalMetadataWithArena>(msg, table,
                                                                     input);
diff --git a/src/google/protobuf/generated_message_table_driven.h b/src/google/protobuf/generated_message_table_driven.h
index 8564f5e..1394ab1 100644
--- a/src/google/protobuf/generated_message_table_driven.h
+++ b/src/google/protobuf/generated_message_table_driven.h
@@ -114,7 +114,6 @@
   static int CalculateType(int fundamental_type, FieldTypeClass type_class);
 };
 
-
 // TODO(ckennelly):  Add a static assertion to ensure that these masks do not
 // conflict with wiretypes.
 
@@ -219,7 +218,7 @@
 bool MergePartialFromCodedStream(MessageLite* msg, const ParseTable& table,
                                  io::CodedInputStream* input);
 bool MergePartialFromCodedStreamLite(MessageLite* msg, const ParseTable& table,
-                                 io::CodedInputStream* input);
+                                     io::CodedInputStream* input);
 
 template <typename Entry>
 bool ParseMap(io::CodedInputStream* input, void* map_field) {
diff --git a/src/google/protobuf/generated_message_table_driven_lite.cc b/src/google/protobuf/generated_message_table_driven_lite.cc
index 05d4f29..82de6bc 100644
--- a/src/google/protobuf/generated_message_table_driven_lite.cc
+++ b/src/google/protobuf/generated_message_table_driven_lite.cc
@@ -54,8 +54,7 @@
   static constexpr bool IsLite() { return true; }
 
   static bool Skip(MessageLite* msg, const ParseTable& table,
-                   io::CodedInputStream* input,
-                   int tag) {
+                   io::CodedInputStream* input, int tag) {
     GOOGLE_DCHECK(!table.unknown_field_set);
     io::StringOutputStream unknown_fields_string(
         MutableUnknownFields(msg, table.arena_offset));
@@ -65,8 +64,8 @@
                                                &unknown_fields_stream);
   }
 
-  static void Varint(MessageLite* msg, const ParseTable& table,
-                     int tag, int value) {
+  static void Varint(MessageLite* msg, const ParseTable& table, int tag,
+                     int value) {
     GOOGLE_DCHECK(!table.unknown_field_set);
 
     io::StringOutputStream unknown_fields_string(
@@ -76,9 +75,8 @@
     unknown_fields_stream.WriteVarint32(value);
   }
 
-  static bool ParseExtension(
-      MessageLite* msg, const ParseTable& table,
-      io::CodedInputStream* input, int tag) {
+  static bool ParseExtension(MessageLite* msg, const ParseTable& table,
+                             io::CodedInputStream* input, int tag) {
     ExtensionSet* extensions = GetExtensionSet(msg, table.extension_offset);
     if (extensions == NULL) {
       return false;
@@ -90,15 +88,15 @@
     io::StringOutputStream unknown_fields_string(
         MutableUnknownFields(msg, table.arena_offset));
     io::CodedOutputStream unknown_fields_stream(&unknown_fields_string, false);
-    return extensions->ParseField(
-        tag, input, prototype, &unknown_fields_stream);
+    return extensions->ParseField(tag, input, prototype,
+                                  &unknown_fields_stream);
   }
 };
 
 }  // namespace
 
-bool MergePartialFromCodedStreamLite(
-    MessageLite* msg, const ParseTable& table, io::CodedInputStream* input) {
+bool MergePartialFromCodedStreamLite(MessageLite* msg, const ParseTable& table,
+                                     io::CodedInputStream* input) {
   return MergePartialFromCodedStreamImpl<UnknownFieldHandlerLite,
                                          InternalMetadataWithArenaLite>(
       msg, table, input);
diff --git a/src/google/protobuf/generated_message_table_driven_lite.h b/src/google/protobuf/generated_message_table_driven_lite.h
index c8e24c4..b36e51b 100644
--- a/src/google/protobuf/generated_message_table_driven_lite.h
+++ b/src/google/protobuf/generated_message_table_driven_lite.h
@@ -102,7 +102,7 @@
 template <typename Type>
 inline Type* AddField(MessageLite* msg, int64 offset) {
   static_assert(std::is_pod<Type>::value ||
-                std::is_same<Type, InlinedStringField>::value,
+                    std::is_same<Type, InlinedStringField>::value,
                 "Do not assign");
 
   RepeatedField<Type>* repeated = Raw<RepeatedField<Type>>(msg, offset);
@@ -157,7 +157,7 @@
 // Clears a oneof field. The field argument should correspond to the particular
 // field that is currently set in the oneof.
 inline void ClearOneofField(const ParseTableField& field, Arena* arena,
-                     MessageLite* msg) {
+                            MessageLite* msg) {
   switch (field.processing_type & kTypeMask) {
     case WireFormatLite::TYPE_MESSAGE:
       if (arena == NULL) {
@@ -241,8 +241,8 @@
       switch (cardinality) {
         case Cardinality_SINGULAR:
           // TODO(ckennelly): Is this optimal?
-          s = MutableField<InlinedStringField>(
-              msg, has_bits, has_bit_index, offset);
+          s = MutableField<InlinedStringField>(msg, has_bits, has_bit_index,
+                                               offset);
           break;
         case Cardinality_REPEATED:
           s = AddField<InlinedStringField>(msg, offset);
@@ -543,8 +543,7 @@
         {
           Arena* const arena =
               GetArena<InternalMetadata>(msg, table.arena_offset);
-          const void* default_ptr =
-              table.aux[field_number].strings.default_ptr;
+          const void* default_ptr = table.aux[field_number].strings.default_ptr;
 
           if (PROTOBUF_PREDICT_FALSE(
                   (!HandleString<UnknownFieldHandler, Cardinality_REPEATED,
@@ -782,8 +781,8 @@
       // TODO(ckennelly): Use a computed goto on GCC/LLVM.
       //
       // Mask out kRepeatedMask bit, allowing the jump table to be smaller.
-      switch (static_cast<WireFormatLite::FieldType>(
-          processing_type ^ kRepeatedMask)) {
+      switch (static_cast<WireFormatLite::FieldType>(processing_type ^
+                                                     kRepeatedMask)) {
 #define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD)                      \
   case WireFormatLite::TYPE_##TYPE: {                                          \
     RepeatedField<CPPTYPE>* values = Raw<RepeatedField<CPPTYPE>>(msg, offset); \
diff --git a/src/google/protobuf/generated_message_util.cc b/src/google/protobuf/generated_message_util.cc
index 26a422f..363eca4 100644
--- a/src/google/protobuf/generated_message_util.cc
+++ b/src/google/protobuf/generated_message_util.cc
@@ -40,7 +40,7 @@
 // We're only using this as a standard way for getting the thread id.
 // We're not using any thread functionality.
 #include <thread>  // NOLINT
-#endif  // #ifndef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
+#endif             // #ifndef GOOGLE_PROTOBUF_SUPPORT_WINDOWS_XP
 
 #include <vector>
 
@@ -497,8 +497,8 @@
     for (int i = 0; i < AccessorHelper::Size(array); i++) {
       WriteTagTo(md.tag, output);
       SerializeMessageTo(
-          static_cast<const MessageLite*>(AccessorHelper::Get(array, i)), md.ptr,
-          output);
+          static_cast<const MessageLite*>(AccessorHelper::Get(array, i)),
+          md.ptr, output);
     }
   }
 };
@@ -663,8 +663,8 @@
       case FieldMetadata::kSpecial:
         func = reinterpret_cast<SpecialSerializer>(
             const_cast<void*>(field_metadata.ptr));
-        func (base, field_metadata.offset, field_metadata.tag,
-            field_metadata.has_offset, output);
+        func(base, field_metadata.offset, field_metadata.tag,
+             field_metadata.has_offset, output);
         break;
       default:
         // __builtin_unreachable()
@@ -708,10 +708,10 @@
         io::ArrayOutputStream array_stream(array_output.ptr, INT_MAX);
         io::CodedOutputStream output(&array_stream);
         output.SetSerializationDeterministic(is_deterministic);
-                func =  reinterpret_cast<SpecialSerializer>(
+        func = reinterpret_cast<SpecialSerializer>(
             const_cast<void*>(field_metadata.ptr));
-                func (base, field_metadata.offset, field_metadata.tag,
-            field_metadata.has_offset, &output);
+        func(base, field_metadata.offset, field_metadata.tag,
+             field_metadata.has_offset, &output);
         array_output.ptr += output.ByteCount();
       } break;
       default:
@@ -768,7 +768,8 @@
 
 void InitSCC_DFS(SCCInfoBase* scc) {
   if (scc->visit_status.load(std::memory_order_relaxed) !=
-      SCCInfoBase::kUninitialized) return;
+      SCCInfoBase::kUninitialized)
+    return;
   scc->visit_status.store(SCCInfoBase::kRunning, std::memory_order_relaxed);
   // Each base is followed by an array of pointers to deps
   auto deps = reinterpret_cast<SCCInfoBase* const*>(scc + 1);
diff --git a/src/google/protobuf/generated_message_util.h b/src/google/protobuf/generated_message_util.h
index d0c0a8a..bf0e5b9 100644
--- a/src/google/protobuf/generated_message_util.h
+++ b/src/google/protobuf/generated_message_util.h
@@ -65,15 +65,17 @@
 
 class Arena;
 
-namespace io { class CodedInputStream; }
+namespace io {
+class CodedInputStream;
+}
 
 namespace internal {
 
-template<typename To, typename From>
+template <typename To, typename From>
 inline To DownCast(From* f) {
   return PROTOBUF_NAMESPACE_ID::internal::down_cast<To>(f);
 }
-template<typename To, typename From>
+template <typename To, typename From>
 inline To DownCast(From& f) {
   return PROTOBUF_NAMESPACE_ID::internal::down_cast<To>(f);
 }
@@ -93,8 +95,9 @@
 // helper here to keep the protobuf compiler from ever having to emit loops in
 // IsInitialized() methods.  We want the C++ compiler to inline this or not
 // as it sees fit.
-template <class Type> bool AllAreInitialized(const Type& t) {
-  for (int i = t.size(); --i >= 0; ) {
+template <class Type>
+bool AllAreInitialized(const Type& t) {
+  for (int i = t.size(); --i >= 0;) {
     if (!t.Get(i).IsInitialized()) return false;
   }
   return true;
@@ -167,6 +170,7 @@
  public:
   int Get() const { return size_.load(std::memory_order_relaxed); }
   void Set(int size) { size_.store(size, std::memory_order_relaxed); }
+
  private:
   std::atomic<int> size_{0};
 };
diff --git a/src/google/protobuf/has_bits.h b/src/google/protobuf/has_bits.h
index ff0e176..11afde7 100644
--- a/src/google/protobuf/has_bits.h
+++ b/src/google/protobuf/has_bits.h
@@ -44,7 +44,7 @@
 namespace protobuf {
 namespace internal {
 
-template<size_t doublewords>
+template <size_t doublewords>
 class HasBits {
  public:
   HasBits() PROTOBUF_ALWAYS_INLINE { Clear(); }
@@ -69,6 +69,10 @@
     return !(*this == rhs);
   }
 
+  void Or(const HasBits<doublewords>& rhs) {
+    for (int i = 0; i < doublewords; i++) has_bits_[i] |= rhs[i];
+  }
+
   bool empty() const;
 
  private:
diff --git a/src/google/protobuf/io/coded_stream.cc b/src/google/protobuf/io/coded_stream.cc
index ff08709..6aaaa0b 100644
--- a/src/google/protobuf/io/coded_stream.cc
+++ b/src/google/protobuf/io/coded_stream.cc
@@ -38,14 +38,14 @@
 // will not cross the end of the buffer, since we can avoid a lot
 // of branching in this case.
 
-#include <google/protobuf/io/coded_stream_inl.h>
+#include <limits.h>
 #include <algorithm>
 #include <utility>
-#include <limits.h>
-#include <google/protobuf/io/zero_copy_stream.h>
-#include <google/protobuf/arena.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/io/coded_stream_inl.h>
+#include <google/protobuf/io/zero_copy_stream.h>
+#include <google/protobuf/arena.h>
 #include <google/protobuf/stubs/stl_util.h>
 
 
@@ -61,8 +61,8 @@
 static const int kMaxVarint32Bytes = 5;
 
 
-inline bool NextNonEmpty(ZeroCopyInputStream* input,
-                         const void** data, int* size) {
+inline bool NextNonEmpty(ZeroCopyInputStream* input, const void** data,
+                         int* size) {
   bool success;
   do {
     success = input->Next(data, size);
@@ -124,8 +124,8 @@
   // and overflow. Also check that the new requested limit is before the
   // previous limit; otherwise we continue to enforce the previous limit.
   if (PROTOBUF_PREDICT_TRUE(byte_limit >= 0 &&
-                        byte_limit <= INT_MAX - current_position &&
-                        byte_limit < current_limit_ - current_position)) {
+                            byte_limit <= INT_MAX - current_position &&
+                            byte_limit < current_limit_ - current_position)) {
     current_limit_ = current_position + byte_limit;
     RecomputeBufferLimits();
   }
@@ -190,7 +190,8 @@
 
 void CodedInputStream::PrintTotalBytesLimitError() {
   GOOGLE_LOG(ERROR) << "A protocol message was rejected because it was too "
-                "big (more than " << total_bytes_limit_
+                "big (more than "
+             << total_bytes_limit_
              << " bytes).  To increase the limit (or to disable these "
                 "warnings), see CodedInputStream::SetTotalBytesLimit() "
                 "in net/proto2/io/public/coded_stream.h.";
@@ -333,9 +334,9 @@
 // part is buffer + (number of bytes read).  This function is always inlined,
 // so returning a pair is costless.
 PROTOBUF_ALWAYS_INLINE
-::std::pair<bool, const uint8*> ReadVarint32FromArray(
-    uint32 first_byte, const uint8* buffer,
-    uint32* value);
+::std::pair<bool, const uint8*> ReadVarint32FromArray(uint32 first_byte,
+                                                      const uint8* buffer,
+                                                      uint32* value);
 inline ::std::pair<bool, const uint8*> ReadVarint32FromArray(
     uint32 first_byte, const uint8* buffer, uint32* value) {
   // Fast path:  We have enough bytes left in the buffer to guarantee that
@@ -346,26 +347,35 @@
   uint32 b;
   uint32 result = first_byte - 0x80;
   ++ptr;  // We just processed the first byte.  Move on to the second.
-  b = *(ptr++); result += b <<  7; if (!(b & 0x80)) goto done;
+  b = *(ptr++);
+  result += b << 7;
+  if (!(b & 0x80)) goto done;
   result -= 0x80 << 7;
-  b = *(ptr++); result += b << 14; if (!(b & 0x80)) goto done;
+  b = *(ptr++);
+  result += b << 14;
+  if (!(b & 0x80)) goto done;
   result -= 0x80 << 14;
-  b = *(ptr++); result += b << 21; if (!(b & 0x80)) goto done;
+  b = *(ptr++);
+  result += b << 21;
+  if (!(b & 0x80)) goto done;
   result -= 0x80 << 21;
-  b = *(ptr++); result += b << 28; if (!(b & 0x80)) goto done;
+  b = *(ptr++);
+  result += b << 28;
+  if (!(b & 0x80)) goto done;
   // "result -= 0x80 << 28" is irrevelant.
 
   // If the input is larger than 32 bits, we still need to read it all
   // and discard the high-order bits.
   for (int i = 0; i < kMaxVarintBytes - kMaxVarint32Bytes; i++) {
-    b = *(ptr++); if (!(b & 0x80)) goto done;
+    b = *(ptr++);
+    if (!(b & 0x80)) goto done;
   }
 
   // We have overrun the maximum size of a varint (10 bytes).  Assume
   // the data is corrupt.
   return std::make_pair(false, ptr);
 
- done:
+done:
   *value = result;
   return std::make_pair(true, ptr);
 }
@@ -424,7 +434,7 @@
         << "Caller should provide us with *buffer_ when buffer is non-empty";
     uint32 temp;
     ::std::pair<bool, const uint8*> p =
-          ReadVarint32FromArray(first_byte_or_zero, buffer_, &temp);
+        ReadVarint32FromArray(first_byte_or_zero, buffer_, &temp);
     if (!p.first) return -1;
     buffer_ = p.second;
     return temp;
@@ -635,13 +645,13 @@
 
 CodedOutputStream::CodedOutputStream(ZeroCopyOutputStream* output,
                                      bool do_eager_refresh)
-  : output_(output),
-    buffer_(NULL),
-    buffer_size_(0),
-    total_bytes_(0),
-    had_error_(false),
-    aliasing_enabled_(false),
-    is_serialization_deterministic_(IsDefaultSerializationDeterministic()) {
+    : output_(output),
+      buffer_(NULL),
+      buffer_size_(0),
+      total_bytes_(0),
+      had_error_(false),
+      aliasing_enabled_(false),
+      is_serialization_deterministic_(IsDefaultSerializationDeterministic()) {
   if (do_eager_refresh) {
     // Eagerly Refresh() so buffer space is immediately available.
     Refresh();
@@ -652,9 +662,7 @@
   }
 }
 
-CodedOutputStream::~CodedOutputStream() {
-  Trim();
-}
+CodedOutputStream::~CodedOutputStream() { Trim(); }
 
 void CodedOutputStream::Trim() {
   if (buffer_size_ > 0) {
@@ -697,8 +705,8 @@
   Advance(size);
 }
 
-uint8* CodedOutputStream::WriteRawToArray(
-    const void* data, int size, uint8* target) {
+uint8* CodedOutputStream::WriteRawToArray(const void* data, int size,
+                                          uint8* target) {
   memcpy(target, data, size);
   return target + size;
 }
@@ -706,7 +714,7 @@
 
 void CodedOutputStream::WriteAliasedRaw(const void* data, int size) {
   if (size < buffer_size_
-      ) {
+  ) {
     WriteRaw(data, size);
   } else {
     Trim();
diff --git a/src/google/protobuf/io/coded_stream.h b/src/google/protobuf/io/coded_stream.h
index 2f1f270..5d065fc 100644
--- a/src/google/protobuf/io/coded_stream.h
+++ b/src/google/protobuf/io/coded_stream.h
@@ -115,22 +115,22 @@
 #include <string>
 #include <utility>
 #ifdef _MSC_VER
-  // Assuming windows is always little-endian.
-  #if !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST)
-    #define PROTOBUF_LITTLE_ENDIAN 1
-  #endif
-  #if _MSC_VER >= 1300 && !defined(__INTEL_COMPILER)
-    // If MSVC has "/RTCc" set, it will complain about truncating casts at
-    // runtime.  This file contains some intentional truncating casts.
-    #pragma runtime_checks("c", off)
-  #endif
+// Assuming windows is always little-endian.
+#if !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST)
+#define PROTOBUF_LITTLE_ENDIAN 1
+#endif
+#if _MSC_VER >= 1300 && !defined(__INTEL_COMPILER)
+// If MSVC has "/RTCc" set, it will complain about truncating casts at
+// runtime.  This file contains some intentional truncating casts.
+#pragma runtime_checks("c", off)
+#endif
 #else
-  #include <sys/param.h>   // __BYTE_ORDER
-  #if ((defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \
-         (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN)) && \
-      !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST)
-    #define PROTOBUF_LITTLE_ENDIAN 1
-  #endif
+#include <sys/param.h>  // __BYTE_ORDER
+#if ((defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) ||    \
+     (defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN)) && \
+    !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST)
+#define PROTOBUF_LITTLE_ENDIAN 1
+#endif
 #endif
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/port.h>
@@ -158,8 +158,8 @@
 class CodedOutputStream;
 
 // Defined in other files.
-class ZeroCopyInputStream;           // zero_copy_stream.h
-class ZeroCopyOutputStream;          // zero_copy_stream.h
+class ZeroCopyInputStream;   // zero_copy_stream.h
+class ZeroCopyOutputStream;  // zero_copy_stream.h
 
 // Class which reads and decodes binary data which is composed of varint-
 // encoded integers and fixed-width pieces.  Wraps a ZeroCopyInputStream.
@@ -234,10 +234,10 @@
   // responsible for ensuring that the buffer has sufficient space.
   // Read a 32-bit little-endian integer.
   static const uint8* ReadLittleEndian32FromArray(const uint8* buffer,
-                                                   uint32* value);
+                                                  uint32* value);
   // Read a 64-bit little-endian integer.
   static const uint8* ReadLittleEndian64FromArray(const uint8* buffer,
-                                                   uint64* value);
+                                                  uint64* value);
 
   // Read an unsigned integer with Varint encoding, truncating to 32 bits.
   // Reading a 32-bit value is equivalent to reading a 64-bit one and casting
@@ -537,7 +537,7 @@
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedInputStream);
 
   const uint8* buffer_;
-  const uint8* buffer_end_;     // pointer to the end of the buffer.
+  const uint8* buffer_end_;  // pointer to the end of the buffer.
   ZeroCopyInputStream* input_;
   int total_bytes_read_;  // total bytes read from input_, including
                           // the current buffer
@@ -547,7 +547,7 @@
   int overflow_bytes_;
 
   // LastTagWas() stuff.
-  uint32 last_tag_;         // result of last ReadTag() or ReadTagWithCutoff().
+  uint32 last_tag_;  // result of last ReadTag() or ReadTagWithCutoff().
 
   // This is set true by ReadTag{Fallback/Slow}() if it is called when exactly
   // at EOF, or by ExpectAtEnd() when it returns true.  This happens when we
@@ -558,7 +558,7 @@
   bool aliasing_enabled_;
 
   // Limits
-  Limit current_limit_;   // if position = -1, no limit is applied
+  Limit current_limit_;  // if position = -1, no limit is applied
 
   // For simplicity, if the current buffer crosses a limit (either a normal
   // limit created by PushLimit() or the total bytes limit), buffer_size_
@@ -817,12 +817,8 @@
         (Value < (1 << 7))
             ? 1
             : (Value < (1 << 14))
-                ? 2
-                : (Value < (1 << 21))
-                    ? 3
-                    : (Value < (1 << 28))
-                        ? 4
-                        : 5;
+                  ? 2
+                  : (Value < (1 << 21)) ? 3 : (Value < (1 << 28)) ? 4 : 5;
   };
 
   // Returns the total number of bytes written since this object was created.
@@ -878,8 +874,8 @@
   ZeroCopyOutputStream* output_;
   uint8* buffer_;
   int buffer_size_;
-  int total_bytes_;  // Sum of sizes of all buffers seen so far.
-  bool had_error_;   // Whether an error occurred during output.
+  int total_bytes_;        // Sum of sizes of all buffers seen so far.
+  bool had_error_;         // Whether an error occurred during output.
   bool aliasing_enabled_;  // See EnableAliasing().
   bool is_serialization_deterministic_;
   static std::atomic<bool> default_serialization_deterministic_;
@@ -958,14 +954,13 @@
 
 // static
 inline const uint8* CodedInputStream::ReadLittleEndian32FromArray(
-    const uint8* buffer,
-    uint32* value) {
+    const uint8* buffer, uint32* value) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
   memcpy(value, buffer, sizeof(*value));
   return buffer + sizeof(*value);
 #else
-  *value = (static_cast<uint32>(buffer[0])      ) |
-           (static_cast<uint32>(buffer[1]) <<  8) |
+  *value = (static_cast<uint32>(buffer[0])) |
+           (static_cast<uint32>(buffer[1]) << 8) |
            (static_cast<uint32>(buffer[2]) << 16) |
            (static_cast<uint32>(buffer[3]) << 24);
   return buffer + sizeof(*value);
@@ -973,22 +968,20 @@
 }
 // static
 inline const uint8* CodedInputStream::ReadLittleEndian64FromArray(
-    const uint8* buffer,
-    uint64* value) {
+    const uint8* buffer, uint64* value) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
   memcpy(value, buffer, sizeof(*value));
   return buffer + sizeof(*value);
 #else
-  uint32 part0 = (static_cast<uint32>(buffer[0])      ) |
-                 (static_cast<uint32>(buffer[1]) <<  8) |
+  uint32 part0 = (static_cast<uint32>(buffer[0])) |
+                 (static_cast<uint32>(buffer[1]) << 8) |
                  (static_cast<uint32>(buffer[2]) << 16) |
                  (static_cast<uint32>(buffer[3]) << 24);
-  uint32 part1 = (static_cast<uint32>(buffer[4])      ) |
-                 (static_cast<uint32>(buffer[5]) <<  8) |
+  uint32 part1 = (static_cast<uint32>(buffer[4])) |
+                 (static_cast<uint32>(buffer[5]) << 8) |
                  (static_cast<uint32>(buffer[6]) << 16) |
                  (static_cast<uint32>(buffer[7]) << 24);
-  *value = static_cast<uint64>(part0) |
-          (static_cast<uint64>(part1) << 32);
+  *value = static_cast<uint64>(part0) | (static_cast<uint64>(part1) << 32);
   return buffer + sizeof(*value);
 #endif
 }
@@ -1082,7 +1075,8 @@
 
 inline bool CodedInputStream::ExpectTag(uint32 expected) {
   if (expected < (1 << 7)) {
-    if (PROTOBUF_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] == expected) {
+    if (PROTOBUF_PREDICT_TRUE(buffer_ < buffer_end_) &&
+        buffer_[0] == expected) {
       Advance(1);
       return true;
     } else {
@@ -1103,8 +1097,8 @@
   }
 }
 
-inline const uint8* CodedInputStream::ExpectTagFromArray(
-    const uint8* buffer, uint32 expected) {
+inline const uint8* CodedInputStream::ExpectTagFromArray(const uint8* buffer,
+                                                         uint32 expected) {
   if (expected < (1 << 7)) {
     if (buffer[0] == expected) {
       return buffer + 1;
@@ -1128,9 +1122,8 @@
   // If we are at a limit we know no more bytes can be read.  Otherwise, it's
   // hard to say without calling Refresh(), and we'd rather not do that.
 
-  if (buffer_ == buffer_end_ &&
-      ((buffer_size_after_limit_ != 0) ||
-       (total_bytes_read_ == current_limit_))) {
+  if (buffer_ == buffer_end_ && ((buffer_size_after_limit_ != 0) ||
+                                 (total_bytes_read_ == current_limit_))) {
     last_tag_ = 0;                   // Pretend we called ReadTag()...
     legitimate_message_end_ = true;  // ... and it hit EOF.
     return true;
@@ -1190,7 +1183,7 @@
   memcpy(target, &value, sizeof(value));
 #else
   target[0] = static_cast<uint8>(value);
-  target[1] = static_cast<uint8>(value >>  8);
+  target[1] = static_cast<uint8>(value >> 8);
   target[2] = static_cast<uint8>(value >> 16);
   target[3] = static_cast<uint8>(value >> 24);
 #endif
@@ -1206,11 +1199,11 @@
   uint32 part1 = static_cast<uint32>(value >> 32);
 
   target[0] = static_cast<uint8>(part0);
-  target[1] = static_cast<uint8>(part0 >>  8);
+  target[1] = static_cast<uint8>(part0 >> 8);
   target[2] = static_cast<uint8>(part0 >> 16);
   target[3] = static_cast<uint8>(part0 >> 24);
   target[4] = static_cast<uint8>(part1);
-  target[5] = static_cast<uint8>(part1 >>  8);
+  target[5] = static_cast<uint8>(part1 >> 8);
   target[6] = static_cast<uint8>(part1 >> 16);
   target[7] = static_cast<uint8>(part1 >> 24);
 #endif
@@ -1243,12 +1236,9 @@
   }
 }
 
-inline void CodedOutputStream::WriteTag(uint32 value) {
-  WriteVarint32(value);
-}
+inline void CodedOutputStream::WriteTag(uint32 value) { WriteVarint32(value); }
 
-inline uint8* CodedOutputStream::WriteTagToArray(
-    uint32 value, uint8* target) {
+inline uint8* CodedOutputStream::WriteTagToArray(uint32 value, uint8* target) {
   return WriteVarint32ToArray(value, target);
 }
 
@@ -1274,7 +1264,7 @@
 
 inline size_t CodedOutputStream::VarintSize32SignExtended(int32 value) {
   if (value < 0) {
-    return 10;     // TODO(kenton):  Make this a symbolic constant.
+    return 10;  // TODO(kenton):  Make this a symbolic constant.
   } else {
     return VarintSize32(static_cast<uint32>(value));
   }
@@ -1284,8 +1274,8 @@
   WriteRaw(str.data(), static_cast<int>(str.size()));
 }
 
-inline void CodedOutputStream::WriteRawMaybeAliased(
-    const void* data, int size) {
+inline void CodedOutputStream::WriteRawMaybeAliased(const void* data,
+                                                    int size) {
   if (aliasing_enabled_) {
     WriteAliasedRaw(data, size);
   } else {
@@ -1302,9 +1292,7 @@
   return total_bytes_ - buffer_size_;
 }
 
-inline void CodedInputStream::Advance(int amount) {
-  buffer_ += amount;
-}
+inline void CodedInputStream::Advance(int amount) { buffer_ += amount; }
 
 inline void CodedOutputStream::Advance(int amount) {
   buffer_ += amount;
@@ -1349,48 +1337,46 @@
 }
 
 inline CodedInputStream::CodedInputStream(ZeroCopyInputStream* input)
-  : buffer_(NULL),
-    buffer_end_(NULL),
-    input_(input),
-    total_bytes_read_(0),
-    overflow_bytes_(0),
-    last_tag_(0),
-    legitimate_message_end_(false),
-    aliasing_enabled_(false),
-    current_limit_(kint32max),
-    buffer_size_after_limit_(0),
-    total_bytes_limit_(kDefaultTotalBytesLimit),
-    recursion_budget_(default_recursion_limit_),
-    recursion_limit_(default_recursion_limit_),
-    extension_pool_(NULL),
-    extension_factory_(NULL) {
+    : buffer_(NULL),
+      buffer_end_(NULL),
+      input_(input),
+      total_bytes_read_(0),
+      overflow_bytes_(0),
+      last_tag_(0),
+      legitimate_message_end_(false),
+      aliasing_enabled_(false),
+      current_limit_(kint32max),
+      buffer_size_after_limit_(0),
+      total_bytes_limit_(kDefaultTotalBytesLimit),
+      recursion_budget_(default_recursion_limit_),
+      recursion_limit_(default_recursion_limit_),
+      extension_pool_(NULL),
+      extension_factory_(NULL) {
   // Eagerly Refresh() so buffer space is immediately available.
   Refresh();
 }
 
 inline CodedInputStream::CodedInputStream(const uint8* buffer, int size)
-  : buffer_(buffer),
-    buffer_end_(buffer + size),
-    input_(NULL),
-    total_bytes_read_(size),
-    overflow_bytes_(0),
-    last_tag_(0),
-    legitimate_message_end_(false),
-    aliasing_enabled_(false),
-    current_limit_(size),
-    buffer_size_after_limit_(0),
-    total_bytes_limit_(kDefaultTotalBytesLimit),
-    recursion_budget_(default_recursion_limit_),
-    recursion_limit_(default_recursion_limit_),
-    extension_pool_(NULL),
-    extension_factory_(NULL) {
+    : buffer_(buffer),
+      buffer_end_(buffer + size),
+      input_(NULL),
+      total_bytes_read_(size),
+      overflow_bytes_(0),
+      last_tag_(0),
+      legitimate_message_end_(false),
+      aliasing_enabled_(false),
+      current_limit_(size),
+      buffer_size_after_limit_(0),
+      total_bytes_limit_(kDefaultTotalBytesLimit),
+      recursion_budget_(default_recursion_limit_),
+      recursion_limit_(default_recursion_limit_),
+      extension_pool_(NULL),
+      extension_factory_(NULL) {
   // Note that setting current_limit_ == size is important to prevent some
   // code paths from trying to access input_ and segfaulting.
 }
 
-inline bool CodedInputStream::IsFlat() const {
-  return input_ == NULL;
-}
+inline bool CodedInputStream::IsFlat() const { return input_ == NULL; }
 
 inline bool CodedInputStream::Skip(int count) {
   if (count < 0) return false;  // security: count is often user-supplied
@@ -1410,9 +1396,8 @@
 }  // namespace protobuf
 }  // namespace google
 
-
 #if defined(_MSC_VER) && _MSC_VER >= 1300 && !defined(__INTEL_COMPILER)
-  #pragma runtime_checks("c", restore)
+#pragma runtime_checks("c", restore)
 #endif  // _MSC_VER && !defined(__INTEL_COMPILER)
 
 #include <google/protobuf/port_undef.inc>
diff --git a/src/google/protobuf/io/coded_stream_inl.h b/src/google/protobuf/io/coded_stream_inl.h
index df66282..0c10e65 100644
--- a/src/google/protobuf/io/coded_stream_inl.h
+++ b/src/google/protobuf/io/coded_stream_inl.h
@@ -36,11 +36,11 @@
 #ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__
 #define GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__
 
+#include <string>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <string>
 #include <google/protobuf/stubs/stl_util.h>
 
 namespace google {
diff --git a/src/google/protobuf/io/coded_stream_unittest.cc b/src/google/protobuf/io/coded_stream_unittest.cc
index 787b25c..6e3c4c4 100644
--- a/src/google/protobuf/io/coded_stream_unittest.cc
+++ b/src/google/protobuf/io/coded_stream_unittest.cc
@@ -86,45 +86,45 @@
 // TODO(kenton):  gTest now supports "parameterized tests" which would be
 //   a better way to accomplish this.  Rewrite when time permits.
 
-#define TEST_1D(FIXTURE, NAME, CASES)                                      \
-  class FIXTURE##_##NAME##_DD : public FIXTURE {                           \
-   protected:                                                              \
-    template <typename CaseType>                                           \
-    void DoSingleCase(const CaseType& CASES##_case);                       \
-  };                                                                       \
-                                                                           \
-  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                                    \
-    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) {                           \
-      SCOPED_TRACE(testing::Message()                                      \
-        << #CASES " case #" << i << ": " << CASES[i]);                     \
-      DoSingleCase(CASES[i]);                                              \
-    }                                                                      \
-  }                                                                        \
-                                                                           \
-  template <typename CaseType>                                             \
+#define TEST_1D(FIXTURE, NAME, CASES)                             \
+  class FIXTURE##_##NAME##_DD : public FIXTURE {                  \
+   protected:                                                     \
+    template <typename CaseType>                                  \
+    void DoSingleCase(const CaseType& CASES##_case);              \
+  };                                                              \
+                                                                  \
+  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                           \
+    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) {                  \
+      SCOPED_TRACE(testing::Message()                             \
+                   << #CASES " case #" << i << ": " << CASES[i]); \
+      DoSingleCase(CASES[i]);                                     \
+    }                                                             \
+  }                                                               \
+                                                                  \
+  template <typename CaseType>                                    \
   void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType& CASES##_case)
 
-#define TEST_2D(FIXTURE, NAME, CASES1, CASES2)                             \
-  class FIXTURE##_##NAME##_DD : public FIXTURE {                           \
-   protected:                                                              \
-    template <typename CaseType1, typename CaseType2>                      \
-    void DoSingleCase(const CaseType1& CASES1##_case,                      \
-                      const CaseType2& CASES2##_case);                     \
-  };                                                                       \
-                                                                           \
-  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                                    \
-    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) {                          \
-      for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) {                        \
-        SCOPED_TRACE(testing::Message()                                    \
-          << #CASES1 " case #" << i << ": " << CASES1[i] << ", "           \
-          << #CASES2 " case #" << j << ": " << CASES2[j]);                 \
-        DoSingleCase(CASES1[i], CASES2[j]);                                \
-      }                                                                    \
-    }                                                                      \
-  }                                                                        \
-                                                                           \
-  template <typename CaseType1, typename CaseType2>                        \
-  void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType1& CASES1##_case, \
+#define TEST_2D(FIXTURE, NAME, CASES1, CASES2)                              \
+  class FIXTURE##_##NAME##_DD : public FIXTURE {                            \
+   protected:                                                               \
+    template <typename CaseType1, typename CaseType2>                       \
+    void DoSingleCase(const CaseType1& CASES1##_case,                       \
+                      const CaseType2& CASES2##_case);                      \
+  };                                                                        \
+                                                                            \
+  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                                     \
+    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) {                           \
+      for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) {                         \
+        SCOPED_TRACE(testing::Message()                                     \
+                     << #CASES1 " case #" << i << ": " << CASES1[i] << ", " \
+                     << #CASES2 " case #" << j << ": " << CASES2[j]);       \
+        DoSingleCase(CASES1[i], CASES2[j]);                                 \
+      }                                                                     \
+    }                                                                       \
+  }                                                                         \
+                                                                            \
+  template <typename CaseType1, typename CaseType2>                         \
+  void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType1& CASES1##_case,  \
                                            const CaseType2& CASES2##_case)
 
 // ===================================================================
@@ -157,9 +157,9 @@
 // Varint tests.
 
 struct VarintCase {
-  uint8 bytes[10];          // Encoded bytes.
-  int size;                 // Encoded size, in bytes.
-  uint64 value;             // Parsed value.
+  uint8 bytes[10];  // Encoded bytes.
+  int size;         // Encoded size, in bytes.
+  uint64 value;     // Parsed value.
 };
 
 inline std::ostream& operator<<(std::ostream& os, const VarintCase& c) {
@@ -167,28 +167,32 @@
 }
 
 VarintCase kVarintCases[] = {
-  // 32-bit values
-  {{0x00}      , 1, 0},
-  {{0x01}      , 1, 1},
-  {{0x7f}      , 1, 127},
-  {{0xa2, 0x74}, 2, (0x22 << 0) | (0x74 << 7)},          // 14882
-  {{0xbe, 0xf7, 0x92, 0x84, 0x0b}, 5,                    // 2961488830
-    (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
-    (ULL(0x0b) << 28)},
+    // 32-bit values
+    {{0x00}, 1, 0},
+    {{0x01}, 1, 1},
+    {{0x7f}, 1, 127},
+    {{0xa2, 0x74}, 2, (0x22 << 0) | (0x74 << 7)},  // 14882
+    {{0xbe, 0xf7, 0x92, 0x84, 0x0b},
+     5,  // 2961488830
+     (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
+         (ULL(0x0b) << 28)},
 
-  // 64-bit
-  {{0xbe, 0xf7, 0x92, 0x84, 0x1b}, 5,                    // 7256456126
-    (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
-    (ULL(0x1b) << 28)},
-  {{0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49}, 8,  // 41256202580718336
-    (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |
-    (ULL(0x43) << 28) | (ULL(0x49) << 35) | (ULL(0x24) << 42) |
-    (ULL(0x49) << 49)},
-  // 11964378330978735131
-  {{0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01}, 10,
-    (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
-    (ULL(0x3b) << 28) | (ULL(0x56) << 35) | (ULL(0x00) << 42) |
-    (ULL(0x05) << 49) | (ULL(0x26) << 56) | (ULL(0x01) << 63)},
+    // 64-bit
+    {{0xbe, 0xf7, 0x92, 0x84, 0x1b},
+     5,  // 7256456126
+     (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) |
+         (ULL(0x1b) << 28)},
+    {{0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49},
+     8,  // 41256202580718336
+     (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) |
+         (ULL(0x43) << 28) | (ULL(0x49) << 35) | (ULL(0x24) << 42) |
+         (ULL(0x49) << 49)},
+    // 11964378330978735131
+    {{0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01},
+     10,
+     (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) |
+         (ULL(0x3b) << 28) | (ULL(0x56) << 35) | (ULL(0x00) << 42) |
+         (ULL(0x05) << 49) | (ULL(0x26) << 56) | (ULL(0x01) << 63)},
 };
 
 TEST_2D(CodedStreamTest, ReadVarint32, kVarintCases, kBlockSizes) {
@@ -229,15 +233,14 @@
   class In : public ZeroCopyInputStream {
    public:
     In() : count_(0) {}
+
    private:
     virtual bool Next(const void** data, int* size) {
       *data = NULL;
       *size = 0;
       return count_++ < 2;
     }
-    virtual void BackUp(int count)  {
-      GOOGLE_LOG(FATAL) << "Tests never call this.";
-    }
+    virtual void BackUp(int count) { GOOGLE_LOG(FATAL) << "Tests never call this."; }
     virtual bool Skip(int count) {
       GOOGLE_LOG(FATAL) << "Tests never call this.";
       return false;
@@ -291,9 +294,8 @@
 
   // If the expectation succeeds, it should return a pointer past the tag.
   if (kVarintCases_case.size <= 2) {
-    EXPECT_TRUE(NULL ==
-                CodedInputStream::ExpectTagFromArray(buffer_,
-                                                     expected_value + 1));
+    EXPECT_TRUE(NULL == CodedInputStream::ExpectTagFromArray(
+                            buffer_, expected_value + 1));
     EXPECT_TRUE(buffer_ + kVarintCases_case.size ==
                 CodedInputStream::ExpectTagFromArray(buffer_, expected_value));
   } else {
@@ -336,7 +338,7 @@
 
   EXPECT_EQ(kVarintCases_case.size, output.ByteCount());
   EXPECT_EQ(0,
-    memcmp(buffer_, kVarintCases_case.bytes, kVarintCases_case.size));
+            memcmp(buffer_, kVarintCases_case.bytes, kVarintCases_case.size));
 }
 
 TEST_2D(CodedStreamTest, WriteVarint64, kVarintCases, kBlockSizes) {
@@ -353,19 +355,17 @@
 
   EXPECT_EQ(kVarintCases_case.size, output.ByteCount());
   EXPECT_EQ(0,
-    memcmp(buffer_, kVarintCases_case.bytes, kVarintCases_case.size));
+            memcmp(buffer_, kVarintCases_case.bytes, kVarintCases_case.size));
 }
 
 // This test causes gcc 3.3.5 (and earlier?) to give the cryptic error:
 //   "sorry, unimplemented: `method_call_expr' not supported by dump_expr"
 #if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)
 
-int32 kSignExtendedVarintCases[] = {
-  0, 1, -1, 1237894, -37895138
-};
+int32 kSignExtendedVarintCases[] = {0, 1, -1, 1237894, -37895138};
 
-TEST_2D(CodedStreamTest, WriteVarint32SignExtended,
-        kSignExtendedVarintCases, kBlockSizes) {
+TEST_2D(CodedStreamTest, WriteVarint32SignExtended, kSignExtendedVarintCases,
+        kBlockSizes) {
   ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case);
 
   {
@@ -419,22 +419,23 @@
 }
 
 const VarintErrorCase kVarintErrorCases[] = {
-  // Control case.  (Insures that there isn't something else wrong that
-  // makes parsing always fail.)
-  {{0x00}, 1, true},
+    // Control case.  (Insures that there isn't something else wrong that
+    // makes parsing always fail.)
+    {{0x00}, 1, true},
 
-  // No input data.
-  {{}, 0, false},
+    // No input data.
+    {{}, 0, false},
 
-  // Input ends unexpectedly.
-  {{0xf0, 0xab}, 2, false},
+    // Input ends unexpectedly.
+    {{0xf0, 0xab}, 2, false},
 
-  // Input ends unexpectedly after 32 bits.
-  {{0xf0, 0xab, 0xc9, 0x9a, 0xf8, 0xb2}, 6, false},
+    // Input ends unexpectedly after 32 bits.
+    {{0xf0, 0xab, 0xc9, 0x9a, 0xf8, 0xb2}, 6, false},
 
-  // Longer than 10 bytes.
-  {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01},
-   11, false},
+    // Longer than 10 bytes.
+    {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01},
+     11,
+     false},
 };
 
 TEST_2D(CodedStreamTest, ReadVarint32Error, kVarintErrorCases, kBlockSizes) {
@@ -500,14 +501,14 @@
 }
 
 VarintSizeCase kVarintSizeCases[] = {
-  {0u, 1},
-  {1u, 1},
-  {127u, 1},
-  {128u, 2},
-  {758923u, 3},
-  {4000000000u, 5},
-  {ULL(41256202580718336), 8},
-  {ULL(11964378330978735131), 10},
+    {0u, 1},
+    {1u, 1},
+    {127u, 1},
+    {128u, 2},
+    {758923u, 3},
+    {4000000000u, 5},
+    {ULL(41256202580718336), 8},
+    {ULL(11964378330978735131), 10},
 };
 
 TEST_1D(CodedStreamTest, VarintSize32, kVarintSizeCases) {
@@ -517,13 +518,13 @@
   }
 
   EXPECT_EQ(kVarintSizeCases_case.size,
-    CodedOutputStream::VarintSize32(
-      static_cast<uint32>(kVarintSizeCases_case.value)));
+            CodedOutputStream::VarintSize32(
+                static_cast<uint32>(kVarintSizeCases_case.value)));
 }
 
 TEST_1D(CodedStreamTest, VarintSize64, kVarintSizeCases) {
   EXPECT_EQ(kVarintSizeCases_case.size,
-    CodedOutputStream::VarintSize64(kVarintSizeCases_case.value));
+            CodedOutputStream::VarintSize64(kVarintSizeCases_case.value));
 }
 
 TEST_F(CodedStreamTest, VarintSize32PowersOfTwo) {
@@ -552,13 +553,13 @@
 // Fixed-size int tests
 
 struct Fixed32Case {
-  uint8 bytes[sizeof(uint32)];          // Encoded bytes.
-  uint32 value;                         // Parsed value.
+  uint8 bytes[sizeof(uint32)];  // Encoded bytes.
+  uint32 value;                 // Parsed value.
 };
 
 struct Fixed64Case {
-  uint8 bytes[sizeof(uint64)];          // Encoded bytes.
-  uint64 value;                         // Parsed value.
+  uint8 bytes[sizeof(uint64)];  // Encoded bytes.
+  uint64 value;                 // Parsed value.
 };
 
 inline std::ostream& operator<<(std::ostream& os, const Fixed32Case& c) {
@@ -570,13 +571,13 @@
 }
 
 Fixed32Case kFixed32Cases[] = {
-  {{0xef, 0xcd, 0xab, 0x90}, 0x90abcdefu},
-  {{0x12, 0x34, 0x56, 0x78}, 0x78563412u},
+    {{0xef, 0xcd, 0xab, 0x90}, 0x90abcdefu},
+    {{0x12, 0x34, 0x56, 0x78}, 0x78563412u},
 };
 
 Fixed64Case kFixed64Cases[] = {
-  {{0xef, 0xcd, 0xab, 0x90, 0x12, 0x34, 0x56, 0x78}, ULL(0x7856341290abcdef)},
-  {{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}, ULL(0x8877665544332211)},
+    {{0xef, 0xcd, 0xab, 0x90, 0x12, 0x34, 0x56, 0x78}, ULL(0x7856341290abcdef)},
+    {{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}, ULL(0x8877665544332211)},
 };
 
 TEST_2D(CodedStreamTest, ReadLittleEndian32, kFixed32Cases, kBlockSizes) {
@@ -647,8 +648,8 @@
   memcpy(buffer_, kFixed32Cases_case.bytes, sizeof(kFixed32Cases_case.bytes));
 
   uint32 value;
-  const uint8* end = CodedInputStream::ReadLittleEndian32FromArray(
-      buffer_, &value);
+  const uint8* end =
+      CodedInputStream::ReadLittleEndian32FromArray(buffer_, &value);
   EXPECT_EQ(kFixed32Cases_case.value, value);
   EXPECT_TRUE(end == buffer_ + sizeof(value));
 }
@@ -657,8 +658,8 @@
   memcpy(buffer_, kFixed64Cases_case.bytes, sizeof(kFixed64Cases_case.bytes));
 
   uint64 value;
-  const uint8* end = CodedInputStream::ReadLittleEndian64FromArray(
-      buffer_, &value);
+  const uint8* end =
+      CodedInputStream::ReadLittleEndian64FromArray(buffer_, &value);
   EXPECT_EQ(kFixed64Cases_case.value, value);
   EXPECT_TRUE(end == buffer_ + sizeof(value));
 }
@@ -933,7 +934,7 @@
 // Skip
 
 const char kSkipTestBytes[] =
-  "<Before skipping><To be skipped><After skipping>";
+    "<Before skipping><To be skipped><After skipping>";
 
 TEST_1D(CodedStreamTest, SkipInput, kBlockSizes) {
   memcpy(buffer_, kSkipTestBytes, sizeof(kSkipTestBytes));
@@ -1240,7 +1241,8 @@
 
   ASSERT_EQ(1, errors.size());
   EXPECT_PRED_FORMAT2(testing::IsSubstring,
-    "A protocol message was rejected because it was too big", errors[0]);
+                      "A protocol message was rejected because it was too big",
+                      errors[0]);
 
   coded_input.SetTotalBytesLimit(32, -1);
   EXPECT_EQ(16, coded_input.BytesUntilTotalBytesLimit());
@@ -1304,35 +1306,35 @@
   coded_input.SetRecursionLimit(4);
 
   // This is way too much testing for a counter.
-  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 1
-  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 2
-  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 3
-  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 4
-  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 5
-  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 6
-  coded_input.DecrementRecursionDepth();                   // 5
-  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 6
-  coded_input.DecrementRecursionDepth();                   // 5
-  coded_input.DecrementRecursionDepth();                   // 4
-  coded_input.DecrementRecursionDepth();                   // 3
-  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 4
-  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 5
-  coded_input.DecrementRecursionDepth();                   // 4
-  coded_input.DecrementRecursionDepth();                   // 3
-  coded_input.DecrementRecursionDepth();                   // 2
-  coded_input.DecrementRecursionDepth();                   // 1
-  coded_input.DecrementRecursionDepth();                   // 0
-  coded_input.DecrementRecursionDepth();                   // 0
-  coded_input.DecrementRecursionDepth();                   // 0
-  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 1
-  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 2
-  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 3
-  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 4
-  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 5
+  EXPECT_TRUE(coded_input.IncrementRecursionDepth());   // 1
+  EXPECT_TRUE(coded_input.IncrementRecursionDepth());   // 2
+  EXPECT_TRUE(coded_input.IncrementRecursionDepth());   // 3
+  EXPECT_TRUE(coded_input.IncrementRecursionDepth());   // 4
+  EXPECT_FALSE(coded_input.IncrementRecursionDepth());  // 5
+  EXPECT_FALSE(coded_input.IncrementRecursionDepth());  // 6
+  coded_input.DecrementRecursionDepth();                // 5
+  EXPECT_FALSE(coded_input.IncrementRecursionDepth());  // 6
+  coded_input.DecrementRecursionDepth();                // 5
+  coded_input.DecrementRecursionDepth();                // 4
+  coded_input.DecrementRecursionDepth();                // 3
+  EXPECT_TRUE(coded_input.IncrementRecursionDepth());   // 4
+  EXPECT_FALSE(coded_input.IncrementRecursionDepth());  // 5
+  coded_input.DecrementRecursionDepth();                // 4
+  coded_input.DecrementRecursionDepth();                // 3
+  coded_input.DecrementRecursionDepth();                // 2
+  coded_input.DecrementRecursionDepth();                // 1
+  coded_input.DecrementRecursionDepth();                // 0
+  coded_input.DecrementRecursionDepth();                // 0
+  coded_input.DecrementRecursionDepth();                // 0
+  EXPECT_TRUE(coded_input.IncrementRecursionDepth());   // 1
+  EXPECT_TRUE(coded_input.IncrementRecursionDepth());   // 2
+  EXPECT_TRUE(coded_input.IncrementRecursionDepth());   // 3
+  EXPECT_TRUE(coded_input.IncrementRecursionDepth());   // 4
+  EXPECT_FALSE(coded_input.IncrementRecursionDepth());  // 5
 
   coded_input.SetRecursionLimit(6);
-  EXPECT_TRUE(coded_input.IncrementRecursionDepth());      // 6
-  EXPECT_FALSE(coded_input.IncrementRecursionDepth());     // 7
+  EXPECT_TRUE(coded_input.IncrementRecursionDepth());   // 6
+  EXPECT_FALSE(coded_input.IncrementRecursionDepth());  // 7
 }
 
 
@@ -1364,12 +1366,16 @@
     }
   }
 
-  void BackUp(int count) {
-    backup_amount_ = count;
-  }
+  void BackUp(int count) { backup_amount_ = count; }
 
-  bool Skip(int count)    { GOOGLE_LOG(FATAL) << "Not implemented."; return false; }
-  int64 ByteCount() const { GOOGLE_LOG(FATAL) << "Not implemented."; return 0; }
+  bool Skip(int count) {
+    GOOGLE_LOG(FATAL) << "Not implemented.";
+    return false;
+  }
+  int64 ByteCount() const {
+    GOOGLE_LOG(FATAL) << "Not implemented.";
+    return 0;
+  }
 
   int backup_amount_;
 
diff --git a/src/google/protobuf/io/gzip_stream.cc b/src/google/protobuf/io/gzip_stream.cc
index a569eff..a3e0438 100644
--- a/src/google/protobuf/io/gzip_stream.cc
+++ b/src/google/protobuf/io/gzip_stream.cc
@@ -46,8 +46,8 @@
 
 static const int kDefaultBufferSize = 65536;
 
-GzipInputStream::GzipInputStream(
-    ZeroCopyInputStream* sub_stream, Format format, int buffer_size)
+GzipInputStream::GzipInputStream(ZeroCopyInputStream* sub_stream, Format format,
+                                 int buffer_size)
     : format_(format), sub_stream_(sub_stream), zerror_(Z_OK), byte_count_(0) {
   zcontext_.state = Z_NULL;
   zcontext_.zalloc = Z_NULL;
@@ -74,15 +74,21 @@
   zerror_ = inflateEnd(&zcontext_);
 }
 
-static inline int internalInflateInit2(
-    z_stream* zcontext, GzipInputStream::Format format) {
+static inline int internalInflateInit2(z_stream* zcontext,
+                                       GzipInputStream::Format format) {
   int windowBitsFormat = 0;
   switch (format) {
-    case GzipInputStream::GZIP: windowBitsFormat = 16; break;
-    case GzipInputStream::AUTO: windowBitsFormat = 32; break;
-    case GzipInputStream::ZLIB: windowBitsFormat = 0; break;
+    case GzipInputStream::GZIP:
+      windowBitsFormat = 16;
+      break;
+    case GzipInputStream::AUTO:
+      windowBitsFormat = 32;
+      break;
+    case GzipInputStream::ZLIB:
+      windowBitsFormat = 0;
+      break;
   }
-  return inflateInit2(zcontext, /* windowBits */15 | windowBitsFormat);
+  return inflateInit2(zcontext, /* windowBits */ 15 | windowBitsFormat);
 }
 
 int GzipInputStream::Inflate(int flush) {
@@ -122,8 +128,8 @@
 
 // implements ZeroCopyInputStream ----------------------------------
 bool GzipInputStream::Next(const void** data, int* size) {
-  bool ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END)
-      || (zerror_ == Z_BUF_ERROR);
+  bool ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END) ||
+            (zerror_ == Z_BUF_ERROR);
   if ((!ok) || (zcontext_.next_out == NULL)) {
     return false;
   }
@@ -154,8 +160,8 @@
     // The underlying stream's Next returned false inside Inflate.
     return false;
   }
-  ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END)
-      || (zerror_ == Z_BUF_ERROR);
+  ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END) ||
+       (zerror_ == Z_BUF_ERROR);
   if (!ok) {
     return false;
   }
@@ -230,13 +236,10 @@
   if (options.format == ZLIB) {
     windowBitsFormat = 0;
   }
-  zerror_ = deflateInit2(
-      &zcontext_,
-      options.compression_level,
-      Z_DEFLATED,
-      /* windowBits */15 | windowBitsFormat,
-      /* memLevel (default) */8,
-      options.compression_strategy);
+  zerror_ =
+      deflateInit2(&zcontext_, options.compression_level, Z_DEFLATED,
+                   /* windowBits */ 15 | windowBitsFormat,
+                   /* memLevel (default) */ 8, options.compression_strategy);
 }
 
 GzipOutputStream::~GzipOutputStream() {
@@ -305,9 +308,9 @@
 bool GzipOutputStream::Flush() {
   zerror_ = Deflate(Z_FULL_FLUSH);
   // Return true if the flush succeeded or if it was a no-op.
-  return  (zerror_ == Z_OK) ||
-      (zerror_ == Z_BUF_ERROR && zcontext_.avail_in == 0 &&
-       zcontext_.avail_out != 0);
+  return (zerror_ == Z_OK) ||
+         (zerror_ == Z_BUF_ERROR && zcontext_.avail_in == 0 &&
+          zcontext_.avail_out != 0);
 }
 
 bool GzipOutputStream::Close() {
diff --git a/src/google/protobuf/io/gzip_stream.h b/src/google/protobuf/io/gzip_stream.h
index b8eadfa..9980e5b 100644
--- a/src/google/protobuf/io/gzip_stream.h
+++ b/src/google/protobuf/io/gzip_stream.h
@@ -70,19 +70,13 @@
   };
 
   // buffer_size and format may be -1 for default of 64kB and GZIP format
-  explicit GzipInputStream(
-      ZeroCopyInputStream* sub_stream,
-      Format format = AUTO,
-      int buffer_size = -1);
+  explicit GzipInputStream(ZeroCopyInputStream* sub_stream,
+                           Format format = AUTO, int buffer_size = -1);
   virtual ~GzipInputStream();
 
   // Return last error message or NULL if no error.
-  inline const char* ZlibErrorMessage() const {
-    return zcontext_.msg;
-  }
-  inline int ZlibErrorCode() const {
-    return zerror_;
-  }
+  inline const char* ZlibErrorMessage() const { return zcontext_.msg; }
+  inline int ZlibErrorCode() const { return zerror_; }
 
   // implements ZeroCopyInputStream ----------------------------------
   bool Next(const void** data, int* size);
@@ -143,19 +137,13 @@
   explicit GzipOutputStream(ZeroCopyOutputStream* sub_stream);
 
   // Create a GzipOutputStream with the given options.
-  GzipOutputStream(
-      ZeroCopyOutputStream* sub_stream,
-      const Options& options);
+  GzipOutputStream(ZeroCopyOutputStream* sub_stream, const Options& options);
 
   virtual ~GzipOutputStream();
 
   // Return last error message or NULL if no error.
-  inline const char* ZlibErrorMessage() const {
-    return zcontext_.msg;
-  }
-  inline int ZlibErrorCode() const {
-    return zerror_;
-  }
+  inline const char* ZlibErrorMessage() const { return zcontext_.msg; }
+  inline int ZlibErrorCode() const { return zerror_; }
 
   // Flushes data written so far to zipped data in the underlying stream.
   // It is the caller's responsibility to flush the underlying stream if
diff --git a/src/google/protobuf/stubs/io_win32.cc b/src/google/protobuf/io/io_win32.cc
old mode 100644
new mode 100755
similarity index 98%
rename from src/google/protobuf/stubs/io_win32.cc
rename to src/google/protobuf/io/io_win32.cc
index d0f57df..b8f9bf8
--- a/src/google/protobuf/stubs/io_win32.cc
+++ b/src/google/protobuf/io/io_win32.cc
@@ -29,7 +29,9 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 // Author: laszlocsomor@google.com (Laszlo Csomor)
-//
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+
 // Implementation for long-path-aware open/mkdir/access/etc. on Windows, as well
 // as for the supporting utility functions.
 //
@@ -58,7 +60,7 @@
 #include <wctype.h>
 #include <windows.h>
 
-#include <google/protobuf/stubs/io_win32.h>
+#include <google/protobuf/io/io_win32.h>
 
 #include <memory>
 #include <sstream>
@@ -67,7 +69,7 @@
 
 namespace google {
 namespace protobuf {
-namespace internal {
+namespace io {
 namespace win32 {
 namespace {
 
@@ -407,7 +409,7 @@
 
 }  // namespace strings
 }  // namespace win32
-}  // namespace internal
+}  // namespace io
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/stubs/io_win32.h b/src/google/protobuf/io/io_win32.h
old mode 100644
new mode 100755
similarity index 92%
rename from src/google/protobuf/stubs/io_win32.h
rename to src/google/protobuf/io/io_win32.h
index 69924dc..cf5cb32
--- a/src/google/protobuf/stubs/io_win32.h
+++ b/src/google/protobuf/io/io_win32.h
@@ -29,26 +29,28 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 // Author: laszlocsomor@google.com (Laszlo Csomor)
-//
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+
 // This file contains the declarations for Windows implementations of
 // commonly used POSIX functions such as open(2) and access(2), as well
 // as macro definitions for flags of these functions.
 //
 // By including this file you'll redefine open/access/etc. to
-// ::google::protobuf::internal::win32::{open/access/etc.}.
+// ::google::protobuf::io::win32::{open/access/etc.}.
 // Make sure you don't include a header that attempts to redeclare or
 // redefine these functions, that'll lead to confusing compilation
 // errors. It's best to #include this file as the last one to ensure that.
 //
 // This file is only used on Windows, it's empty on other platforms.
 
-#ifndef GOOGLE_PROTOBUF_STUBS_IO_WIN32_H__
-#define GOOGLE_PROTOBUF_STUBS_IO_WIN32_H__
+#ifndef GOOGLE_PROTOBUF_IO_IO_WIN32_H__
+#define GOOGLE_PROTOBUF_IO_IO_WIN32_H__
 
 #if defined(_WIN32)
 
 #include <string>
-#include <google/protobuf/stubs/port.h>
+#include <google/protobuf/port.h>
 
 #include <google/protobuf/port_def.inc>
 
@@ -56,7 +58,7 @@
 // following functions already, except for mkdir.
 namespace google {
 namespace protobuf {
-namespace internal {
+namespace io {
 namespace win32 {
 
 PROTOBUF_EXPORT FILE* fopen(const char* path, const char* mode);
@@ -91,7 +93,7 @@
 }  // namespace strings
 
 }  // namespace win32
-}  // namespace internal
+}  // namespace io
 }  // namespace protobuf
 }  // namespace google
 
@@ -115,4 +117,4 @@
 
 #endif  // defined(_WIN32)
 
-#endif  // GOOGLE_PROTOBUF_STUBS_IO_WIN32_H__
+#endif  // GOOGLE_PROTOBUF_IO_IO_WIN32_H__
diff --git a/src/google/protobuf/stubs/io_win32_unittest.cc b/src/google/protobuf/io/io_win32_unittest.cc
old mode 100644
new mode 100755
similarity index 98%
rename from src/google/protobuf/stubs/io_win32_unittest.cc
rename to src/google/protobuf/io/io_win32_unittest.cc
index 6c70d46..53aa333
--- a/src/google/protobuf/stubs/io_win32_unittest.cc
+++ b/src/google/protobuf/io/io_win32_unittest.cc
@@ -29,7 +29,9 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 // Author: laszlocsomor@google.com (Laszlo Csomor)
-//
+//  Based on original Protocol Buffers design by
+//  Sanjay Ghemawat, Jeff Dean, and others.
+
 // Unit tests for long-path-aware open/mkdir/access/etc. on Windows, as well as
 // for the supporting utility functions.
 //
@@ -47,7 +49,7 @@
 #include <wchar.h>
 #include <windows.h>
 
-#include <google/protobuf/stubs/io_win32.h>
+#include <google/protobuf/io/io_win32.h>
 #include <gtest/gtest.h>
 
 #include <memory>
@@ -56,7 +58,7 @@
 
 namespace google {
 namespace protobuf {
-namespace internal {
+namespace io {
 namespace win32 {
 namespace {
 
@@ -444,7 +446,7 @@
 
 }  // namespace
 }  // namespace win32
-}  // namespace internal
+}  // namespace io
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/src/google/protobuf/io/printer.cc b/src/google/protobuf/io/printer.cc
index 736f063..6a86c58 100644
--- a/src/google/protobuf/io/printer.cc
+++ b/src/google/protobuf/io/printer.cc
@@ -34,10 +34,10 @@
 
 #include <cctype>
 
-#include <google/protobuf/io/printer.h>
-#include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/io/printer.h>
+#include <google/protobuf/io/zero_copy_stream.h>
 
 namespace google {
 namespace protobuf {
@@ -182,9 +182,7 @@
   WriteRaw(text + pos, size - pos);
 }
 
-void Printer::Indent() {
-  indent_ += "  ";
-}
+void Printer::Indent() { indent_ += "  "; }
 
 void Printer::Outdent() {
   if (indent_.empty()) {
diff --git a/src/google/protobuf/io/printer.h b/src/google/protobuf/io/printer.h
index a08ca65..a55946e 100644
--- a/src/google/protobuf/io/printer.h
+++ b/src/google/protobuf/io/printer.h
@@ -37,8 +37,8 @@
 #ifndef GOOGLE_PROTOBUF_IO_PRINTER_H__
 #define GOOGLE_PROTOBUF_IO_PRINTER_H__
 
-#include <string>
 #include <map>
+#include <string>
 #include <vector>
 #include <google/protobuf/stubs/common.h>
 
@@ -48,7 +48,7 @@
 namespace protobuf {
 namespace io {
 
-class ZeroCopyOutputStream;     // zero_copy_stream.h
+class ZeroCopyOutputStream;  // zero_copy_stream.h
 
 // Records annotations about a Printer's output.
 class PROTOBUF_EXPORT AnnotationCollector {
diff --git a/src/google/protobuf/io/printer_unittest.cc b/src/google/protobuf/io/printer_unittest.cc
index 50a683e..b847fa7 100644
--- a/src/google/protobuf/io/printer_unittest.cc
+++ b/src/google/protobuf/io/printer_unittest.cc
@@ -77,10 +77,11 @@
 
     buffer[output.ByteCount()] = '\0';
 
-    EXPECT_STREQ("Hello World!  This is the same line.\n"
-                 "But this is a new one.\n"
-                 "And this is another one.",
-                 buffer);
+    EXPECT_STREQ(
+        "Hello World!  This is the same line.\n"
+        "But this is a new one.\n"
+        "And this is another one.",
+        buffer);
   }
 }
 
@@ -103,12 +104,13 @@
 
     buffer[output.ByteCount()] = '\0';
 
-    EXPECT_STREQ("Hello World!  This is the same line.\n"
-                 "But this is a new one.\n"
-                 "And this is another one."
-                 "\n"
-                 "From an object\n",
-                 buffer);
+    EXPECT_STREQ(
+        "Hello World!  This is the same line.\n"
+        "But this is a new one.\n"
+        "And this is another one."
+        "\n"
+        "From an object\n",
+        buffer);
   }
 }
 
@@ -138,13 +140,14 @@
 
     buffer[output.ByteCount()] = '\0';
 
-    EXPECT_STREQ("Hello World!\n"
-                 "bar = $foo$\n"
-                 "RawBit\n"
-                 "1234\n"
-                 "A literal dollar sign:  $\n"
-                 "Now foo = blah.",
-                 buffer);
+    EXPECT_STREQ(
+        "Hello World!\n"
+        "bar = $foo$\n"
+        "RawBit\n"
+        "1234\n"
+        "A literal dollar sign:  $\n"
+        "Now foo = blah.",
+        buffer);
   }
 }
 
@@ -163,10 +166,11 @@
 
   buffer[output.ByteCount()] = '\0';
 
-  EXPECT_STREQ("Hello World!\n"
-               "RawBit\n"
-               "one two\n",
-               buffer);
+  EXPECT_STREQ(
+      "Hello World!\n"
+      "RawBit\n"
+      "one two\n",
+      buffer);
 }
 
 // MockDescriptorFile defines only those members that Printer uses to write out
@@ -435,7 +439,6 @@
   EXPECT_EQ(4, ab->end());
 }
 
-
 TEST(Printer, Indenting) {
   char buffer[8192];
 
@@ -454,11 +457,13 @@
       printer.Outdent();
       printer.Print("But this is not.");
       printer.Indent();
-      printer.Print("  And this is still the same line.\n"
-                    "But this is indented.\n");
+      printer.Print(
+          "  And this is still the same line.\n"
+          "But this is indented.\n");
       printer.PrintRaw("RawBit has indent at start\n");
       printer.PrintRaw("but not after a raw newline\n");
-      printer.Print(vars, "Note that a newline in a variable will break "
+      printer.Print(vars,
+                    "Note that a newline in a variable will break "
                     "indenting, as we see$newline$here.\n");
       printer.Indent();
       printer.Print("And this");
@@ -472,18 +477,18 @@
     buffer[output.ByteCount()] = '\0';
 
     EXPECT_STREQ(
-      "This is not indented.\n"
-      "  This is indented\n"
-      "  And so is this\n"
-      "But this is not.  And this is still the same line.\n"
-      "  But this is indented.\n"
-      "  RawBit has indent at start\n"
-      "but not after a raw newline\n"
-      "Note that a newline in a variable will break indenting, as we see\n"
-      "here.\n"
-      "    And this is double-indented\n"
-      "Back to normal.",
-      buffer);
+        "This is not indented.\n"
+        "  This is indented\n"
+        "  And so is this\n"
+        "But this is not.  And this is still the same line.\n"
+        "  But this is indented.\n"
+        "  RawBit has indent at start\n"
+        "but not after a raw newline\n"
+        "Note that a newline in a variable will break indenting, as we see\n"
+        "here.\n"
+        "    And this is double-indented\n"
+        "Back to normal.",
+        buffer);
   }
 }
 
diff --git a/src/google/protobuf/io/strtod.cc b/src/google/protobuf/io/strtod.cc
index 7b17b57..42de296 100644
--- a/src/google/protobuf/io/strtod.cc
+++ b/src/google/protobuf/io/strtod.cc
@@ -49,6 +49,8 @@
 
 namespace {
 
+const double MAX_FLOAT_AS_DOUBLE_ROUNDED = 3.4028235e+38;
+
 // Returns a string identical to *input except that the character pointed to
 // by radix_pos (which should be '.') is replaced with the locale-specific
 // radix character.
@@ -61,7 +63,7 @@
   char temp[16];
   int size = sprintf(temp, "%.1f", 1.5);
   GOOGLE_CHECK_EQ(temp[0], '1');
-  GOOGLE_CHECK_EQ(temp[size-1], '5');
+  GOOGLE_CHECK_EQ(temp[size - 1], '5');
   GOOGLE_CHECK_LE(size, 6);
 
   // Now replace the '.' in the input with it.
@@ -94,8 +96,7 @@
   const char* localized_cstr = localized.c_str();
   char* localized_endptr;
   result = strtod(localized_cstr, &localized_endptr);
-  if ((localized_endptr - localized_cstr) >
-      (temp_endptr - text)) {
+  if ((localized_endptr - localized_cstr) > (temp_endptr - text)) {
     // This attempt got further, so replacing the decimal must have helped.
     // Update original_endptr to point at the right location.
     if (original_endptr != NULL) {
@@ -103,7 +104,7 @@
       int size_diff = localized.size() - strlen(text);
       // const_cast is necessary to match the strtod() interface.
       *original_endptr = const_cast<char*>(
-        text + (localized_endptr - localized_cstr - size_diff));
+          text + (localized_endptr - localized_cstr - size_diff));
     }
   }
 
@@ -111,9 +112,24 @@
 }
 
 float SafeDoubleToFloat(double value) {
+  // static_cast<float> on a number larger than float can result in illegal
+  // instruction error, so we need to manually convert it to infinity or max.
   if (value > std::numeric_limits<float>::max()) {
+    // Max float value is about 3.4028234664E38 when represented as a double.
+    // However, when printing float as text, it will be rounded as
+    // 3.4028235e+38. If we parse the value of 3.4028235e+38 from text and
+    // compare it to 3.4028234664E38, we may think that it is larger, but
+    // actually, any number between these two numbers could only be represented
+    // as the same max float number in float, so we should treat them the same
+    // as max float.
+    if (value <= MAX_FLOAT_AS_DOUBLE_ROUNDED) {
+      return std::numeric_limits<float>::max();
+    }
     return std::numeric_limits<float>::infinity();
   } else if (value < -std::numeric_limits<float>::max()) {
+    if (value >= -MAX_FLOAT_AS_DOUBLE_ROUNDED) {
+      return -std::numeric_limits<float>::max();
+    }
     return -std::numeric_limits<float>::infinity();
   } else {
     return static_cast<float>(value);
diff --git a/src/google/protobuf/io/tokenizer.cc b/src/google/protobuf/io/tokenizer.cc
index 8abcbd0..f8cf2eb 100644
--- a/src/google/protobuf/io/tokenizer.cc
+++ b/src/google/protobuf/io/tokenizer.cc
@@ -113,39 +113,34 @@
 // Note:  No class is allowed to contain '\0', since this is used to mark end-
 //   of-input and is handled specially.
 
-#define CHARACTER_CLASS(NAME, EXPRESSION)      \
-  class NAME {                                 \
-   public:                                     \
-    static inline bool InClass(char c) {       \
-      return EXPRESSION;                       \
-    }                                          \
+#define CHARACTER_CLASS(NAME, EXPRESSION)                     \
+  class NAME {                                                \
+   public:                                                    \
+    static inline bool InClass(char c) { return EXPRESSION; } \
   }
 
-CHARACTER_CLASS(Whitespace, c == ' ' || c == '\n' || c == '\t' ||
-                            c == '\r' || c == '\v' || c == '\f');
-CHARACTER_CLASS(WhitespaceNoNewline, c == ' ' || c == '\t' ||
-                                     c == '\r' || c == '\v' || c == '\f');
+CHARACTER_CLASS(Whitespace, c == ' ' || c == '\n' || c == '\t' || c == '\r' ||
+                                c == '\v' || c == '\f');
+CHARACTER_CLASS(WhitespaceNoNewline,
+                c == ' ' || c == '\t' || c == '\r' || c == '\v' || c == '\f');
 
-CHARACTER_CLASS(Unprintable, c < ' ' && c > '\0');
+CHARACTER_CLASS(Unprintable, c<' ' && c> '\0');
 
 CHARACTER_CLASS(Digit, '0' <= c && c <= '9');
 CHARACTER_CLASS(OctalDigit, '0' <= c && c <= '7');
-CHARACTER_CLASS(HexDigit, ('0' <= c && c <= '9') ||
-                          ('a' <= c && c <= 'f') ||
-                          ('A' <= c && c <= 'F'));
+CHARACTER_CLASS(HexDigit, ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') ||
+                              ('A' <= c && c <= 'F'));
 
-CHARACTER_CLASS(Letter, ('a' <= c && c <= 'z') ||
-                        ('A' <= c && c <= 'Z') ||
-                        (c == '_'));
+CHARACTER_CLASS(Letter,
+                ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || (c == '_'));
 
 CHARACTER_CLASS(Alphanumeric, ('a' <= c && c <= 'z') ||
-                              ('A' <= c && c <= 'Z') ||
-                              ('0' <= c && c <= '9') ||
-                              (c == '_'));
+                                  ('A' <= c && c <= 'Z') ||
+                                  ('0' <= c && c <= '9') || (c == '_'));
 
 CHARACTER_CLASS(Escape, c == 'a' || c == 'b' || c == 'f' || c == 'n' ||
-                        c == 'r' || c == 't' || c == 'v' || c == '\\' ||
-                        c == '?' || c == '\'' || c == '\"');
+                            c == 'r' || c == 't' || c == 'v' || c == '\\' ||
+                            c == '?' || c == '\'' || c == '\"');
 
 #undef CHARACTER_CLASS
 
@@ -161,20 +156,32 @@
 // Inline because it's only used in one place.
 inline char TranslateEscape(char c) {
   switch (c) {
-    case 'a':  return '\a';
-    case 'b':  return '\b';
-    case 'f':  return '\f';
-    case 'n':  return '\n';
-    case 'r':  return '\r';
-    case 't':  return '\t';
-    case 'v':  return '\v';
-    case '\\': return '\\';
-    case '?':  return '\?';    // Trigraphs = :(
-    case '\'': return '\'';
-    case '"':  return '\"';
+    case 'a':
+      return '\a';
+    case 'b':
+      return '\b';
+    case 'f':
+      return '\f';
+    case 'n':
+      return '\n';
+    case 'r':
+      return '\r';
+    case 't':
+      return '\t';
+    case 'v':
+      return '\v';
+    case '\\':
+      return '\\';
+    case '?':
+      return '\?';  // Trigraphs = :(
+    case '\'':
+      return '\'';
+    case '"':
+      return '\"';
 
     // We expect escape sequences to have been validated separately.
-    default:   return '?';
+    default:
+      return '?';
   }
 }
 
@@ -186,21 +193,20 @@
 
 Tokenizer::Tokenizer(ZeroCopyInputStream* input,
                      ErrorCollector* error_collector)
-  : input_(input),
-    error_collector_(error_collector),
-    buffer_(NULL),
-    buffer_size_(0),
-    buffer_pos_(0),
-    read_error_(false),
-    line_(0),
-    column_(0),
-    record_target_(NULL),
-    record_start_(-1),
-    allow_f_after_float_(false),
-    comment_style_(CPP_COMMENT_STYLE),
-    require_space_after_number_(true),
-    allow_multiline_strings_(false) {
-
+    : input_(input),
+      error_collector_(error_collector),
+      buffer_(NULL),
+      buffer_size_(0),
+      buffer_pos_(0),
+      read_error_(false),
+      line_(0),
+      column_(0),
+      record_target_(NULL),
+      record_start_(-1),
+      allow_f_after_float_(false),
+      comment_style_(CPP_COMMENT_STYLE),
+      require_space_after_number_(true),
+      allow_multiline_strings_(false) {
   current_.line = 0;
   current_.column = 0;
   current_.end_column = 0;
@@ -249,7 +255,8 @@
 
   // If we're in a token, append the rest of the buffer to it.
   if (record_target_ != NULL && record_start_ < buffer_size_) {
-    record_target_->append(buffer_ + record_start_, buffer_size_ - record_start_);
+    record_target_->append(buffer_ + record_start_,
+                           buffer_size_ - record_start_);
     record_start_ = 0;
   }
 
@@ -282,14 +289,15 @@
   //   be helpful by detecting the NULL pointer, even though there's nothing
   //   wrong with reading zero bytes from NULL.
   if (buffer_pos_ != record_start_) {
-    record_target_->append(buffer_ + record_start_, buffer_pos_ - record_start_);
+    record_target_->append(buffer_ + record_start_,
+                           buffer_pos_ - record_start_);
   }
   record_target_ = NULL;
   record_start_ = -1;
 }
 
 inline void Tokenizer::StartToken() {
-  current_.type = TYPE_START;    // Just for the sake of initializing it.
+  current_.type = TYPE_START;  // Just for the sake of initializing it.
   current_.text.clear();
   current_.line = line_;
   current_.column = column_;
@@ -304,12 +312,12 @@
 // -------------------------------------------------------------------
 // Helper methods that consume characters.
 
-template<typename CharacterClass>
+template <typename CharacterClass>
 inline bool Tokenizer::LookingAt() {
   return CharacterClass::InClass(current_char_);
 }
 
-template<typename CharacterClass>
+template <typename CharacterClass>
 inline bool Tokenizer::TryConsumeOne() {
   if (CharacterClass::InClass(current_char_)) {
     NextChar();
@@ -328,14 +336,14 @@
   }
 }
 
-template<typename CharacterClass>
+template <typename CharacterClass>
 inline void Tokenizer::ConsumeZeroOrMore() {
   while (CharacterClass::InClass(current_char_)) {
     NextChar();
   }
 }
 
-template<typename CharacterClass>
+template <typename CharacterClass>
 inline void Tokenizer::ConsumeOneOrMore(const char* error) {
   if (!CharacterClass::InClass(current_char_)) {
     AddError(error);
@@ -381,25 +389,21 @@
           }
           // Possibly followed by another hex digit, but again we don't care.
         } else if (TryConsume('u')) {
-          if (!TryConsumeOne<HexDigit>() ||
-              !TryConsumeOne<HexDigit>() ||
-              !TryConsumeOne<HexDigit>() ||
-              !TryConsumeOne<HexDigit>()) {
+          if (!TryConsumeOne<HexDigit>() || !TryConsumeOne<HexDigit>() ||
+              !TryConsumeOne<HexDigit>() || !TryConsumeOne<HexDigit>()) {
             AddError("Expected four hex digits for \\u escape sequence.");
           }
         } else if (TryConsume('U')) {
           // We expect 8 hex digits; but only the range up to 0x10ffff is
           // legal.
-          if (!TryConsume('0') ||
-              !TryConsume('0') ||
+          if (!TryConsume('0') || !TryConsume('0') ||
               !(TryConsume('0') || TryConsume('1')) ||
-              !TryConsumeOne<HexDigit>() ||
-              !TryConsumeOne<HexDigit>() ||
-              !TryConsumeOne<HexDigit>() ||
-              !TryConsumeOne<HexDigit>() ||
+              !TryConsumeOne<HexDigit>() || !TryConsumeOne<HexDigit>() ||
+              !TryConsumeOne<HexDigit>() || !TryConsumeOne<HexDigit>() ||
               !TryConsumeOne<HexDigit>()) {
-            AddError("Expected eight hex digits up to 10ffff for \\U escape "
-                     "sequence");
+            AddError(
+                "Expected eight hex digits up to 10ffff for \\U escape "
+                "sequence");
           }
         } else {
           AddError("Invalid escape sequence in string literal.");
@@ -465,7 +469,7 @@
   } else if (current_char_ == '.') {
     if (is_float) {
       AddError(
-        "Already saw decimal point or exponent; can't have another one.");
+          "Already saw decimal point or exponent; can't have another one.");
     } else {
       AddError("Hex and octal numbers must be integers.");
     }
@@ -492,10 +496,8 @@
   if (content != NULL) RecordTo(content);
 
   while (true) {
-    while (current_char_ != '\0' &&
-           current_char_ != '*' &&
-           current_char_ != '/' &&
-           current_char_ != '\n') {
+    while (current_char_ != '\0' && current_char_ != '*' &&
+           current_char_ != '/' && current_char_ != '\n') {
       NextChar();
     }
 
@@ -524,11 +526,11 @@
       // Note:  We didn't consume the '*' because if there is a '/' after it
       //   we want to interpret that as the end of the comment.
       AddError(
-        "\"/*\" inside block comment.  Block comments cannot be nested.");
+          "\"/*\" inside block comment.  Block comments cannot be nested.");
     } else if (current_char_ == '\0') {
       AddError("End-of-file inside block comment.");
-      error_collector_->AddError(
-        start_line, start_column, "  Comment started here.");
+      error_collector_->AddError(start_line, start_column,
+                                 "  Comment started here.");
       if (content != NULL) StopRecording();
       break;
     }
@@ -613,8 +615,9 @@
               current_.line == previous_.line &&
               current_.column == previous_.end_column) {
             // We don't accept syntax like "blah.123".
-            error_collector_->AddError(line_, column_ - 2,
-              "Need space between identifier and decimal point.");
+            error_collector_->AddError(
+                line_, column_ - 2,
+                "Need space between identifier and decimal point.");
           }
           current_.type = ConsumeNumber(false, true);
         } else {
@@ -631,7 +634,8 @@
       } else {
         // Check if the high order bit is set.
         if (current_char_ & 0x80) {
-          error_collector_->AddError(line_, column_,
+          error_collector_->AddError(
+              line_, column_,
               StringPrintf("Interpreting non ascii codepoint %d.",
                            static_cast<unsigned char>(current_char_)));
         }
@@ -731,9 +735,7 @@
     }
   }
 
-  void DetachFromPrev() {
-    can_attach_to_prev_ = false;
-  }
+  void DetachFromPrev() { can_attach_to_prev_ = false; }
 
  private:
   std::string* prev_trailing_comments_;
@@ -754,7 +756,7 @@
   bool can_attach_to_prev_;
 };
 
-} // namespace
+}  // namespace
 
 bool Tokenizer::NextWithComments(std::string* prev_trailing_comments,
                                  std::vector<std::string>* detached_comments,
@@ -767,8 +769,9 @@
     // beginning. Only UTF-8 BOM (0xEF 0xBB 0xBF) is accepted.
     if (TryConsume((char)0xEF)) {
       if (!TryConsume((char)0xBB) || !TryConsume((char)0xBF)) {
-        AddError("Proto file starts with 0xEF but not UTF-8 BOM. "
-                 "Only UTF-8 is accepted for proto file.");
+        AddError(
+            "Proto file starts with 0xEF but not UTF-8 BOM. "
+            "Only UTF-8 is accepted for proto file.");
         return false;
       }
     }
@@ -836,9 +839,7 @@
           collector.DetachFromPrev();
         } else {
           bool result = Next();
-          if (!result ||
-              current_.text == "}" ||
-              current_.text == "]" ||
+          if (!result || current_.text == "}" || current_.text == "]" ||
               current_.text == ")") {
             // It looks like we're at the end of a scope.  In this case it
             // makes no sense to attach a comment to the following token.
@@ -863,7 +864,7 @@
   // Sadly, we can't just use strtoul() since it is only 32-bit and strtoull()
   // is non-standard.  I hate the C standard library.  :(
 
-//  return strtoull(text.c_str(), NULL, 0);
+  //  return strtoull(text.c_str(), NULL, 0);
 
   const char* ptr = text.c_str();
   int base = 10;
@@ -917,8 +918,9 @@
   }
 
   GOOGLE_LOG_IF(DFATAL, end - start != text.size() || *start == '-')
-    << " Tokenizer::ParseFloat() passed text that could not have been"
-       " tokenized as a float: " << CEscape(text);
+      << " Tokenizer::ParseFloat() passed text that could not have been"
+         " tokenized as a float: "
+      << CEscape(text);
   return result;
 }
 
@@ -931,22 +933,16 @@
     tmp = code_point;
     len = 1;
   } else if (code_point <= 0x07ff) {
-    tmp = 0x0000c080 |
-        ((code_point & 0x07c0) << 2) |
-        (code_point & 0x003f);
+    tmp = 0x0000c080 | ((code_point & 0x07c0) << 2) | (code_point & 0x003f);
     len = 2;
   } else if (code_point <= 0xffff) {
-    tmp = 0x00e08080 |
-        ((code_point & 0xf000) << 4) |
-        ((code_point & 0x0fc0) << 2) |
-        (code_point & 0x003f);
+    tmp = 0x00e08080 | ((code_point & 0xf000) << 4) |
+          ((code_point & 0x0fc0) << 2) | (code_point & 0x003f);
     len = 3;
   } else if (code_point <= 0x1fffff) {
-    tmp = 0xf0808080 |
-        ((code_point & 0x1c0000) << 6) |
-        ((code_point & 0x03f000) << 4) |
-        ((code_point & 0x000fc0) << 2) |
-        (code_point & 0x003f);
+    tmp = 0xf0808080 | ((code_point & 0x1c0000) << 6) |
+          ((code_point & 0x03f000) << 4) | ((code_point & 0x000fc0) << 2) |
+          (code_point & 0x003f);
     len = 4;
   } else {
     // UTF-16 is only defined for code points up to 0x10FFFF, and UTF-8 is
@@ -986,7 +982,7 @@
 
 static inline bool IsTrailSurrogate(uint32 code_point) {
   return (code_point >= kMinTrailSurrogate) &&
-      (code_point < kMaxTrailSurrogate);
+         (code_point < kMaxTrailSurrogate);
 }
 
 // Combine a head and trail surrogate into a single Unicode code point.
@@ -994,7 +990,7 @@
   GOOGLE_DCHECK(IsHeadSurrogate(head_surrogate));
   GOOGLE_DCHECK(IsTrailSurrogate(trail_surrogate));
   return 0x10000 + (((head_surrogate - kMinHeadSurrogate) << 10) |
-      (trail_surrogate - kMinTrailSurrogate));
+                    (trail_surrogate - kMinTrailSurrogate));
 }
 
 // Convert the escape sequence parameter to a number of expected hex digits.
@@ -1012,8 +1008,7 @@
   const char* p = ptr;
   // Fetch the code point.
   const int len = UnicodeLength(*p++);
-  if (!ReadHexDigits(p, len, code_point))
-    return ptr;
+  if (!ReadHexDigits(p, len, code_point)) return ptr;
   p += len;
 
   // Check if the code point we read is a "head surrogate." If so, then we
@@ -1042,9 +1037,9 @@
   // empty, it's invalid, so we'll just return).
   const size_t text_size = text.size();
   if (text_size == 0) {
-    GOOGLE_LOG(DFATAL)
-      << " Tokenizer::ParseStringAppend() passed text that could not"
-         " have been tokenized as a string: " << CEscape(text);
+    GOOGLE_LOG(DFATAL) << " Tokenizer::ParseStringAppend() passed text that could not"
+                   " have been tokenized as a string: "
+                << CEscape(text);
     return;
   }
 
@@ -1118,20 +1113,16 @@
 template <typename CharacterClass>
 static bool AllInClass(const std::string& s) {
   for (int i = 0; i < s.size(); ++i) {
-    if (!CharacterClass::InClass(s[i]))
-      return false;
+    if (!CharacterClass::InClass(s[i])) return false;
   }
   return true;
 }
 
 bool Tokenizer::IsIdentifier(const std::string& text) {
   // Mirrors IDENTIFIER definition in Tokenizer::Next() above.
-  if (text.size() == 0)
-    return false;
-  if (!Letter::InClass(text.at(0)))
-    return false;
-  if (!AllInClass<Alphanumeric>(text.substr(1)))
-    return false;
+  if (text.size() == 0) return false;
+  if (!Letter::InClass(text.at(0))) return false;
+  if (!AllInClass<Alphanumeric>(text.substr(1))) return false;
   return true;
 }
 
diff --git a/src/google/protobuf/io/tokenizer.h b/src/google/protobuf/io/tokenizer.h
index 4816814..cb33b93 100644
--- a/src/google/protobuf/io/tokenizer.h
+++ b/src/google/protobuf/io/tokenizer.h
@@ -48,7 +48,7 @@
 namespace protobuf {
 namespace io {
 
-class ZeroCopyInputStream;     // zero_copy_stream.h
+class ZeroCopyInputStream;  // zero_copy_stream.h
 
 // Defined in this file.
 class ErrorCollector;
@@ -99,8 +99,8 @@
   ~Tokenizer();
 
   enum TokenType {
-    TYPE_START,       // Next() has not yet been called.
-    TYPE_END,         // End of input reached.  "text" is empty.
+    TYPE_START,  // Next() has not yet been called.
+    TYPE_END,    // End of input reached.  "text" is empty.
 
     TYPE_IDENTIFIER,  // A sequence of letters, digits, and underscores, not
                       // starting with a digit.  It is an error for a number
@@ -258,17 +258,17 @@
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Tokenizer);
 
-  Token current_;           // Returned by current().
-  Token previous_;          // Returned by previous().
+  Token current_;   // Returned by current().
+  Token previous_;  // Returned by previous().
 
   ZeroCopyInputStream* input_;
   ErrorCollector* error_collector_;
 
-  char current_char_;       // == buffer_[buffer_pos_], updated by NextChar().
-  const char* buffer_;      // Current buffer returned from input_.
-  int buffer_size_;         // Size of buffer_.
-  int buffer_pos_;          // Current position within the buffer.
-  bool read_error_;         // Did we previously encounter a read error?
+  char current_char_;   // == buffer_[buffer_pos_], updated by NextChar().
+  const char* buffer_;  // Current buffer returned from input_.
+  int buffer_size_;     // Size of buffer_.
+  int buffer_pos_;      // Current position within the buffer.
+  bool read_error_;     // Did we previously encounter a read error?
 
   // Line and column number of current_char_ within the whole input stream.
   int line_;
@@ -369,37 +369,33 @@
 
   // Returns true if the current character is of the given character
   // class, but does not consume anything.
-  template<typename CharacterClass>
+  template <typename CharacterClass>
   inline bool LookingAt();
 
   // If the current character is in the given class, consume it and return
   // true.  Otherwise return false.
   // e.g. TryConsumeOne<Letter>()
-  template<typename CharacterClass>
+  template <typename CharacterClass>
   inline bool TryConsumeOne();
 
   // Like above, but try to consume the specific character indicated.
   inline bool TryConsume(char c);
 
   // Consume zero or more of the given character class.
-  template<typename CharacterClass>
+  template <typename CharacterClass>
   inline void ConsumeZeroOrMore();
 
   // Consume one or more of the given character class or log the given
   // error message.
   // e.g. ConsumeOneOrMore<Digit>("Expected digits.");
-  template<typename CharacterClass>
+  template <typename CharacterClass>
   inline void ConsumeOneOrMore(const char* error);
 };
 
 // inline methods ====================================================
-inline const Tokenizer::Token& Tokenizer::current() {
-  return current_;
-}
+inline const Tokenizer::Token& Tokenizer::current() { return current_; }
 
-inline const Tokenizer::Token& Tokenizer::previous() {
-  return previous_;
-}
+inline const Tokenizer::Token& Tokenizer::previous() { return previous_; }
 
 inline void Tokenizer::ParseString(const std::string& text,
                                    std::string* output) {
diff --git a/src/google/protobuf/io/tokenizer_unittest.cc b/src/google/protobuf/io/tokenizer_unittest.cc
index 3dbee86..37628ab 100644
--- a/src/google/protobuf/io/tokenizer_unittest.cc
+++ b/src/google/protobuf/io/tokenizer_unittest.cc
@@ -75,45 +75,45 @@
 // which failed will be printed.  The case type must be printable using
 // ostream::operator<<.
 
-#define TEST_1D(FIXTURE, NAME, CASES)                                      \
-  class FIXTURE##_##NAME##_DD : public FIXTURE {                           \
-   protected:                                                              \
-    template <typename CaseType>                                           \
-    void DoSingleCase(const CaseType& CASES##_case);                       \
-  };                                                                       \
-                                                                           \
-  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                                    \
-    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) {                           \
-      SCOPED_TRACE(testing::Message()                                      \
-        << #CASES " case #" << i << ": " << CASES[i]);                     \
-      DoSingleCase(CASES[i]);                                              \
-    }                                                                      \
-  }                                                                        \
-                                                                           \
-  template <typename CaseType>                                             \
+#define TEST_1D(FIXTURE, NAME, CASES)                             \
+  class FIXTURE##_##NAME##_DD : public FIXTURE {                  \
+   protected:                                                     \
+    template <typename CaseType>                                  \
+    void DoSingleCase(const CaseType& CASES##_case);              \
+  };                                                              \
+                                                                  \
+  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                           \
+    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) {                  \
+      SCOPED_TRACE(testing::Message()                             \
+                   << #CASES " case #" << i << ": " << CASES[i]); \
+      DoSingleCase(CASES[i]);                                     \
+    }                                                             \
+  }                                                               \
+                                                                  \
+  template <typename CaseType>                                    \
   void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType& CASES##_case)
 
-#define TEST_2D(FIXTURE, NAME, CASES1, CASES2)                             \
-  class FIXTURE##_##NAME##_DD : public FIXTURE {                           \
-   protected:                                                              \
-    template <typename CaseType1, typename CaseType2>                      \
-    void DoSingleCase(const CaseType1& CASES1##_case,                      \
-                      const CaseType2& CASES2##_case);                     \
-  };                                                                       \
-                                                                           \
-  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                                    \
-    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) {                          \
-      for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) {                        \
-        SCOPED_TRACE(testing::Message()                                    \
-          << #CASES1 " case #" << i << ": " << CASES1[i] << ", "           \
-          << #CASES2 " case #" << j << ": " << CASES2[j]);                 \
-        DoSingleCase(CASES1[i], CASES2[j]);                                \
-      }                                                                    \
-    }                                                                      \
-  }                                                                        \
-                                                                           \
-  template <typename CaseType1, typename CaseType2>                        \
-  void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType1& CASES1##_case, \
+#define TEST_2D(FIXTURE, NAME, CASES1, CASES2)                              \
+  class FIXTURE##_##NAME##_DD : public FIXTURE {                            \
+   protected:                                                               \
+    template <typename CaseType1, typename CaseType2>                       \
+    void DoSingleCase(const CaseType1& CASES1##_case,                       \
+                      const CaseType2& CASES2##_case);                      \
+  };                                                                        \
+                                                                            \
+  TEST_F(FIXTURE##_##NAME##_DD, NAME) {                                     \
+    for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) {                           \
+      for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) {                         \
+        SCOPED_TRACE(testing::Message()                                     \
+                     << #CASES1 " case #" << i << ": " << CASES1[i] << ", " \
+                     << #CASES2 " case #" << j << ": " << CASES2[j]);       \
+        DoSingleCase(CASES1[i], CASES2[j]);                                 \
+      }                                                                     \
+    }                                                                       \
+  }                                                                         \
+                                                                            \
+  template <typename CaseType1, typename CaseType2>                         \
+  void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType1& CASES1##_case,  \
                                            const CaseType2& CASES2##_case)
 
 // -------------------------------------------------------------------
@@ -123,7 +123,7 @@
 class TestInputStream : public ZeroCopyInputStream {
  public:
   TestInputStream(const void* data, int size, int block_size)
-    : array_stream_(data, size, block_size), counter_(0) {}
+      : array_stream_(data, size, block_size), counter_(0) {}
   ~TestInputStream() {}
 
   // implements ZeroCopyInputStream ----------------------------------
@@ -141,9 +141,9 @@
     }
   }
 
-  void BackUp(int count)  { return array_stream_.BackUp(count); }
-  bool Skip(int count)    { return array_stream_.Skip(count);   }
-  int64 ByteCount() const { return array_stream_.ByteCount();   }
+  void BackUp(int count) { return array_stream_.BackUp(count); }
+  bool Skip(int count) { return array_stream_.Skip(count); }
+  int64 ByteCount() const { return array_stream_.ByteCount(); }
 
  private:
   ArrayInputStream array_stream_;
@@ -163,8 +163,7 @@
 
   // implements ErrorCollector ---------------------------------------
   void AddError(int line, int column, const std::string& message) {
-    strings::SubstituteAndAppend(&text_, "$0:$1: $2\n",
-                                 line, column, message);
+    strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", line, column, message);
   }
 };
 
@@ -205,52 +204,51 @@
 }
 
 SimpleTokenCase kSimpleTokenCases[] = {
-  // Test identifiers.
-  { "hello",       Tokenizer::TYPE_IDENTIFIER },
+    // Test identifiers.
+    {"hello", Tokenizer::TYPE_IDENTIFIER},
 
-  // Test integers.
-  { "123",         Tokenizer::TYPE_INTEGER },
-  { "0xab6",       Tokenizer::TYPE_INTEGER },
-  { "0XAB6",       Tokenizer::TYPE_INTEGER },
-  { "0X1234567",   Tokenizer::TYPE_INTEGER },
-  { "0x89abcdef",  Tokenizer::TYPE_INTEGER },
-  { "0x89ABCDEF",  Tokenizer::TYPE_INTEGER },
-  { "01234567",    Tokenizer::TYPE_INTEGER },
+    // Test integers.
+    {"123", Tokenizer::TYPE_INTEGER},
+    {"0xab6", Tokenizer::TYPE_INTEGER},
+    {"0XAB6", Tokenizer::TYPE_INTEGER},
+    {"0X1234567", Tokenizer::TYPE_INTEGER},
+    {"0x89abcdef", Tokenizer::TYPE_INTEGER},
+    {"0x89ABCDEF", Tokenizer::TYPE_INTEGER},
+    {"01234567", Tokenizer::TYPE_INTEGER},
 
-  // Test floats.
-  { "123.45",      Tokenizer::TYPE_FLOAT },
-  { "1.",          Tokenizer::TYPE_FLOAT },
-  { "1e3",         Tokenizer::TYPE_FLOAT },
-  { "1E3",         Tokenizer::TYPE_FLOAT },
-  { "1e-3",        Tokenizer::TYPE_FLOAT },
-  { "1e+3",        Tokenizer::TYPE_FLOAT },
-  { "1.e3",        Tokenizer::TYPE_FLOAT },
-  { "1.2e3",       Tokenizer::TYPE_FLOAT },
-  { ".1",          Tokenizer::TYPE_FLOAT },
-  { ".1e3",        Tokenizer::TYPE_FLOAT },
-  { ".1e-3",       Tokenizer::TYPE_FLOAT },
-  { ".1e+3",       Tokenizer::TYPE_FLOAT },
+    // Test floats.
+    {"123.45", Tokenizer::TYPE_FLOAT},
+    {"1.", Tokenizer::TYPE_FLOAT},
+    {"1e3", Tokenizer::TYPE_FLOAT},
+    {"1E3", Tokenizer::TYPE_FLOAT},
+    {"1e-3", Tokenizer::TYPE_FLOAT},
+    {"1e+3", Tokenizer::TYPE_FLOAT},
+    {"1.e3", Tokenizer::TYPE_FLOAT},
+    {"1.2e3", Tokenizer::TYPE_FLOAT},
+    {".1", Tokenizer::TYPE_FLOAT},
+    {".1e3", Tokenizer::TYPE_FLOAT},
+    {".1e-3", Tokenizer::TYPE_FLOAT},
+    {".1e+3", Tokenizer::TYPE_FLOAT},
 
-  // Test strings.
-  { "'hello'",     Tokenizer::TYPE_STRING },
-  { "\"foo\"",     Tokenizer::TYPE_STRING },
-  { "'a\"b'",      Tokenizer::TYPE_STRING },
-  { "\"a'b\"",     Tokenizer::TYPE_STRING },
-  { "'a\\'b'",     Tokenizer::TYPE_STRING },
-  { "\"a\\\"b\"",  Tokenizer::TYPE_STRING },
-  { "'\\xf'",      Tokenizer::TYPE_STRING },
-  { "'\\0'",       Tokenizer::TYPE_STRING },
+    // Test strings.
+    {"'hello'", Tokenizer::TYPE_STRING},
+    {"\"foo\"", Tokenizer::TYPE_STRING},
+    {"'a\"b'", Tokenizer::TYPE_STRING},
+    {"\"a'b\"", Tokenizer::TYPE_STRING},
+    {"'a\\'b'", Tokenizer::TYPE_STRING},
+    {"\"a\\\"b\"", Tokenizer::TYPE_STRING},
+    {"'\\xf'", Tokenizer::TYPE_STRING},
+    {"'\\0'", Tokenizer::TYPE_STRING},
 
-  // Test symbols.
-  { "+",           Tokenizer::TYPE_SYMBOL },
-  { ".",           Tokenizer::TYPE_SYMBOL },
+    // Test symbols.
+    {"+", Tokenizer::TYPE_SYMBOL},
+    {".", Tokenizer::TYPE_SYMBOL},
 };
 
 TEST_2D(TokenizerTest, SimpleTokens, kSimpleTokenCases, kBlockSizes) {
   // Set up the tokenizer.
   TestInputStream input(kSimpleTokenCases_case.input.data(),
-                        kSimpleTokenCases_case.input.size(),
-                        kBlockSizes_case);
+                        kSimpleTokenCases_case.input.size(), kBlockSizes_case);
   TestErrorCollector error_collector;
   Tokenizer tokenizer(&input, &error_collector);
 
@@ -339,92 +337,101 @@
 }
 
 MultiTokenCase kMultiTokenCases[] = {
-  // Test empty input.
-  { "", {
-    { Tokenizer::TYPE_END       , ""     , 0,  0,  0 },
-  }},
+    // Test empty input.
+    {"",
+     {
+         {Tokenizer::TYPE_END, "", 0, 0, 0},
+     }},
 
-  // Test all token types at the same time.
-  { "foo 1 1.2 + 'bar'", {
-    { Tokenizer::TYPE_IDENTIFIER, "foo"  , 0,  0,  3 },
-    { Tokenizer::TYPE_INTEGER   , "1"    , 0,  4,  5 },
-    { Tokenizer::TYPE_FLOAT     , "1.2"  , 0,  6,  9 },
-    { Tokenizer::TYPE_SYMBOL    , "+"    , 0, 10, 11 },
-    { Tokenizer::TYPE_STRING    , "'bar'", 0, 12, 17 },
-    { Tokenizer::TYPE_END       , ""     , 0, 17, 17 },
-  }},
+    // Test all token types at the same time.
+    {"foo 1 1.2 + 'bar'",
+     {
+         {Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3},
+         {Tokenizer::TYPE_INTEGER, "1", 0, 4, 5},
+         {Tokenizer::TYPE_FLOAT, "1.2", 0, 6, 9},
+         {Tokenizer::TYPE_SYMBOL, "+", 0, 10, 11},
+         {Tokenizer::TYPE_STRING, "'bar'", 0, 12, 17},
+         {Tokenizer::TYPE_END, "", 0, 17, 17},
+     }},
 
-  // Test that consecutive symbols are parsed as separate tokens.
-  { "!@+%", {
-    { Tokenizer::TYPE_SYMBOL    , "!"    , 0, 0, 1 },
-    { Tokenizer::TYPE_SYMBOL    , "@"    , 0, 1, 2 },
-    { Tokenizer::TYPE_SYMBOL    , "+"    , 0, 2, 3 },
-    { Tokenizer::TYPE_SYMBOL    , "%"    , 0, 3, 4 },
-    { Tokenizer::TYPE_END       , ""     , 0, 4, 4 },
-  }},
+    // Test that consecutive symbols are parsed as separate tokens.
+    {"!@+%",
+     {
+         {Tokenizer::TYPE_SYMBOL, "!", 0, 0, 1},
+         {Tokenizer::TYPE_SYMBOL, "@", 0, 1, 2},
+         {Tokenizer::TYPE_SYMBOL, "+", 0, 2, 3},
+         {Tokenizer::TYPE_SYMBOL, "%", 0, 3, 4},
+         {Tokenizer::TYPE_END, "", 0, 4, 4},
+     }},
 
-  // Test that newlines affect line numbers correctly.
-  { "foo bar\nrab oof", {
-    { Tokenizer::TYPE_IDENTIFIER, "foo", 0,  0, 3 },
-    { Tokenizer::TYPE_IDENTIFIER, "bar", 0,  4, 7 },
-    { Tokenizer::TYPE_IDENTIFIER, "rab", 1,  0, 3 },
-    { Tokenizer::TYPE_IDENTIFIER, "oof", 1,  4, 7 },
-    { Tokenizer::TYPE_END       , ""   , 1,  7, 7 },
-  }},
+    // Test that newlines affect line numbers correctly.
+    {"foo bar\nrab oof",
+     {
+         {Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3},
+         {Tokenizer::TYPE_IDENTIFIER, "bar", 0, 4, 7},
+         {Tokenizer::TYPE_IDENTIFIER, "rab", 1, 0, 3},
+         {Tokenizer::TYPE_IDENTIFIER, "oof", 1, 4, 7},
+         {Tokenizer::TYPE_END, "", 1, 7, 7},
+     }},
 
-  // Test that tabs affect column numbers correctly.
-  { "foo\tbar  \tbaz", {
-    { Tokenizer::TYPE_IDENTIFIER, "foo", 0,  0,  3 },
-    { Tokenizer::TYPE_IDENTIFIER, "bar", 0,  8, 11 },
-    { Tokenizer::TYPE_IDENTIFIER, "baz", 0, 16, 19 },
-    { Tokenizer::TYPE_END       , ""   , 0, 19, 19 },
-  }},
+    // Test that tabs affect column numbers correctly.
+    {"foo\tbar  \tbaz",
+     {
+         {Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3},
+         {Tokenizer::TYPE_IDENTIFIER, "bar", 0, 8, 11},
+         {Tokenizer::TYPE_IDENTIFIER, "baz", 0, 16, 19},
+         {Tokenizer::TYPE_END, "", 0, 19, 19},
+     }},
 
-  // Test that tabs in string literals affect column numbers correctly.
-  { "\"foo\tbar\" baz", {
-    { Tokenizer::TYPE_STRING    , "\"foo\tbar\"", 0,  0, 12 },
-    { Tokenizer::TYPE_IDENTIFIER, "baz"         , 0, 13, 16 },
-    { Tokenizer::TYPE_END       , ""            , 0, 16, 16 },
-  }},
+    // Test that tabs in string literals affect column numbers correctly.
+    {"\"foo\tbar\" baz",
+     {
+         {Tokenizer::TYPE_STRING, "\"foo\tbar\"", 0, 0, 12},
+         {Tokenizer::TYPE_IDENTIFIER, "baz", 0, 13, 16},
+         {Tokenizer::TYPE_END, "", 0, 16, 16},
+     }},
 
-  // Test that line comments are ignored.
-  { "foo // This is a comment\n"
-    "bar // This is another comment", {
-    { Tokenizer::TYPE_IDENTIFIER, "foo", 0,  0,  3 },
-    { Tokenizer::TYPE_IDENTIFIER, "bar", 1,  0,  3 },
-    { Tokenizer::TYPE_END       , ""   , 1, 30, 30 },
-  }},
+    // Test that line comments are ignored.
+    {"foo // This is a comment\n"
+     "bar // This is another comment",
+     {
+         {Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3},
+         {Tokenizer::TYPE_IDENTIFIER, "bar", 1, 0, 3},
+         {Tokenizer::TYPE_END, "", 1, 30, 30},
+     }},
 
-  // Test that block comments are ignored.
-  { "foo /* This is a block comment */ bar", {
-    { Tokenizer::TYPE_IDENTIFIER, "foo", 0,  0,  3 },
-    { Tokenizer::TYPE_IDENTIFIER, "bar", 0, 34, 37 },
-    { Tokenizer::TYPE_END       , ""   , 0, 37, 37 },
-  }},
+    // Test that block comments are ignored.
+    {"foo /* This is a block comment */ bar",
+     {
+         {Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3},
+         {Tokenizer::TYPE_IDENTIFIER, "bar", 0, 34, 37},
+         {Tokenizer::TYPE_END, "", 0, 37, 37},
+     }},
 
-  // Test that sh-style comments are not ignored by default.
-  { "foo # bar\n"
-    "baz", {
-    { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 },
-    { Tokenizer::TYPE_SYMBOL    , "#"  , 0, 4, 5 },
-    { Tokenizer::TYPE_IDENTIFIER, "bar", 0, 6, 9 },
-    { Tokenizer::TYPE_IDENTIFIER, "baz", 1, 0, 3 },
-    { Tokenizer::TYPE_END       , ""   , 1, 3, 3 },
-  }},
+    // Test that sh-style comments are not ignored by default.
+    {"foo # bar\n"
+     "baz",
+     {
+         {Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3},
+         {Tokenizer::TYPE_SYMBOL, "#", 0, 4, 5},
+         {Tokenizer::TYPE_IDENTIFIER, "bar", 0, 6, 9},
+         {Tokenizer::TYPE_IDENTIFIER, "baz", 1, 0, 3},
+         {Tokenizer::TYPE_END, "", 1, 3, 3},
+     }},
 
-  // Test all whitespace chars
-  { "foo\n\t\r\v\fbar", {
-    { Tokenizer::TYPE_IDENTIFIER, "foo", 0,  0,  3 },
-    { Tokenizer::TYPE_IDENTIFIER, "bar", 1, 11, 14 },
-    { Tokenizer::TYPE_END       , ""   , 1, 14, 14 },
-  }},
+    // Test all whitespace chars
+    {"foo\n\t\r\v\fbar",
+     {
+         {Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3},
+         {Tokenizer::TYPE_IDENTIFIER, "bar", 1, 11, 14},
+         {Tokenizer::TYPE_END, "", 1, 14, 14},
+     }},
 };
 
 TEST_2D(TokenizerTest, MultipleTokens, kMultiTokenCases, kBlockSizes) {
   // Set up the tokenizer.
   TestInputStream input(kMultiTokenCases_case.input.data(),
-                        kMultiTokenCases_case.input.size(),
-                        kBlockSizes_case);
+                        kMultiTokenCases_case.input.size(), kBlockSizes_case);
   TestErrorCollector error_collector;
   Tokenizer tokenizer(&input, &error_collector);
 
@@ -479,14 +486,14 @@
 TEST_1D(TokenizerTest, ShCommentStyle, kBlockSizes) {
   // Test the "comment_style" option.
 
-  const char* text = "foo # bar\n"
-                     "baz // qux\n"
-                     "corge /* grault */\n"
-                     "garply";
+  const char* text =
+      "foo # bar\n"
+      "baz // qux\n"
+      "corge /* grault */\n"
+      "garply";
   const char* const kTokens[] = {"foo",  // "# bar" is ignored
-                                 "baz", "/", "/", "qux",
-                                 "corge", "/", "*", "grault", "*", "/",
-                                 "garply"};
+                                 "baz", "/",      "/", "qux", "corge", "/",
+                                 "*",   "grault", "*", "/",   "garply"};
 
   // Set up the tokenizer.
   TestInputStream input(text, strlen(text), kBlockSizes_case);
@@ -526,164 +533,136 @@
 }
 
 DocCommentCase kDocCommentCases[] = {
-  {
-    "prev next",
+    {"prev next",
 
-    "",
-    {},
-    ""
-      },
+     "",
+     {},
+     ""},
 
-        {
-      "prev /* ignored */ next",
+    {"prev /* ignored */ next",
 
-      "",
-      {},
-      ""
-        },
+     "",
+     {},
+     ""},
 
-          {
-        "prev // trailing comment\n"
-            "next",
+    {"prev // trailing comment\n"
+     "next",
 
-            " trailing comment\n",
-            {},
-            ""
-          },
+     " trailing comment\n",
+     {},
+     ""},
 
-            {
-          "prev\n"
-              "// leading comment\n"
-              "// line 2\n"
-              "next",
+    {"prev\n"
+     "// leading comment\n"
+     "// line 2\n"
+     "next",
 
-              "",
-              {},
-              " leading comment\n"
-              " line 2\n"
-            },
+     "",
+     {},
+     " leading comment\n"
+     " line 2\n"},
 
-              {
-            "prev\n"
-                "// trailing comment\n"
-                "// line 2\n"
-                "\n"
-                "next",
+    {"prev\n"
+     "// trailing comment\n"
+     "// line 2\n"
+     "\n"
+     "next",
 
-                " trailing comment\n"
-                " line 2\n",
-                {},
-                ""
-              },
+     " trailing comment\n"
+     " line 2\n",
+     {},
+     ""},
 
-                {
-              "prev // trailing comment\n"
-                  "// leading comment\n"
-                  "// line 2\n"
-                  "next",
+    {"prev // trailing comment\n"
+     "// leading comment\n"
+     "// line 2\n"
+     "next",
 
-                  " trailing comment\n",
-                  {},
-                  " leading comment\n"
-                  " line 2\n"
-                },
+     " trailing comment\n",
+     {},
+     " leading comment\n"
+     " line 2\n"},
 
-                  {
-                "prev /* trailing block comment */\n"
-                    "/* leading block comment\n"
-                    " * line 2\n"
-                    " * line 3 */"
-                    "next",
+    {"prev /* trailing block comment */\n"
+     "/* leading block comment\n"
+     " * line 2\n"
+     " * line 3 */"
+     "next",
 
-                    " trailing block comment ",
-                    {},
-                    " leading block comment\n"
-                    " line 2\n"
-                    " line 3 "
-                  },
+     " trailing block comment ",
+     {},
+     " leading block comment\n"
+     " line 2\n"
+     " line 3 "},
 
-                    {
-                  "prev\n"
-                      "/* trailing block comment\n"
-                      " * line 2\n"
-                      " * line 3\n"
-                      " */\n"
-                      "/* leading block comment\n"
-                      " * line 2\n"
-                      " * line 3 */"
-                      "next",
+    {"prev\n"
+     "/* trailing block comment\n"
+     " * line 2\n"
+     " * line 3\n"
+     " */\n"
+     "/* leading block comment\n"
+     " * line 2\n"
+     " * line 3 */"
+     "next",
 
-                      " trailing block comment\n"
-                      " line 2\n"
-                      " line 3\n",
-                      {},
-                      " leading block comment\n"
-                      " line 2\n"
-                      " line 3 "
-                    },
+     " trailing block comment\n"
+     " line 2\n"
+     " line 3\n",
+     {},
+     " leading block comment\n"
+     " line 2\n"
+     " line 3 "},
 
-                      {
-                    "prev\n"
-                        "// trailing comment\n"
-                        "\n"
-                        "// detached comment\n"
-                        "// line 2\n"
-                        "\n"
-                        "// second detached comment\n"
-                        "/* third detached comment\n"
-                        " * line 2 */\n"
-                        "// leading comment\n"
-                        "next",
+    {"prev\n"
+     "// trailing comment\n"
+     "\n"
+     "// detached comment\n"
+     "// line 2\n"
+     "\n"
+     "// second detached comment\n"
+     "/* third detached comment\n"
+     " * line 2 */\n"
+     "// leading comment\n"
+     "next",
 
-                        " trailing comment\n",
-                        {
-                      " detached comment\n"
-                          " line 2\n",
-                          " second detached comment\n",
-                          " third detached comment\n"
-                          " line 2 "
-                        },
-                          " leading comment\n"
-                        },
+     " trailing comment\n",
+     {" detached comment\n"
+      " line 2\n",
+      " second detached comment\n",
+      " third detached comment\n"
+      " line 2 "},
+     " leading comment\n"},
 
-                          {
-                        "prev /**/\n"
-                            "\n"
-                            "// detached comment\n"
-                            "\n"
-                            "// leading comment\n"
-                            "next",
+    {"prev /**/\n"
+     "\n"
+     "// detached comment\n"
+     "\n"
+     "// leading comment\n"
+     "next",
 
-                            "",
-                            {
-                          " detached comment\n"
-                            },
-                              " leading comment\n"
-                            },
+     "",
+     {" detached comment\n"},
+     " leading comment\n"},
 
-                              {
-                            "prev /**/\n"
-                                "// leading comment\n"
-                                "next",
+    {"prev /**/\n"
+     "// leading comment\n"
+     "next",
 
-                                "",
-                                {},
-                                " leading comment\n"
-                              },
-                              };
+     "",
+     {},
+     " leading comment\n"},
+};
 
 TEST_2D(TokenizerTest, DocComments, kDocCommentCases, kBlockSizes) {
   // Set up the tokenizer.
   TestInputStream input(kDocCommentCases_case.input.data(),
-                        kDocCommentCases_case.input.size(),
-                        kBlockSizes_case);
+                        kDocCommentCases_case.input.size(), kBlockSizes_case);
   TestErrorCollector error_collector;
   Tokenizer tokenizer(&input, &error_collector);
 
   // Set up a second tokenizer where we'll pass all NULLs to NextWithComments().
   TestInputStream input2(kDocCommentCases_case.input.data(),
-                        kDocCommentCases_case.input.size(),
-                        kBlockSizes_case);
+                         kDocCommentCases_case.input.size(), kBlockSizes_case);
   Tokenizer tokenizer2(&input2, &error_collector);
 
   tokenizer.Next();
@@ -707,16 +686,14 @@
   for (int i = 0; i < detached_comments.size(); i++) {
     ASSERT_LT(i, GOOGLE_ARRAYSIZE(kDocCommentCases));
     ASSERT_TRUE(kDocCommentCases_case.detached_comments[i] != NULL);
-    EXPECT_EQ(kDocCommentCases_case.detached_comments[i],
-              detached_comments[i]);
+    EXPECT_EQ(kDocCommentCases_case.detached_comments[i], detached_comments[i]);
   }
 
   // Verify that we matched all the detached comments.
   EXPECT_EQ(NULL,
-      kDocCommentCases_case.detached_comments[detached_comments.size()]);
+            kDocCommentCases_case.detached_comments[detached_comments.size()]);
 
-  EXPECT_EQ(kDocCommentCases_case.next_leading_comments,
-            next_leading_comments);
+  EXPECT_EQ(kDocCommentCases_case.next_leading_comments, next_leading_comments);
 }
 
 // -------------------------------------------------------------------
@@ -745,30 +722,30 @@
   EXPECT_FALSE(Tokenizer::ParseInteger("-1", kuint64max, &i));
 
   // Test overflows.
-  EXPECT_TRUE (Tokenizer::ParseInteger("0", 0, &i));
+  EXPECT_TRUE(Tokenizer::ParseInteger("0", 0, &i));
   EXPECT_FALSE(Tokenizer::ParseInteger("1", 0, &i));
-  EXPECT_TRUE (Tokenizer::ParseInteger("1", 1, &i));
-  EXPECT_TRUE (Tokenizer::ParseInteger("12345", 12345, &i));
+  EXPECT_TRUE(Tokenizer::ParseInteger("1", 1, &i));
+  EXPECT_TRUE(Tokenizer::ParseInteger("12345", 12345, &i));
   EXPECT_FALSE(Tokenizer::ParseInteger("12346", 12345, &i));
-  EXPECT_TRUE (Tokenizer::ParseInteger("0xFFFFFFFFFFFFFFFF" , kuint64max, &i));
+  EXPECT_TRUE(Tokenizer::ParseInteger("0xFFFFFFFFFFFFFFFF", kuint64max, &i));
   EXPECT_FALSE(Tokenizer::ParseInteger("0x10000000000000000", kuint64max, &i));
 }
 
 TEST_F(TokenizerTest, ParseFloat) {
-  EXPECT_DOUBLE_EQ(1    , Tokenizer::ParseFloat("1."));
-  EXPECT_DOUBLE_EQ(1e3  , Tokenizer::ParseFloat("1e3"));
-  EXPECT_DOUBLE_EQ(1e3  , Tokenizer::ParseFloat("1E3"));
+  EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1."));
+  EXPECT_DOUBLE_EQ(1e3, Tokenizer::ParseFloat("1e3"));
+  EXPECT_DOUBLE_EQ(1e3, Tokenizer::ParseFloat("1E3"));
   EXPECT_DOUBLE_EQ(1.5e3, Tokenizer::ParseFloat("1.5e3"));
-  EXPECT_DOUBLE_EQ(.1   , Tokenizer::ParseFloat(".1"));
-  EXPECT_DOUBLE_EQ(.25  , Tokenizer::ParseFloat(".25"));
-  EXPECT_DOUBLE_EQ(.1e3 , Tokenizer::ParseFloat(".1e3"));
+  EXPECT_DOUBLE_EQ(.1, Tokenizer::ParseFloat(".1"));
+  EXPECT_DOUBLE_EQ(.25, Tokenizer::ParseFloat(".25"));
+  EXPECT_DOUBLE_EQ(.1e3, Tokenizer::ParseFloat(".1e3"));
   EXPECT_DOUBLE_EQ(.25e3, Tokenizer::ParseFloat(".25e3"));
   EXPECT_DOUBLE_EQ(.1e+3, Tokenizer::ParseFloat(".1e+3"));
   EXPECT_DOUBLE_EQ(.1e-3, Tokenizer::ParseFloat(".1e-3"));
-  EXPECT_DOUBLE_EQ(5    , Tokenizer::ParseFloat("5"));
+  EXPECT_DOUBLE_EQ(5, Tokenizer::ParseFloat("5"));
   EXPECT_DOUBLE_EQ(6e-12, Tokenizer::ParseFloat("6e-12"));
-  EXPECT_DOUBLE_EQ(1.2  , Tokenizer::ParseFloat("1.2"));
-  EXPECT_DOUBLE_EQ(1.e2 , Tokenizer::ParseFloat("1.e2"));
+  EXPECT_DOUBLE_EQ(1.2, Tokenizer::ParseFloat("1.2"));
+  EXPECT_DOUBLE_EQ(1.e2, Tokenizer::ParseFloat("1.e2"));
 
   // Test invalid integers that may still be tokenized as integers.
   EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1e"));
@@ -782,17 +759,20 @@
 
   // These should parse successfully even though they are out of range.
   // Overflows become infinity and underflows become zero.
-  EXPECT_EQ(     0.0, Tokenizer::ParseFloat("1e-9999999999999999999999999999"));
+  EXPECT_EQ(0.0, Tokenizer::ParseFloat("1e-9999999999999999999999999999"));
   EXPECT_EQ(HUGE_VAL, Tokenizer::ParseFloat("1e+9999999999999999999999999999"));
 
 #ifdef PROTOBUF_HAS_DEATH_TEST  // death tests do not work on Windows yet
   // Test invalid integers that will never be tokenized as integers.
-  EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("zxy"),
-    "passed text that could not have been tokenized as a float");
-  EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("1-e0"),
-    "passed text that could not have been tokenized as a float");
-  EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("-1.0"),
-    "passed text that could not have been tokenized as a float");
+  EXPECT_DEBUG_DEATH(
+      Tokenizer::ParseFloat("zxy"),
+      "passed text that could not have been tokenized as a float");
+  EXPECT_DEBUG_DEATH(
+      Tokenizer::ParseFloat("1-e0"),
+      "passed text that could not have been tokenized as a float");
+  EXPECT_DEBUG_DEATH(
+      Tokenizer::ParseFloat("-1.0"),
+      "passed text that could not have been tokenized as a float");
 #endif  // PROTOBUF_HAS_DEATH_TEST
 }
 
@@ -833,8 +813,9 @@
 
   // Test invalid strings that will never be tokenized as strings.
 #ifdef PROTOBUF_HAS_DEATH_TEST  // death tests do not work on Windows yet
-  EXPECT_DEBUG_DEATH(Tokenizer::ParseString("", &output),
-    "passed text that could not have been tokenized as a string");
+  EXPECT_DEBUG_DEATH(
+      Tokenizer::ParseString("", &output),
+      "passed text that could not have been tokenized as a string");
 #endif  // PROTOBUF_HAS_DEATH_TEST
 }
 
@@ -934,8 +915,7 @@
 TEST_2D(TokenizerTest, Errors, kErrorCases, kBlockSizes) {
   // Set up the tokenizer.
   TestInputStream input(kErrorCases_case.input.data(),
-                        kErrorCases_case.input.size(),
-                        kBlockSizes_case);
+                        kErrorCases_case.input.size(), kBlockSizes_case);
   TestErrorCollector error_collector;
   Tokenizer tokenizer(&input, &error_collector);
 
diff --git a/src/google/protobuf/io/zero_copy_stream_impl.cc b/src/google/protobuf/io/zero_copy_stream_impl.cc
index 72328da..4af76b7 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl.cc
+++ b/src/google/protobuf/io/zero_copy_stream_impl.cc
@@ -33,19 +33,19 @@
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
 #ifndef _MSC_VER
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
 #include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
 #endif
 #include <errno.h>
-#include <iostream>
 #include <algorithm>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <iostream>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/logging.h>
+#include <google/protobuf/io/io_win32.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/stubs/stl_util.h>
-#include <google/protobuf/stubs/io_win32.h>
 
 
 namespace google {
@@ -58,11 +58,11 @@
 #define lseek(fd, offset, origin) ((off_t)-1)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
-using google::protobuf::internal::win32::access;
-using google::protobuf::internal::win32::close;
-using google::protobuf::internal::win32::open;
-using google::protobuf::internal::win32::read;
-using google::protobuf::internal::win32::write;
+using google::protobuf::io::win32::access;
+using google::protobuf::io::win32::close;
+using google::protobuf::io::win32::open;
+using google::protobuf::io::win32::read;
+using google::protobuf::io::win32::write;
 #endif
 
 namespace {
@@ -81,38 +81,27 @@
 // ===================================================================
 
 FileInputStream::FileInputStream(int file_descriptor, int block_size)
-  : copying_input_(file_descriptor),
-    impl_(&copying_input_, block_size) {
-}
+    : copying_input_(file_descriptor), impl_(&copying_input_, block_size) {}
 
-bool FileInputStream::Close() {
-  return copying_input_.Close();
-}
+bool FileInputStream::Close() { return copying_input_.Close(); }
 
 bool FileInputStream::Next(const void** data, int* size) {
   return impl_.Next(data, size);
 }
 
-void FileInputStream::BackUp(int count) {
-  impl_.BackUp(count);
-}
+void FileInputStream::BackUp(int count) { impl_.BackUp(count); }
 
-bool FileInputStream::Skip(int count) {
-  return impl_.Skip(count);
-}
+bool FileInputStream::Skip(int count) { return impl_.Skip(count); }
 
-int64 FileInputStream::ByteCount() const {
-  return impl_.ByteCount();
-}
+int64 FileInputStream::ByteCount() const { return impl_.ByteCount(); }
 
 FileInputStream::CopyingFileInputStream::CopyingFileInputStream(
     int file_descriptor)
-  : file_(file_descriptor),
-    close_on_delete_(false),
-    is_closed_(false),
-    errno_(0),
-    previous_seek_failed_(false) {
-}
+    : file_(file_descriptor),
+      close_on_delete_(false),
+      is_closed_(false),
+      errno_(0),
+      previous_seek_failed_(false) {}
 
 FileInputStream::CopyingFileInputStream::~CopyingFileInputStream() {
   if (close_on_delete_) {
@@ -156,8 +145,7 @@
 int FileInputStream::CopyingFileInputStream::Skip(int count) {
   GOOGLE_CHECK(!is_closed_);
 
-  if (!previous_seek_failed_ &&
-      lseek(file_, count, SEEK_CUR) != (off_t)-1) {
+  if (!previous_seek_failed_ && lseek(file_, count, SEEK_CUR) != (off_t)-1) {
     // Seek succeeded.
     return count;
   } else {
@@ -175,42 +163,31 @@
 // ===================================================================
 
 FileOutputStream::FileOutputStream(int file_descriptor, int block_size)
-  : copying_output_(file_descriptor),
-    impl_(&copying_output_, block_size) {
-}
+    : copying_output_(file_descriptor), impl_(&copying_output_, block_size) {}
 
-FileOutputStream::~FileOutputStream() {
-  impl_.Flush();
-}
+FileOutputStream::~FileOutputStream() { impl_.Flush(); }
 
 bool FileOutputStream::Close() {
   bool flush_succeeded = impl_.Flush();
   return copying_output_.Close() && flush_succeeded;
 }
 
-bool FileOutputStream::Flush() {
-  return impl_.Flush();
-}
+bool FileOutputStream::Flush() { return impl_.Flush(); }
 
 bool FileOutputStream::Next(void** data, int* size) {
   return impl_.Next(data, size);
 }
 
-void FileOutputStream::BackUp(int count) {
-  impl_.BackUp(count);
-}
+void FileOutputStream::BackUp(int count) { impl_.BackUp(count); }
 
-int64 FileOutputStream::ByteCount() const {
-  return impl_.ByteCount();
-}
+int64 FileOutputStream::ByteCount() const { return impl_.ByteCount(); }
 
 FileOutputStream::CopyingFileOutputStream::CopyingFileOutputStream(
     int file_descriptor)
-  : file_(file_descriptor),
-    close_on_delete_(false),
-    is_closed_(false),
-    errno_(0) {
-}
+    : file_(file_descriptor),
+      close_on_delete_(false),
+      is_closed_(false),
+      errno_(0) {}
 
 FileOutputStream::CopyingFileOutputStream::~CopyingFileOutputStream() {
   if (close_on_delete_) {
@@ -235,8 +212,8 @@
   return true;
 }
 
-bool FileOutputStream::CopyingFileOutputStream::Write(
-    const void* buffer, int size) {
+bool FileOutputStream::CopyingFileOutputStream::Write(const void* buffer,
+                                                      int size) {
   GOOGLE_CHECK(!is_closed_);
   int total_written = 0;
 
@@ -279,17 +256,11 @@
   return impl_.Next(data, size);
 }
 
-void IstreamInputStream::BackUp(int count) {
-  impl_.BackUp(count);
-}
+void IstreamInputStream::BackUp(int count) { impl_.BackUp(count); }
 
-bool IstreamInputStream::Skip(int count) {
-  return impl_.Skip(count);
-}
+bool IstreamInputStream::Skip(int count) { return impl_.Skip(count); }
 
-int64 IstreamInputStream::ByteCount() const {
-  return impl_.ByteCount();
-}
+int64 IstreamInputStream::ByteCount() const { return impl_.ByteCount(); }
 
 IstreamInputStream::CopyingIstreamInputStream::CopyingIstreamInputStream(
     std::istream* input)
@@ -297,8 +268,8 @@
 
 IstreamInputStream::CopyingIstreamInputStream::~CopyingIstreamInputStream() {}
 
-int IstreamInputStream::CopyingIstreamInputStream::Read(
-    void* buffer, int size) {
+int IstreamInputStream::CopyingIstreamInputStream::Read(void* buffer,
+                                                        int size) {
   input_->read(reinterpret_cast<char*>(buffer), size);
   int result = input_->gcount();
   if (result == 0 && input_->fail() && !input_->eof()) {
@@ -312,21 +283,15 @@
 OstreamOutputStream::OstreamOutputStream(std::ostream* output, int block_size)
     : copying_output_(output), impl_(&copying_output_, block_size) {}
 
-OstreamOutputStream::~OstreamOutputStream() {
-  impl_.Flush();
-}
+OstreamOutputStream::~OstreamOutputStream() { impl_.Flush(); }
 
 bool OstreamOutputStream::Next(void** data, int* size) {
   return impl_.Next(data, size);
 }
 
-void OstreamOutputStream::BackUp(int count) {
-  impl_.BackUp(count);
-}
+void OstreamOutputStream::BackUp(int count) { impl_.BackUp(count); }
 
-int64 OstreamOutputStream::ByteCount() const {
-  return impl_.ByteCount();
-}
+int64 OstreamOutputStream::ByteCount() const { return impl_.ByteCount(); }
 
 OstreamOutputStream::CopyingOstreamOutputStream::CopyingOstreamOutputStream(
     std::ostream* output)
@@ -335,8 +300,8 @@
 OstreamOutputStream::CopyingOstreamOutputStream::~CopyingOstreamOutputStream() {
 }
 
-bool OstreamOutputStream::CopyingOstreamOutputStream::Write(
-    const void* buffer, int size) {
+bool OstreamOutputStream::CopyingOstreamOutputStream::Write(const void* buffer,
+                                                            int size) {
   output_->write(reinterpret_cast<const char*>(buffer), size);
   return output_->good();
 }
@@ -345,7 +310,7 @@
 
 ConcatenatingInputStream::ConcatenatingInputStream(
     ZeroCopyInputStream* const streams[], int count)
-  : streams_(streams), stream_count_(count), bytes_retired_(0) {
+    : streams_(streams), stream_count_(count), bytes_retired_(0) {
 }
 
 bool ConcatenatingInputStream::Next(const void** data, int* size) {
diff --git a/src/google/protobuf/io/zero_copy_stream_impl.h b/src/google/protobuf/io/zero_copy_stream_impl.h
index f2d2688..fd06c06 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl.h
+++ b/src/google/protobuf/io/zero_copy_stream_impl.h
@@ -40,11 +40,11 @@
 #ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__
 #define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__
 
-#include <string>
 #include <iosfwd>
+#include <string>
+#include <google/protobuf/stubs/common.h>
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl_lite.h>
-#include <google/protobuf/stubs/common.h>
 
 
 #include <google/protobuf/port_def.inc>
diff --git a/src/google/protobuf/io/zero_copy_stream_impl_lite.cc b/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
index f5f340f..69ceaab 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
+++ b/src/google/protobuf/io/zero_copy_stream_impl_lite.cc
@@ -55,14 +55,12 @@
 
 // ===================================================================
 
-ArrayInputStream::ArrayInputStream(const void* data, int size,
-                                   int block_size)
-  : data_(reinterpret_cast<const uint8*>(data)),
-    size_(size),
-    block_size_(block_size > 0 ? block_size : size),
-    position_(0),
-    last_returned_size_(0) {
-}
+ArrayInputStream::ArrayInputStream(const void* data, int size, int block_size)
+    : data_(reinterpret_cast<const uint8*>(data)),
+      size_(size),
+      block_size_(block_size > 0 ? block_size : size),
+      position_(0),
+      last_returned_size_(0) {}
 
 bool ArrayInputStream::Next(const void** data, int* size) {
   if (position_ < size_) {
@@ -73,7 +71,7 @@
     return true;
   } else {
     // We're at the end of the array.
-    last_returned_size_ = 0;   // Don't let caller back up.
+    last_returned_size_ = 0;  // Don't let caller back up.
     return false;
   }
 }
@@ -89,7 +87,7 @@
 
 bool ArrayInputStream::Skip(int count) {
   GOOGLE_CHECK_GE(count, 0);
-  last_returned_size_ = 0;   // Don't let caller back up.
+  last_returned_size_ = 0;  // Don't let caller back up.
   if (count > size_ - position_) {
     position_ = size_;
     return false;
@@ -99,20 +97,17 @@
   }
 }
 
-int64 ArrayInputStream::ByteCount() const {
-  return position_;
-}
+int64 ArrayInputStream::ByteCount() const { return position_; }
 
 
 // ===================================================================
 
 ArrayOutputStream::ArrayOutputStream(void* data, int size, int block_size)
-  : data_(reinterpret_cast<uint8*>(data)),
-    size_(size),
-    block_size_(block_size > 0 ? block_size : size),
-    position_(0),
-    last_returned_size_(0) {
-}
+    : data_(reinterpret_cast<uint8*>(data)),
+      size_(size),
+      block_size_(block_size > 0 ? block_size : size),
+      position_(0),
+      last_returned_size_(0) {}
 
 bool ArrayOutputStream::Next(void** data, int* size) {
   if (position_ < size_) {
@@ -123,7 +118,7 @@
     return true;
   } else {
     // We're at the end of the array.
-    last_returned_size_ = 0;   // Don't let caller back up.
+    last_returned_size_ = 0;  // Don't let caller back up.
     return false;
   }
 }
@@ -137,9 +132,7 @@
   last_returned_size_ = 0;  // Don't let caller back up further.
 }
 
-int64 ArrayOutputStream::ByteCount() const {
-  return position_;
-}
+int64 ArrayOutputStream::ByteCount() const { return position_; }
 
 // ===================================================================
 
@@ -209,14 +202,13 @@
 
 CopyingInputStreamAdaptor::CopyingInputStreamAdaptor(
     CopyingInputStream* copying_stream, int block_size)
-  : copying_stream_(copying_stream),
-    owns_copying_stream_(false),
-    failed_(false),
-    position_(0),
-    buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize),
-    buffer_used_(0),
-    backup_bytes_(0) {
-}
+    : copying_stream_(copying_stream),
+      owns_copying_stream_(false),
+      failed_(false),
+      position_(0),
+      buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize),
+      buffer_used_(0),
+      backup_bytes_(0) {}
 
 CopyingInputStreamAdaptor::~CopyingInputStreamAdaptor() {
   if (owns_copying_stream_) {
@@ -260,12 +252,11 @@
 
 void CopyingInputStreamAdaptor::BackUp(int count) {
   GOOGLE_CHECK(backup_bytes_ == 0 && buffer_.get() != NULL)
-    << " BackUp() can only be called after Next().";
+      << " BackUp() can only be called after Next().";
   GOOGLE_CHECK_LE(count, buffer_used_)
-    << " Can't back up over more bytes than were returned by the last call"
-       " to Next().";
-  GOOGLE_CHECK_GE(count, 0)
-    << " Parameter to BackUp() can't be negative.";
+      << " Can't back up over more bytes than were returned by the last call"
+         " to Next().";
+  GOOGLE_CHECK_GE(count, 0) << " Parameter to BackUp() can't be negative.";
 
   backup_bytes_ = count;
 }
@@ -313,13 +304,12 @@
 
 CopyingOutputStreamAdaptor::CopyingOutputStreamAdaptor(
     CopyingOutputStream* copying_stream, int block_size)
-  : copying_stream_(copying_stream),
-    owns_copying_stream_(false),
-    failed_(false),
-    position_(0),
-    buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize),
-    buffer_used_(0) {
-}
+    : copying_stream_(copying_stream),
+      owns_copying_stream_(false),
+      failed_(false),
+      position_(0),
+      buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize),
+      buffer_used_(0) {}
 
 CopyingOutputStreamAdaptor::~CopyingOutputStreamAdaptor() {
   WriteBuffer();
@@ -328,9 +318,7 @@
   }
 }
 
-bool CopyingOutputStreamAdaptor::Flush() {
-  return WriteBuffer();
-}
+bool CopyingOutputStreamAdaptor::Flush() { return WriteBuffer(); }
 
 bool CopyingOutputStreamAdaptor::Next(void** data, int* size) {
   if (buffer_used_ == buffer_size_) {
@@ -348,10 +336,10 @@
 void CopyingOutputStreamAdaptor::BackUp(int count) {
   GOOGLE_CHECK_GE(count, 0);
   GOOGLE_CHECK_EQ(buffer_used_, buffer_size_)
-    << " BackUp() can only be called after Next().";
+      << " BackUp() can only be called after Next().";
   GOOGLE_CHECK_LE(count, buffer_used_)
-    << " Can't back up over more bytes than were returned by the last call"
-       " to Next().";
+      << " Can't back up over more bytes than were returned by the last call"
+         " to Next().";
 
   buffer_used_ -= count;
 }
diff --git a/src/google/protobuf/io/zero_copy_stream_impl_lite.h b/src/google/protobuf/io/zero_copy_stream_impl_lite.h
index 6c14abc..14144b5 100644
--- a/src/google/protobuf/io/zero_copy_stream_impl_lite.h
+++ b/src/google/protobuf/io/zero_copy_stream_impl_lite.h
@@ -44,12 +44,12 @@
 #ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
 #define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
 
+#include <iosfwd>
 #include <memory>
 #include <string>
-#include <iosfwd>
-#include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/stubs/callback.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/stubs/stl_util.h>
 
 
@@ -87,8 +87,8 @@
   const int block_size_;     // How many bytes to return at a time.
 
   int position_;
-  int last_returned_size_;   // How many bytes we returned last time Next()
-                             // was called (used for error checking only).
+  int last_returned_size_;  // How many bytes we returned last time Next()
+                            // was called (used for error checking only).
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayInputStream);
 };
@@ -114,13 +114,13 @@
   int64 ByteCount() const override;
 
  private:
-  uint8* const data_;        // The byte array.
-  const int size_;           // Total size of the array.
-  const int block_size_;     // How many bytes to return at a time.
+  uint8* const data_;     // The byte array.
+  const int size_;        // Total size of the array.
+  const int block_size_;  // How many bytes to return at a time.
 
   int position_;
-  int last_returned_size_;   // How many bytes we returned last time Next()
-                             // was called (used for error checking only).
+  int last_returned_size_;  // How many bytes we returned last time Next()
+                            // was called (used for error checking only).
 
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayOutputStream);
 };
@@ -394,7 +394,7 @@
 // Sometimes it's faster: in some scenarios p cannot be NULL, and then the
 // code can avoid that check.
 inline std::pair<char*, bool> as_string_data(std::string* s) {
-  char *p = mutable_string_data(s);
+  char* p = mutable_string_data(s);
   return std::make_pair(p, true);
 }
 
diff --git a/src/google/protobuf/io/zero_copy_stream_unittest.cc b/src/google/protobuf/io/zero_copy_stream_unittest.cc
index 8530d73..5f7b610 100644
--- a/src/google/protobuf/io/zero_copy_stream_unittest.cc
+++ b/src/google/protobuf/io/zero_copy_stream_unittest.cc
@@ -50,16 +50,17 @@
 #ifndef _MSC_VER
 #include <unistd.h>
 #endif
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
 #include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <sys/types.h>
 #include <memory>
 #include <sstream>
 
 #include <google/protobuf/testing/file.h>
 #include <google/protobuf/test_util2.h>
+#include <google/protobuf/io/io_win32.h>
 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 
@@ -69,10 +70,9 @@
 
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/stubs/logging.h>
-#include <google/protobuf/testing/googletest.h>
 #include <google/protobuf/testing/file.h>
+#include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
-#include <google/protobuf/stubs/io_win32.h>
 
 namespace google {
 namespace protobuf {
@@ -83,17 +83,17 @@
 #define pipe(fds) _pipe(fds, 4096, O_BINARY)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
-using google::protobuf::internal::win32::access;
-using google::protobuf::internal::win32::mkdir;
-using google::protobuf::internal::win32::open;
-using google::protobuf::internal::win32::close;
+using google::protobuf::io::win32::access;
+using google::protobuf::io::win32::close;
+using google::protobuf::io::win32::mkdir;
+using google::protobuf::io::win32::open;
 #endif
 
 #ifndef O_BINARY
 #ifdef _O_BINARY
 #define O_BINARY _O_BINARY
 #else
-#define O_BINARY 0     // If this isn't defined, the platform doesn't need it.
+#define O_BINARY 0  // If this isn't defined, the platform doesn't need it.
 #endif
 #endif
 
@@ -137,8 +137,8 @@
 const int IoTest::kBlockSizes[] = {-1, 1, 2, 5, 7, 10, 23, 64};
 const int IoTest::kBlockSizeCount = GOOGLE_ARRAYSIZE(IoTest::kBlockSizes);
 
-bool IoTest::WriteToOutput(ZeroCopyOutputStream* output,
-                           const void* data, int size) {
+bool IoTest::WriteToOutput(ZeroCopyOutputStream* output, const void* data,
+                           int size) {
   const uint8* in = reinterpret_cast<const uint8*>(data);
   int in_size = size;
 
@@ -300,7 +300,7 @@
 
   static const char* strA = "0123456789";
   static const char* strB = "WhirledPeas";
-  const int kBufferSize = 2*1024;
+  const int kBufferSize = 2 * 1024;
   uint8* buffer = new uint8[kBufferSize];
   char* temp_buffer = new char[40];
 
@@ -314,8 +314,8 @@
       delete coded_output;  // flush
       int64 pos = output->ByteCount();
       delete output;
-      output = new ArrayOutputStream(
-          buffer + pos, kBufferSize - pos, kBlockSizes[i]);
+      output = new ArrayOutputStream(buffer + pos, kBufferSize - pos,
+                                     kBlockSizes[i]);
       coded_output = new CodedOutputStream(output);
       coded_output->WriteVarint32(strlen(strB));
       coded_output->WriteRaw(strB, strlen(strB));
@@ -342,13 +342,13 @@
     }
   }
 
-  delete [] temp_buffer;
-  delete [] buffer;
+  delete[] temp_buffer;
+  delete[] buffer;
 }
 
 #if HAVE_ZLIB
 TEST_F(IoTest, GzipIo) {
-  const int kBufferSize = 2*1024;
+  const int kBufferSize = 2 * 1024;
   uint8* buffer = new uint8[kBufferSize];
   for (int i = 0; i < kBlockSizeCount; i++) {
     for (int j = 0; j < kBlockSizeCount; j++) {
@@ -369,18 +369,17 @@
         }
         {
           ArrayInputStream input(buffer, size, kBlockSizes[j]);
-          GzipInputStream gzin(
-              &input, GzipInputStream::GZIP, gzip_buffer_size);
+          GzipInputStream gzin(&input, GzipInputStream::GZIP, gzip_buffer_size);
           ReadStuff(&gzin);
         }
       }
     }
   }
-  delete [] buffer;
+  delete[] buffer;
 }
 
 TEST_F(IoTest, GzipIoWithFlush) {
-  const int kBufferSize = 2*1024;
+  const int kBufferSize = 2 * 1024;
   uint8* buffer = new uint8[kBufferSize];
   // We start with i = 4 as we want a block size > 6. With block size <= 6
   // Flush() fills up the entire 2K buffer with flush markers and the test
@@ -405,18 +404,17 @@
         }
         {
           ArrayInputStream input(buffer, size, kBlockSizes[j]);
-          GzipInputStream gzin(
-              &input, GzipInputStream::GZIP, gzip_buffer_size);
+          GzipInputStream gzin(&input, GzipInputStream::GZIP, gzip_buffer_size);
           ReadStuff(&gzin);
         }
       }
     }
   }
-  delete [] buffer;
+  delete[] buffer;
 }
 
 TEST_F(IoTest, GzipIoContiguousFlushes) {
-  const int kBufferSize = 2*1024;
+  const int kBufferSize = 2 * 1024;
   uint8* buffer = new uint8[kBufferSize];
 
   int block_size = kBlockSizes[4];
@@ -437,15 +435,14 @@
   size = output.ByteCount();
 
   ArrayInputStream input(buffer, size, block_size);
-  GzipInputStream gzin(
-      &input, GzipInputStream::GZIP, gzip_buffer_size);
+  GzipInputStream gzin(&input, GzipInputStream::GZIP, gzip_buffer_size);
   ReadStuff(&gzin);
 
-  delete [] buffer;
+  delete[] buffer;
 }
 
 TEST_F(IoTest, GzipIoReadAfterFlush) {
-  const int kBufferSize = 2*1024;
+  const int kBufferSize = 2 * 1024;
   uint8* buffer = new uint8[kBufferSize];
 
   int block_size = kBlockSizes[4];
@@ -464,17 +461,16 @@
   size = output.ByteCount();
 
   ArrayInputStream input(buffer, size, block_size);
-  GzipInputStream gzin(
-      &input, GzipInputStream::GZIP, gzip_buffer_size);
+  GzipInputStream gzin(&input, GzipInputStream::GZIP, gzip_buffer_size);
   ReadStuff(&gzin);
 
   gzout.Close();
 
-  delete [] buffer;
+  delete[] buffer;
 }
 
 TEST_F(IoTest, ZlibIo) {
-  const int kBufferSize = 2*1024;
+  const int kBufferSize = 2 * 1024;
   uint8* buffer = new uint8[kBufferSize];
   for (int i = 0; i < kBlockSizeCount; i++) {
     for (int j = 0; j < kBlockSizeCount; j++) {
@@ -495,18 +491,17 @@
         }
         {
           ArrayInputStream input(buffer, size, kBlockSizes[j]);
-          GzipInputStream gzin(
-              &input, GzipInputStream::ZLIB, gzip_buffer_size);
+          GzipInputStream gzin(&input, GzipInputStream::ZLIB, gzip_buffer_size);
           ReadStuff(&gzin);
         }
       }
     }
   }
-  delete [] buffer;
+  delete[] buffer;
 }
 
 TEST_F(IoTest, ZlibIoInputAutodetect) {
-  const int kBufferSize = 2*1024;
+  const int kBufferSize = 2 * 1024;
   uint8* buffer = new uint8[kBufferSize];
   int size;
   {
@@ -537,7 +532,7 @@
     GzipInputStream gzin(&input, GzipInputStream::AUTO);
     ReadStuff(&gzin);
   }
-  delete [] buffer;
+  delete[] buffer;
 }
 
 std::string IoTest::Compress(const std::string& data,
@@ -605,7 +600,7 @@
 
   static const char* strA = "0123456789";
   static const char* strB = "QuickBrownFox";
-  const int kBufferSize = 2*1024;
+  const int kBufferSize = 2 * 1024;
   uint8* buffer = new uint8[kBufferSize];
   char* temp_buffer = new char[40];
 
@@ -619,18 +614,18 @@
       coded_output->WriteVarint32(outlen);
       coded_output->WriteRaw(strA, outlen);
       delete coded_output;  // flush
-      delete gzout;  // flush
+      delete gzout;         // flush
       int64 pos = output->ByteCount();
       delete output;
-      output = new ArrayOutputStream(
-          buffer + pos, kBufferSize - pos, kBlockSizes[i]);
+      output = new ArrayOutputStream(buffer + pos, kBufferSize - pos,
+                                     kBlockSizes[i]);
       gzout = new GzipOutputStream(output);
       coded_output = new CodedOutputStream(gzout);
       outlen = strlen(strB) + 1;
       coded_output->WriteVarint32(outlen);
       coded_output->WriteRaw(strB, outlen);
       delete coded_output;  // flush
-      delete gzout;  // flush
+      delete gzout;         // flush
       int64 size = pos + output->ByteCount();
       delete output;
 
@@ -650,10 +645,8 @@
       EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize));
       EXPECT_EQ(0, memcmp(temp_buffer, strB, insize))
           << " out_block_size=" << kBlockSizes[i]
-          << " in_block_size=" << kBlockSizes[j]
-          << " pos=" << pos
-          << " size=" << size
-          << " strB=" << strB << " in=" << temp_buffer;
+          << " in_block_size=" << kBlockSizes[j] << " pos=" << pos
+          << " size=" << size << " strB=" << strB << " in=" << temp_buffer;
 
       delete coded_input;
       delete gzin;
@@ -661,8 +654,8 @@
     }
   }
 
-  delete [] temp_buffer;
-  delete [] buffer;
+  delete[] temp_buffer;
+  delete[] buffer;
 }
 
 TEST_F(IoTest, GzipInputByteCountAfterClosed) {
@@ -727,7 +720,7 @@
     for (int j = 0; j < kBlockSizeCount; j++) {
       // Make a temporary file.
       int file =
-        open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777);
+          open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777);
       ASSERT_GE(file, 0);
 
       {
@@ -758,7 +751,7 @@
     for (int j = 0; j < kBlockSizeCount; j++) {
       // Make a temporary file.
       int file =
-        open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777);
+          open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777);
       ASSERT_GE(file, 0);
       {
         FileOutputStream output(file, kBlockSizes[i]);
@@ -800,10 +793,8 @@
     old_mode_ = _CrtSetReportMode(_CRT_ASSERT, old_mode_);
   }
 
-  static void MyHandler(const wchar_t *expr,
-                        const wchar_t *func,
-                        const wchar_t *file,
-                        unsigned int line,
+  static void MyHandler(const wchar_t* expr, const wchar_t* func,
+                        const wchar_t* file, unsigned int line,
                         uintptr_t pReserved) {
     // do nothing
   }
@@ -931,19 +922,19 @@
 
   // Now split it up into multiple streams of varying sizes.
   ASSERT_EQ(68, output.ByteCount());  // Test depends on this.
-  ArrayInputStream input1(buffer     , 12);
-  ArrayInputStream input2(buffer + 12,  7);
-  ArrayInputStream input3(buffer + 19,  6);
+  ArrayInputStream input1(buffer, 12);
+  ArrayInputStream input2(buffer + 12, 7);
+  ArrayInputStream input3(buffer + 19, 6);
   ArrayInputStream input4(buffer + 25, 15);
-  ArrayInputStream input5(buffer + 40,  0);
+  ArrayInputStream input5(buffer + 40, 0);
   // Note:  We want to make sure we have a stream boundary somewhere between
   // bytes 42 and 62, which is the range that it Skip()ed by ReadStuff().  This
   // tests that a bug that existed in the original code for Skip() is fixed.
   ArrayInputStream input6(buffer + 40, 10);
   ArrayInputStream input7(buffer + 50, 18);  // Total = 68 bytes.
 
-  ZeroCopyInputStream* streams[] =
-    {&input1, &input2, &input3, &input4, &input5, &input6, &input7};
+  ZeroCopyInputStream* streams[] = {&input1, &input2, &input3, &input4,
+                                    &input5, &input6, &input7};
 
   // Create the concatenating stream and read.
   ConcatenatingInputStream input(streams, GOOGLE_ARRAYSIZE(streams));
@@ -986,7 +977,7 @@
   LimitingInputStream input(&array_input, kHalfBufferSize - 1);
   EXPECT_EQ(0, input.ByteCount());
   EXPECT_TRUE(input.Next(&data, &size));
-  EXPECT_EQ(kHalfBufferSize - 1 , input.ByteCount());
+  EXPECT_EQ(kHalfBufferSize - 1, input.ByteCount());
 }
 
 // Check that a zero-size array doesn't confuse the code.
diff --git a/src/google/protobuf/lite_unittest.cc b/src/google/protobuf/lite_unittest.cc
index 65b2f52..c16bdf7 100644
--- a/src/google/protobuf/lite_unittest.cc
+++ b/src/google/protobuf/lite_unittest.cc
@@ -56,10 +56,9 @@
   EXPECT_EQ(message.optional_string(), "hello");
 }
 
-void AssignParsingMergeMessages(
-    unittest::TestAllTypesLite* msg1,
-    unittest::TestAllTypesLite* msg2,
-    unittest::TestAllTypesLite* msg3) {
+void AssignParsingMergeMessages(unittest::TestAllTypesLite* msg1,
+                                unittest::TestAllTypesLite* msg2,
+                                unittest::TestAllTypesLite* msg3) {
   msg1->set_optional_int32(1);
   msg2->set_optional_int64(2);
   msg3->set_optional_int32(3);
@@ -174,10 +173,10 @@
     unittest::TestAllTypesLite* msg2;
     unittest::TestAllTypesLite* msg3;
 
-#define ASSIGN_REPEATED_FIELD(FIELD)                \
-  msg1 = generator.add_##FIELD();                   \
-  msg2 = generator.add_##FIELD();                   \
-  msg3 = generator.add_##FIELD();                   \
+#define ASSIGN_REPEATED_FIELD(FIELD) \
+  msg1 = generator.add_##FIELD();    \
+  msg2 = generator.add_##FIELD();    \
+  msg3 = generator.add_##FIELD();    \
   AssignParsingMergeMessages(msg1, msg2, msg3)
 
     ASSIGN_REPEATED_FIELD(field1);
@@ -447,8 +446,7 @@
     protobuf_unittest::TestMessageMapLite message;
 
     // Creates a TestAllTypes with default value
-    TestUtilLite::ExpectClear(
-        (*message.mutable_map_int32_message())[0]);
+    TestUtilLite::ExpectClear((*message.mutable_map_int32_message())[0]);
   }
 }
 
@@ -836,30 +834,30 @@
   std::string data;
 
   {
-      // Check that adding more values to enum does not corrupt message
-      // when passed through an old client.
-      protobuf_unittest::V2MessageLite v2_message;
-      v2_message.set_int_field(800);
-      // Set enum field to the value not understood by the old client.
-      v2_message.set_enum_field(protobuf_unittest::V2_SECOND);
-      std::string v2_bytes = v2_message.SerializeAsString();
+    // Check that adding more values to enum does not corrupt message
+    // when passed through an old client.
+    protobuf_unittest::V2MessageLite v2_message;
+    v2_message.set_int_field(800);
+    // Set enum field to the value not understood by the old client.
+    v2_message.set_enum_field(protobuf_unittest::V2_SECOND);
+    std::string v2_bytes = v2_message.SerializeAsString();
 
-      protobuf_unittest::V1MessageLite v1_message;
-      v1_message.ParseFromString(v2_bytes);
-      EXPECT_TRUE(v1_message.IsInitialized());
-      EXPECT_EQ(v1_message.int_field(), v2_message.int_field());
-      // V1 client does not understand V2_SECOND value, so it discards it and
-      // uses default value instead.
-      EXPECT_EQ(v1_message.enum_field(), protobuf_unittest::V1_FIRST);
+    protobuf_unittest::V1MessageLite v1_message;
+    v1_message.ParseFromString(v2_bytes);
+    EXPECT_TRUE(v1_message.IsInitialized());
+    EXPECT_EQ(v1_message.int_field(), v2_message.int_field());
+    // V1 client does not understand V2_SECOND value, so it discards it and
+    // uses default value instead.
+    EXPECT_EQ(v1_message.enum_field(), protobuf_unittest::V1_FIRST);
 
-      // However, when re-serialized, it should preserve enum value.
-      std::string v1_bytes = v1_message.SerializeAsString();
+    // However, when re-serialized, it should preserve enum value.
+    std::string v1_bytes = v1_message.SerializeAsString();
 
-      protobuf_unittest::V2MessageLite same_v2_message;
-      same_v2_message.ParseFromString(v1_bytes);
+    protobuf_unittest::V2MessageLite same_v2_message;
+    same_v2_message.ParseFromString(v1_bytes);
 
-      EXPECT_EQ(v2_message.int_field(), same_v2_message.int_field());
-      EXPECT_EQ(v2_message.enum_field(), same_v2_message.enum_field());
+    EXPECT_EQ(v2_message.int_field(), same_v2_message.int_field());
+    EXPECT_EQ(v2_message.enum_field(), same_v2_message.enum_field());
   }
 }
 
diff --git a/src/google/protobuf/map.h b/src/google/protobuf/map.h
index 40f35e9..2750c02 100644
--- a/src/google/protobuf/map.h
+++ b/src/google/protobuf/map.h
@@ -63,7 +63,8 @@
 
 class MapIterator;
 
-template <typename Enum> struct is_proto_enum;
+template <typename Enum>
+struct is_proto_enum;
 
 namespace internal {
 template <typename Derived, typename Key, typename T,
@@ -96,8 +97,7 @@
   MapPair(const Key& other_first, const T& other_second)
       : first(other_first), second(other_second) {}
   explicit MapPair(const Key& other_first) : first(other_first), second() {}
-  MapPair(const MapPair& other)
-      : first(other.first), second(other.second) {}
+  MapPair(const MapPair& other) : first(other.first), second(other.second) {}
 
   ~MapPair() {}
 
@@ -183,7 +183,8 @@
 
  private:
   void Init() {
-    elements_ = Arena::Create<InnerMap>(arena_, 0u, hasher(), Allocator(arena_));
+    elements_ =
+        Arena::Create<InnerMap>(arena_, 0u, hasher(), Allocator(arena_));
   }
 
   // re-implement std::allocator to use arena allocator for memory allocation.
@@ -231,7 +232,7 @@
 #if __cplusplus >= 201103L && !defined(GOOGLE_PROTOBUF_OS_APPLE) && \
     !defined(GOOGLE_PROTOBUF_OS_NACL) &&                            \
     !defined(GOOGLE_PROTOBUF_OS_EMSCRIPTEN)
-    template<class NodeType, class... Args>
+    template <class NodeType, class... Args>
     void construct(NodeType* p, Args&&... args) {
       // Clang 3.6 doesn't compile static casting to void* directly. (Issue
       // #1266) According C++ standard 5.2.9/1: "The static_cast operator shall
@@ -241,7 +242,7 @@
           NodeType(std::forward<Args>(args)...);
     }
 
-    template<class NodeType>
+    template <class NodeType>
     void destroy(NodeType* p) {
       p->~NodeType();
     }
@@ -274,9 +275,7 @@
 
     // To support gcc-4.4, which does not properly
     // support templated friend classes
-    Arena* arena() const {
-      return arena_;
-    }
+    Arena* arena() const { return arena_; }
 
    private:
     typedef void DestructorSkippable_;
@@ -483,8 +482,7 @@
         // Force bucket_index_ to be in range.
         bucket_index_ &= (m_->num_buckets_ - 1);
         // Common case: the bucket we think is relevant points to node_.
-        if (m_->table_[bucket_index_] == static_cast<void*>(node_))
-          return true;
+        if (m_->table_[bucket_index_] == static_cast<void*>(node_)) return true;
         // Less common: the bucket is a linked list with node_ somewhere in it,
         // but not at the head.
         if (m_->TableEntryIsNonEmptyList(bucket_index_)) {
@@ -720,10 +718,9 @@
       GOOGLE_DCHECK_EQ(table_[b], table_[b ^ 1]);
       // Maintain the invariant that node->next is NULL for all Nodes in Trees.
       node->next = NULL;
-      return iterator(static_cast<Tree*>(table_[b])
-                      ->insert(KeyPtrFromNodePtr(node))
-                      .first,
-                      this, b & ~static_cast<size_t>(1));
+      return iterator(
+          static_cast<Tree*>(table_[b])->insert(KeyPtrFromNodePtr(node)).first,
+          this, b & ~static_cast<size_t>(1));
     }
 
     // Returns whether it did resize.  Currently this is only used when
@@ -834,7 +831,7 @@
     }
     static bool TableEntryIsTree(void* const* table, size_type b) {
       return !TableEntryIsEmpty(table, b) &&
-          !TableEntryIsNonEmptyList(table, b);
+             !TableEntryIsNonEmptyList(table, b);
     }
     static bool TableEntryIsList(void* const* table, size_type b) {
       return !TableEntryIsTree(table, b);
@@ -942,7 +939,7 @@
       size_type s = static_cast<size_type>(reinterpret_cast<uintptr_t>(this));
 #if defined(__x86_64__) && defined(__GNUC__)
       uint32 hi, lo;
-      asm("rdtsc" : "=a" (lo), "=d" (hi));
+      asm("rdtsc" : "=a"(lo), "=d"(hi));
       s += ((static_cast<uint64>(hi) << 32) | lo);
 #endif
       return s;
@@ -972,9 +969,7 @@
     const_iterator() {}
     explicit const_iterator(const InnerIt& it) : it_(it) {}
 
-    const_reference operator*() const {
-      return *it_->value();
-    }
+    const_reference operator*() const { return *it_->value(); }
     const_pointer operator->() const { return &(operator*()); }
 
     const_iterator& operator++() {
@@ -1051,7 +1046,7 @@
 
   // Element access
   T& operator[](const key_type& key) {
-    value_type** value =  &(*elements_)[key];
+    value_type** value = &(*elements_)[key];
     if (*value == NULL) {
       *value = CreateValueTypeInternal(key);
       internal::MapValueInitializer<is_proto_enum<T>::value, T>::Initialize(
diff --git a/src/google/protobuf/map_entry_lite.h b/src/google/protobuf/map_entry_lite.h
index 756b9af..c7d7558 100644
--- a/src/google/protobuf/map_entry_lite.h
+++ b/src/google/protobuf/map_entry_lite.h
@@ -122,16 +122,16 @@
   // Enum type cannot be used for MapTypeHandler::Read. Define a type
   // which will replace Enum with int.
   typedef typename KeyTypeHandler::MapEntryAccessorType KeyMapEntryAccessorType;
-  typedef typename ValueTypeHandler::MapEntryAccessorType
-      ValueMapEntryAccessorType;
+  typedef
+      typename ValueTypeHandler::MapEntryAccessorType ValueMapEntryAccessorType;
 
   // Constants for field number.
   static const int kKeyFieldNumber = 1;
   static const int kValueFieldNumber = 2;
 
   // Constants for field tag.
-  static const uint8 kKeyTag = GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(
-      kKeyFieldNumber, KeyTypeHandler::kWireType);
+  static const uint8 kKeyTag =
+      GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kKeyFieldNumber, KeyTypeHandler::kWireType);
   static const uint8 kValueTag = GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(
       kValueFieldNumber, ValueTypeHandler::kWireType);
   static const size_t kTagSize = 1;
@@ -202,12 +202,14 @@
       GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
       if (tag == kKeyTag) {
         set_has_key();
-        ptr = KeyTypeHandler::Read(ptr, ctx, mutable_key());
-        if (!::down_cast<Derived*>(this)->ValidateKey()) return nullptr;
+        KeyMapEntryAccessorType* key = mutable_key();
+        ptr = KeyTypeHandler::Read(ptr, ctx, key);
+        if (!Derived::ValidateKey(key)) return nullptr;
       } else if (tag == kValueTag) {
         set_has_value();
-        ptr = ValueTypeHandler::Read(ptr, ctx, mutable_value());
-        if (!::down_cast<Derived*>(this)->ValidateValue()) return nullptr;
+        ValueMapEntryAccessorType* value = mutable_value();
+        ptr = ValueTypeHandler::Read(ptr, ctx, value);
+        if (!Derived::ValidateValue(value)) return nullptr;
       } else {
         if (tag == 0 || WireFormatLite::GetTagWireType(tag) ==
                             WireFormatLite::WIRETYPE_END_GROUP) {
@@ -251,9 +253,8 @@
           break;
 
         default:
-          if (tag == 0 ||
-              WireFormatLite::GetTagWireType(tag) ==
-              WireFormatLite::WIRETYPE_END_GROUP) {
+          if (tag == 0 || WireFormatLite::GetTagWireType(tag) ==
+                              WireFormatLite::WIRETYPE_END_GROUP) {
             return true;
           }
           if (!WireFormatLite::SkipField(input, tag)) return false;
@@ -265,10 +266,13 @@
 
   size_t ByteSizeLong() const override {
     size_t size = 0;
-    size += has_key() ?
-        kTagSize + static_cast<size_t>(KeyTypeHandler::ByteSize(key())) : 0;
-    size += has_value() ?
-        kTagSize + static_cast<size_t>(ValueTypeHandler::ByteSize(value())) : 0;
+    size += has_key() ? kTagSize +
+                            static_cast<size_t>(KeyTypeHandler::ByteSize(key()))
+                      : 0;
+    size += has_value()
+                ? kTagSize +
+                      static_cast<size_t>(ValueTypeHandler::ByteSize(value()))
+                : 0;
     return size;
   }
 
@@ -288,12 +292,12 @@
 
   int GetCachedSize() const override {
     int size = 0;
-    size += has_key()
-        ? static_cast<int>(kTagSize) + KeyTypeHandler::GetCachedSize(key())
-        : 0;
-    size += has_value()
-        ? static_cast<int>(kTagSize) + ValueTypeHandler::GetCachedSize(value())
-        : 0;
+    size += has_key() ? static_cast<int>(kTagSize) +
+                            KeyTypeHandler::GetCachedSize(key())
+                      : 0;
+    size += has_value() ? static_cast<int>(kTagSize) +
+                              ValueTypeHandler::GetCachedSize(value())
+                        : 0;
     return size;
   }
 
@@ -332,8 +336,8 @@
  public:
   void Clear() override {
     KeyTypeHandler::Clear(&key_, GetArenaNoVirtual());
-    ValueTypeHandler::ClearMaybeByDefaultEnum(
-        &value_, GetArenaNoVirtual(), default_enum_value);
+    ValueTypeHandler::ClearMaybeByDefaultEnum(&value_, GetArenaNoVirtual(),
+                                              default_enum_value);
     clear_has_key();
     clear_has_value();
   }
@@ -416,10 +420,43 @@
     }
 
     const char* _InternalParse(const char* ptr, ParseContext* ctx) {
-      auto entry = NewEntry();
-      ptr = entry->_InternalParse(ptr, ctx);
-      if (!ptr) return nullptr;
-      UseKeyAndValueFromEntry();
+      if (PROTOBUF_PREDICT_TRUE(!ctx->Done(&ptr) && *ptr == kKeyTag)) {
+        ptr = KeyTypeHandler::Read(ptr + 1, ctx, &key_);
+        if (PROTOBUF_PREDICT_FALSE(!ptr || !Derived::ValidateKey(&key_))) {
+          return nullptr;
+        }
+        if (PROTOBUF_PREDICT_TRUE(!ctx->Done(&ptr) && *ptr == kValueTag)) {
+          typename Map::size_type map_size = map_->size();
+          value_ptr_ = &(*map_)[key_];
+          if (PROTOBUF_PREDICT_TRUE(map_size != map_->size())) {
+            using T =
+                typename MapIf<ValueTypeHandler::kIsEnum, int*, Value*>::type;
+            ptr = ValueTypeHandler::Read(ptr + 1, ctx,
+                                         reinterpret_cast<T>(value_ptr_));
+            if (PROTOBUF_PREDICT_FALSE(!ptr ||
+                                       !Derived::ValidateValue(value_ptr_))) {
+              map_->erase(key_);  // Failure! Undo insertion.
+              return nullptr;
+            }
+            if (PROTOBUF_PREDICT_TRUE(ctx->Done(&ptr))) return ptr;
+            if (!ptr) return nullptr;
+            NewEntry();
+            ValueMover::Move(value_ptr_, entry_->mutable_value());
+            map_->erase(key_);
+            goto move_key;
+          }
+        } else {
+          if (!ptr) return nullptr;
+        }
+        NewEntry();
+      move_key:
+        KeyMover::Move(&key_, entry_->mutable_key());
+      } else {
+        if (!ptr) return nullptr;
+        NewEntry();
+      }
+      ptr = entry_->_InternalParse(ptr, ctx);
+      if (ptr) UseKeyAndValueFromEntry();
       return ptr;
     }
 
@@ -455,27 +492,13 @@
       // path, so it's not a big deal.
       key_ = entry_->key();
       value_ptr_ = &(*map_)[key_];
-      MoveHelper<ValueTypeHandler::kIsEnum,
-                 ValueTypeHandler::kIsMessage,
-                 ValueTypeHandler::kWireType ==
-                 WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
-                 Value>::Move(entry_->mutable_value(), value_ptr_);
+      ValueMover::Move(entry_->mutable_value(), value_ptr_);
     }
 
     // After reading a key and value successfully, and inserting that data
     // into map_, we are not at the end of the input.  This is unusual, but
     // allowed by the spec.
     bool ReadBeyondKeyValuePair(io::CodedInputStream* input) PROTOBUF_COLD {
-      typedef MoveHelper<KeyTypeHandler::kIsEnum,
-                         KeyTypeHandler::kIsMessage,
-                         KeyTypeHandler::kWireType ==
-                         WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
-                         Key> KeyMover;
-      typedef MoveHelper<ValueTypeHandler::kIsEnum,
-                         ValueTypeHandler::kIsMessage,
-                         ValueTypeHandler::kWireType ==
-                         WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
-                         Value> ValueMover;
       NewEntry();
       ValueMover::Move(value_ptr_, entry_->mutable_value());
       map_->erase(key_);
@@ -485,6 +508,17 @@
       return result;
     }
 
+    typedef MoveHelper<KeyTypeHandler::kIsEnum, KeyTypeHandler::kIsMessage,
+                       KeyTypeHandler::kWireType ==
+                           WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
+                       Key>
+        KeyMover;
+    typedef MoveHelper<ValueTypeHandler::kIsEnum, ValueTypeHandler::kIsMessage,
+                       ValueTypeHandler::kWireType ==
+                           WireFormatLite::WIRETYPE_LENGTH_DELIMITED,
+                       Value>
+        ValueMover;
+
     MapField* const mf_;
     Map* const map_;
     Key key_;
@@ -566,9 +600,7 @@
     typedef void DestructorSkippable_;
   };
 
-  inline Arena* GetArenaNoVirtual() const {
-    return arena_;
-  }
+  inline Arena* GetArenaNoVirtual() const { return arena_; }
 
  public:  // Needed for constructing tables
   KeyOnMemory key_;
@@ -629,7 +661,8 @@
 // type is relatively small and easy to copy then copying Keys into an
 // array of SortItems can be beneficial.  Then all the data the sorting
 // algorithm needs to touch is in that one array.
-template <typename Key, typename PtrToKeyValuePair> struct SortItem {
+template <typename Key, typename PtrToKeyValuePair>
+struct SortItem {
   SortItem() {}
   explicit SortItem(PtrToKeyValuePair p) : first(p->first), second(p) {}
 
@@ -637,16 +670,14 @@
   PtrToKeyValuePair second;
 };
 
-template <typename T> struct CompareByFirstField {
-  bool operator()(const T& a, const T& b) const {
-    return a.first < b.first;
-  }
+template <typename T>
+struct CompareByFirstField {
+  bool operator()(const T& a, const T& b) const { return a.first < b.first; }
 };
 
-template <typename T> struct CompareByDerefFirst {
-  bool operator()(const T& a, const T& b) const {
-    return a->first < b->first;
-  }
+template <typename T>
+struct CompareByDerefFirst {
+  bool operator()(const T& a, const T& b) const { return a->first < b->first; }
 };
 
 // Helper for table driven serialization
diff --git a/src/google/protobuf/map_field.cc b/src/google/protobuf/map_field.cc
index 5ed84f3..2a71b6b 100644
--- a/src/google/protobuf/map_field.cc
+++ b/src/google/protobuf/map_field.cc
@@ -99,35 +99,35 @@
   // acquire here matches with release below to ensure that we can only see a
   // value of CLEAN after all previous changes have been synced.
   switch (state_.load(std::memory_order_acquire)) {
-      case STATE_MODIFIED_MAP:
-        mutex_.Lock();
-        // Double check state, because another thread may have seen the same
-        // state and done the synchronization before the current thread.
-        if (state_.load(std::memory_order_relaxed) == STATE_MODIFIED_MAP) {
-          SyncRepeatedFieldWithMapNoLock();
-          state_.store(CLEAN, std::memory_order_release);
-        }
-        mutex_.Unlock();
-        break;
-      case CLEAN:
-        mutex_.Lock();
-        // Double check state
-        if (state_.load(std::memory_order_relaxed) == CLEAN) {
-          if (repeated_field_ == nullptr) {
-            if (arena_ == nullptr) {
-              repeated_field_ = new RepeatedPtrField<Message>();
-            } else {
-              repeated_field_ =
-                  Arena::CreateMessage<RepeatedPtrField<Message> >(arena_);
-            }
+    case STATE_MODIFIED_MAP:
+      mutex_.Lock();
+      // Double check state, because another thread may have seen the same
+      // state and done the synchronization before the current thread.
+      if (state_.load(std::memory_order_relaxed) == STATE_MODIFIED_MAP) {
+        SyncRepeatedFieldWithMapNoLock();
+        state_.store(CLEAN, std::memory_order_release);
+      }
+      mutex_.Unlock();
+      break;
+    case CLEAN:
+      mutex_.Lock();
+      // Double check state
+      if (state_.load(std::memory_order_relaxed) == CLEAN) {
+        if (repeated_field_ == nullptr) {
+          if (arena_ == nullptr) {
+            repeated_field_ = new RepeatedPtrField<Message>();
+          } else {
+            repeated_field_ =
+                Arena::CreateMessage<RepeatedPtrField<Message> >(arena_);
           }
-          state_.store(CLEAN, std::memory_order_release);
         }
-        mutex_.Unlock();
-        break;
-      default:
-        break;
-    }
+        state_.store(CLEAN, std::memory_order_release);
+      }
+      mutex_.Unlock();
+      break;
+    default:
+      break;
+  }
 }
 
 void MapFieldBase::SyncRepeatedFieldWithMapNoLock() const {
@@ -153,15 +153,12 @@
 
 // ------------------DynamicMapField------------------
 DynamicMapField::DynamicMapField(const Message* default_entry)
-    : default_entry_(default_entry) {
-}
+    : default_entry_(default_entry) {}
 
-DynamicMapField::DynamicMapField(const Message* default_entry,
-                                 Arena* arena)
+DynamicMapField::DynamicMapField(const Message* default_entry, Arena* arena)
     : TypeDefinedMapFieldBase<MapKey, MapValueRef>(arena),
       map_(arena),
-      default_entry_(default_entry) {
-}
+      default_entry_(default_entry) {}
 
 DynamicMapField::~DynamicMapField() {
   // DynamicMapField owns map values. Need to delete them before clearing
@@ -173,9 +170,7 @@
   map_.clear();
 }
 
-int DynamicMapField::size() const {
-  return GetMap().size();
-}
+int DynamicMapField::size() const { return GetMap().size(); }
 
 void DynamicMapField::Clear() {
   Map<MapKey, MapValueRef>* map = &const_cast<DynamicMapField*>(this)->map_;
@@ -193,8 +188,7 @@
   MapFieldBase::SetMapDirty();
 }
 
-bool DynamicMapField::ContainsMapKey(
-    const MapKey& map_key) const {
+bool DynamicMapField::ContainsMapKey(const MapKey& map_key) const {
   const Map<MapKey, MapValueRef>& map = GetMap();
   Map<MapKey, MapValueRef>::const_iterator iter = map.find(map_key);
   return iter != map.end();
@@ -207,12 +201,12 @@
   // Allocate memory for the MapValueRef, and initialize to
   // default value.
   switch (val_des->cpp_type()) {
-#define HANDLE_TYPE(CPPTYPE, TYPE)                      \
-    case FieldDescriptor::CPPTYPE_##CPPTYPE: {          \
-      TYPE* value = new TYPE();                         \
-      map_val->SetValue(value);                          \
-      break;                                            \
-    }
+#define HANDLE_TYPE(CPPTYPE, TYPE)           \
+  case FieldDescriptor::CPPTYPE_##CPPTYPE: { \
+    TYPE* value = new TYPE();                \
+    map_val->SetValue(value);                \
+    break;                                   \
+  }
     HANDLE_TYPE(INT32, int32);
     HANDLE_TYPE(INT64, int64);
     HANDLE_TYPE(UINT32, uint32);
@@ -224,8 +218,8 @@
     HANDLE_TYPE(ENUM, int32);
 #undef HANDLE_TYPE
     case FieldDescriptor::CPPTYPE_MESSAGE: {
-      const Message& message = default_entry_->GetReflection()->GetMessage(
-          *default_entry_, val_des);
+      const Message& message =
+          default_entry_->GetReflection()->GetMessage(*default_entry_, val_des);
       Message* value = message.New();
       map_val->SetValue(value);
       break;
@@ -233,8 +227,8 @@
   }
 }
 
-bool DynamicMapField::InsertOrLookupMapValue(
-    const MapKey& map_key, MapValueRef* val) {
+bool DynamicMapField::InsertOrLookupMapValue(const MapKey& map_key,
+                                             MapValueRef* val) {
   // Always use mutable map because users may change the map value by
   // MapValueRef.
   Map<MapKey, MapValueRef>* map = MutableMap();
@@ -290,8 +284,8 @@
   const DynamicMapField& other_field =
       reinterpret_cast<const DynamicMapField&>(other);
   for (typename Map<MapKey, MapValueRef>::const_iterator other_it =
-           other_field.map_.begin(); other_it != other_field.map_.end();
-       ++other_it) {
+           other_field.map_.begin();
+       other_it != other_field.map_.end(); ++other_it) {
     Map<MapKey, MapValueRef>::iterator iter = map->find(other_it->first);
     MapValueRef* map_val;
     if (iter == map->end()) {
diff --git a/src/google/protobuf/map_field.h b/src/google/protobuf/map_field.h
index c60510e..d804dee 100644
--- a/src/google/protobuf/map_field.h
+++ b/src/google/protobuf/map_field.h
@@ -69,13 +69,9 @@
 class PROTOBUF_EXPORT MapFieldBase {
  public:
   MapFieldBase()
-      : arena_(NULL),
-        repeated_field_(NULL),
-        state_(STATE_MODIFIED_MAP) {}
+      : arena_(NULL), repeated_field_(NULL), state_(STATE_MODIFIED_MAP) {}
   explicit MapFieldBase(Arena* arena)
-      : arena_(arena),
-        repeated_field_(NULL),
-        state_(STATE_MODIFIED_MAP) {
+      : arena_(arena), repeated_field_(NULL), state_(STATE_MODIFIED_MAP) {
     // Mutex's destructor needs to be called explicitly to release resources
     // acquired in its constructor.
     arena->OwnDestructor(&mutex_);
@@ -92,8 +88,8 @@
 
   // Pure virtual map APIs for Map Reflection.
   virtual bool ContainsMapKey(const MapKey& map_key) const = 0;
-  virtual bool InsertOrLookupMapValue(
-      const MapKey& map_key, MapValueRef* val) = 0;
+  virtual bool InsertOrLookupMapValue(const MapKey& map_key,
+                                      MapValueRef* val) = 0;
   // Returns whether changes to the map are reflected in the repeated field.
   bool IsRepeatedFieldValid() const;
   // Insures operations after won't get executed before calling this.
@@ -145,14 +141,15 @@
                                   // synchronized to repeated field
     STATE_MODIFIED_REPEATED = 1,  // repeated field has newly added data that
                                   // has not been synchronized to map
-    CLEAN = 2,  // data in map and repeated field are same
+    CLEAN = 2,                    // data in map and repeated field are same
   };
 
   Arena* arena_;
   mutable RepeatedPtrField<Message>* repeated_field_;
 
-  mutable internal::WrappedMutex mutex_;  // The thread to synchronize map and repeated field
-                         // needs to get lock first;
+  mutable internal::WrappedMutex
+      mutex_;  // The thread to synchronize map and repeated field
+               // needs to get lock first;
   mutable std::atomic<State> state_;
 
  private:
@@ -186,7 +183,7 @@
 
 // This class provides common Map Reflection implementations for generated
 // message and dynamic message.
-template<typename Key, typename T>
+template <typename Key, typename T>
 class TypeDefinedMapFieldBase : public MapFieldBase {
  public:
   TypeDefinedMapFieldBase() {}
@@ -321,7 +318,7 @@
           WireFormatLite::FieldType kKeyFieldType,
           WireFormatLite::FieldType kValueFieldType, int default_enum_value>
 struct MapEntryToMapField<MapEntry<T, Key, Value, kKeyFieldType,
-                                   kValueFieldType, default_enum_value> > {
+                                   kValueFieldType, default_enum_value>> {
   typedef MapField<T, Key, Value, kKeyFieldType, kValueFieldType,
                    default_enum_value>
       MapFieldType;
@@ -363,26 +360,21 @@
 
 }  // namespace internal
 
-#define TYPE_CHECK(EXPECTEDTYPE, METHOD)                        \
-  if (type() != EXPECTEDTYPE) {                                 \
-    GOOGLE_LOG(FATAL)                                                  \
-        << "Protocol Buffer map usage error:\n"                 \
-        << METHOD << " type does not match\n"                   \
-        << "  Expected : "                                      \
-        << FieldDescriptor::CppTypeName(EXPECTEDTYPE) << "\n"   \
-        << "  Actual   : "                                      \
-        << FieldDescriptor::CppTypeName(type());                \
+#define TYPE_CHECK(EXPECTEDTYPE, METHOD)                                   \
+  if (type() != EXPECTEDTYPE) {                                            \
+    GOOGLE_LOG(FATAL) << "Protocol Buffer map usage error:\n"                     \
+               << METHOD << " type does not match\n"                       \
+               << "  Expected : "                                          \
+               << FieldDescriptor::CppTypeName(EXPECTEDTYPE) << "\n"       \
+               << "  Actual   : " << FieldDescriptor::CppTypeName(type()); \
   }
 
 // MapKey is an union type for representing any possible
 // map key.
 class PROTOBUF_EXPORT MapKey {
  public:
-  MapKey() : type_(0) {
-  }
-  MapKey(const MapKey& other) : type_(0) {
-    CopyFrom(other);
-  }
+  MapKey() : type_(0) {}
+  MapKey(const MapKey& other) : type_(0) { CopyFrom(other); }
   MapKey& operator=(const MapKey& other) {
     CopyFrom(other);
     return *this;
@@ -396,10 +388,9 @@
 
   FieldDescriptor::CppType type() const {
     if (type_ == 0) {
-      GOOGLE_LOG(FATAL)
-          << "Protocol Buffer map usage error:\n"
-          << "MapKey::type MapKey is not initialized. "
-          << "Call set methods to initialize MapKey.";
+      GOOGLE_LOG(FATAL) << "Protocol Buffer map usage error:\n"
+                 << "MapKey::type MapKey is not initialized. "
+                 << "Call set methods to initialize MapKey.";
     }
     return (FieldDescriptor::CppType)type_;
   }
@@ -430,33 +421,27 @@
   }
 
   int64 GetInt64Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64,
-               "MapKey::GetInt64Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64, "MapKey::GetInt64Value");
     return val_.int64_value_;
   }
   uint64 GetUInt64Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64,
-               "MapKey::GetUInt64Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64, "MapKey::GetUInt64Value");
     return val_.uint64_value_;
   }
   int32 GetInt32Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32,
-               "MapKey::GetInt32Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32, "MapKey::GetInt32Value");
     return val_.int32_value_;
   }
   uint32 GetUInt32Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32,
-               "MapKey::GetUInt32Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32, "MapKey::GetUInt32Value");
     return val_.uint32_value_;
   }
   bool GetBoolValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL,
-               "MapKey::GetBoolValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL, "MapKey::GetBoolValue");
     return val_.bool_value_;
   }
   const std::string& GetStringValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING,
-               "MapKey::GetStringValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING, "MapKey::GetStringValue");
     return *val_.string_value_;
   }
 
@@ -585,95 +570,77 @@
   MapValueRef() : data_(NULL), type_(0) {}
 
   void SetInt64Value(int64 value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64,
-               "MapValueRef::SetInt64Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64, "MapValueRef::SetInt64Value");
     *reinterpret_cast<int64*>(data_) = value;
   }
   void SetUInt64Value(uint64 value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64,
-               "MapValueRef::SetUInt64Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64, "MapValueRef::SetUInt64Value");
     *reinterpret_cast<uint64*>(data_) = value;
   }
   void SetInt32Value(int32 value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32,
-               "MapValueRef::SetInt32Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32, "MapValueRef::SetInt32Value");
     *reinterpret_cast<int32*>(data_) = value;
   }
   void SetUInt32Value(uint32 value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32,
-               "MapValueRef::SetUInt32Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32, "MapValueRef::SetUInt32Value");
     *reinterpret_cast<uint32*>(data_) = value;
   }
   void SetBoolValue(bool value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL,
-               "MapValueRef::SetBoolValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL, "MapValueRef::SetBoolValue");
     *reinterpret_cast<bool*>(data_) = value;
   }
   // TODO(jieluo) - Checks that enum is member.
   void SetEnumValue(int value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_ENUM,
-               "MapValueRef::SetEnumValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_ENUM, "MapValueRef::SetEnumValue");
     *reinterpret_cast<int*>(data_) = value;
   }
   void SetStringValue(const std::string& value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING,
-               "MapValueRef::SetStringValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING, "MapValueRef::SetStringValue");
     *reinterpret_cast<std::string*>(data_) = value;
   }
   void SetFloatValue(float value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_FLOAT,
-               "MapValueRef::SetFloatValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_FLOAT, "MapValueRef::SetFloatValue");
     *reinterpret_cast<float*>(data_) = value;
   }
   void SetDoubleValue(double value) {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_DOUBLE,
-               "MapValueRef::SetDoubleValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_DOUBLE, "MapValueRef::SetDoubleValue");
     *reinterpret_cast<double*>(data_) = value;
   }
 
   int64 GetInt64Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64,
-               "MapValueRef::GetInt64Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT64, "MapValueRef::GetInt64Value");
     return *reinterpret_cast<int64*>(data_);
   }
   uint64 GetUInt64Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64,
-               "MapValueRef::GetUInt64Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT64, "MapValueRef::GetUInt64Value");
     return *reinterpret_cast<uint64*>(data_);
   }
   int32 GetInt32Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32,
-               "MapValueRef::GetInt32Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_INT32, "MapValueRef::GetInt32Value");
     return *reinterpret_cast<int32*>(data_);
   }
   uint32 GetUInt32Value() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32,
-               "MapValueRef::GetUInt32Value");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_UINT32, "MapValueRef::GetUInt32Value");
     return *reinterpret_cast<uint32*>(data_);
   }
   bool GetBoolValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL,
-               "MapValueRef::GetBoolValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_BOOL, "MapValueRef::GetBoolValue");
     return *reinterpret_cast<bool*>(data_);
   }
   int GetEnumValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_ENUM,
-               "MapValueRef::GetEnumValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_ENUM, "MapValueRef::GetEnumValue");
     return *reinterpret_cast<int*>(data_);
   }
   const std::string& GetStringValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING,
-               "MapValueRef::GetStringValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_STRING, "MapValueRef::GetStringValue");
     return *reinterpret_cast<std::string*>(data_);
   }
   float GetFloatValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_FLOAT,
-               "MapValueRef::GetFloatValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_FLOAT, "MapValueRef::GetFloatValue");
     return *reinterpret_cast<float*>(data_);
   }
   double GetDoubleValue() const {
-    TYPE_CHECK(FieldDescriptor::CPPTYPE_DOUBLE,
-               "MapValueRef::GetDoubleValue");
+    TYPE_CHECK(FieldDescriptor::CPPTYPE_DOUBLE, "MapValueRef::GetDoubleValue");
     return *reinterpret_cast<double*>(data_);
   }
 
@@ -701,21 +668,16 @@
   friend class internal::GeneratedMessageReflection;
   friend class internal::DynamicMapField;
 
-  void SetType(FieldDescriptor::CppType type) {
-    type_ = type;
-  }
+  void SetType(FieldDescriptor::CppType type) { type_ = type; }
 
   FieldDescriptor::CppType type() const {
     if (type_ == 0 || data_ == NULL) {
-      GOOGLE_LOG(FATAL)
-          << "Protocol Buffer map usage error:\n"
-          << "MapValueRef::type MapValueRef is not initialized.";
+      GOOGLE_LOG(FATAL) << "Protocol Buffer map usage error:\n"
+                 << "MapValueRef::type MapValueRef is not initialized.";
     }
     return (FieldDescriptor::CppType)type_;
   }
-  void SetValue(const void* val) {
-    data_ = const_cast<void*>(val);
-  }
+  void SetValue(const void* val) { data_ = const_cast<void*>(val); }
   void CopyFrom(const MapValueRef& other) {
     type_ = other.type_;
     data_ = other.data_;
@@ -764,9 +726,7 @@
     map_->InitializeIterator(this);
     map_->CopyIterator(this, other);
   }
-  ~MapIterator() {
-    map_->DeleteIterator(this);
-  }
+  ~MapIterator() { map_->DeleteIterator(this); }
   MapIterator& operator=(const MapIterator& other) {
     map_ = other.map_;
     map_->CopyIterator(this, other);
@@ -789,12 +749,8 @@
     map_->IncreaseIterator(this);
     return *this;
   }
-  const MapKey& GetKey() {
-    return key_;
-  }
-  const MapValueRef& GetValueRef() {
-    return value_;
-  }
+  const MapKey& GetKey() { return key_; }
+  const MapValueRef& GetValueRef() { return value_; }
   MapValueRef* MutableValueRef() {
     map_->SetMapDirty();
     return &value_;
diff --git a/src/google/protobuf/map_field_inl.h b/src/google/protobuf/map_field_inl.h
index 85d5b03..7baaa5f 100644
--- a/src/google/protobuf/map_field_inl.h
+++ b/src/google/protobuf/map_field_inl.h
@@ -46,25 +46,25 @@
 namespace protobuf {
 namespace internal {
 // UnwrapMapKey template
-template<typename T>
+template <typename T>
 T UnwrapMapKey(const MapKey& map_key);
-template<>
+template <>
 inline int32 UnwrapMapKey<int32>(const MapKey& map_key) {
   return map_key.GetInt32Value();
 }
-template<>
+template <>
 inline uint32 UnwrapMapKey<uint32>(const MapKey& map_key) {
   return map_key.GetUInt32Value();
 }
-template<>
+template <>
 inline int64 UnwrapMapKey<int64>(const MapKey& map_key) {
   return map_key.GetInt64Value();
 }
-template<>
+template <>
 inline uint64 UnwrapMapKey<uint64>(const MapKey& map_key) {
   return map_key.GetUInt64Value();
 }
-template<>
+template <>
 inline bool UnwrapMapKey<bool>(const MapKey& map_key) {
   return map_key.GetBoolValue();
 }
@@ -74,25 +74,25 @@
 }
 
 // SetMapKey template
-template<typename T>
+template <typename T>
 inline void SetMapKey(MapKey* map_key, const T& value);
-template<>
+template <>
 inline void SetMapKey<int32>(MapKey* map_key, const int32& value) {
   map_key->SetInt32Value(value);
 }
-template<>
+template <>
 inline void SetMapKey<uint32>(MapKey* map_key, const uint32& value) {
   map_key->SetUInt32Value(value);
 }
-template<>
+template <>
 inline void SetMapKey<int64>(MapKey* map_key, const int64& value) {
   map_key->SetInt64Value(value);
 }
-template<>
+template <>
 inline void SetMapKey<uint64>(MapKey* map_key, const uint64& value) {
   map_key->SetUInt64Value(value);
 }
-template<>
+template <>
 inline void SetMapKey<bool>(MapKey* map_key, const bool& value) {
   map_key->SetBoolValue(value);
 }
@@ -106,7 +106,7 @@
 typename Map<Key, T>::const_iterator&
 TypeDefinedMapFieldBase<Key, T>::InternalGetIterator(
     const MapIterator* map_iter) const {
-  return *reinterpret_cast<typename Map<Key, T>::const_iterator *>(
+  return *reinterpret_cast<typename Map<Key, T>::const_iterator*>(
       map_iter->iter_);
 }
 
@@ -122,15 +122,14 @@
 }
 
 template <typename Key, typename T>
-bool TypeDefinedMapFieldBase<Key, T>::EqualIterator(const MapIterator& a,
-                                                    const MapIterator& b)
-    const {
+bool TypeDefinedMapFieldBase<Key, T>::EqualIterator(
+    const MapIterator& a, const MapIterator& b) const {
   return InternalGetIterator(&a) == InternalGetIterator(&b);
 }
 
 template <typename Key, typename T>
-void TypeDefinedMapFieldBase<Key, T>::IncreaseIterator(MapIterator* map_iter)
-    const {
+void TypeDefinedMapFieldBase<Key, T>::IncreaseIterator(
+    MapIterator* map_iter) const {
   ++InternalGetIterator(map_iter);
   SetMapIteratorValue(map_iter);
 }
@@ -143,16 +142,15 @@
 }
 
 template <typename Key, typename T>
-void TypeDefinedMapFieldBase<Key, T>::DeleteIterator(MapIterator* map_iter)
-    const {
-  delete reinterpret_cast<typename Map<Key, T>::const_iterator *>(
+void TypeDefinedMapFieldBase<Key, T>::DeleteIterator(
+    MapIterator* map_iter) const {
+  delete reinterpret_cast<typename Map<Key, T>::const_iterator*>(
       map_iter->iter_);
 }
 
 template <typename Key, typename T>
 void TypeDefinedMapFieldBase<Key, T>::CopyIterator(
-    MapIterator* this_iter,
-    const MapIterator& that_iter) const {
+    MapIterator* this_iter, const MapIterator& that_iter) const {
   InternalGetIterator(this_iter) = InternalGetIterator(&that_iter);
   this_iter->key_.SetType(that_iter.key_.type());
   // MapValueRef::type() fails when containing data is null. However, if
@@ -301,8 +299,8 @@
   // know that this MapEntry default_type has also already been constructed.
   // So it's safe to just call internal_default_instance().
   const Message* default_entry = Derived::internal_default_instance();
-  for (typename Map<Key, T>::const_iterator it = map.begin();
-       it != map.end(); ++it) {
+  for (typename Map<Key, T>::const_iterator it = map.begin(); it != map.end();
+       ++it) {
     EntryType* new_entry =
         down_cast<EntryType*>(default_entry->New(this->MapFieldBase::arena_));
     repeated_field->AddAllocated(new_entry);
@@ -323,7 +321,8 @@
   GOOGLE_CHECK(this->MapFieldBase::repeated_field_ != NULL);
   map->clear();
   for (typename RepeatedPtrField<EntryType>::iterator it =
-           repeated_field->begin(); it != repeated_field->end(); ++it) {
+           repeated_field->begin();
+       it != repeated_field->end(); ++it) {
     // Cast is needed because Map's api and internal storage is different when
     // value is enum. For enum, we cannot cast an int to enum. Thus, we have to
     // copy value. For other types, they have same exposed api type and internal
diff --git a/src/google/protobuf/map_field_lite.h b/src/google/protobuf/map_field_lite.h
index bef2140..180a788 100644
--- a/src/google/protobuf/map_field_lite.h
+++ b/src/google/protobuf/map_field_lite.h
@@ -176,7 +176,7 @@
           WireFormatLite::FieldType kKeyFieldType,
           WireFormatLite::FieldType kValueFieldType, int default_enum_value>
 struct MapEntryToMapField<MapEntryLite<T, Key, Value, kKeyFieldType,
-                                       kValueFieldType, default_enum_value> > {
+                                       kValueFieldType, default_enum_value>> {
   typedef MapFieldLite<MapEntryLite<T, Key, Value, kKeyFieldType,
                                     kValueFieldType, default_enum_value>,
                        Key, Value, kKeyFieldType, kValueFieldType,
diff --git a/src/google/protobuf/map_field_test.cc b/src/google/protobuf/map_field_test.cc
index ecb25f4..5c44070 100644
--- a/src/google/protobuf/map_field_test.cc
+++ b/src/google/protobuf/map_field_test.cc
@@ -65,9 +65,7 @@
     MapFieldBase::SyncMapWithRepeatedField();
   }
   // Get underlined repeated field without synchronizing map.
-  RepeatedPtrField<Message>* InternalRepeatedField() {
-    return repeated_field_;
-  }
+  RepeatedPtrField<Message>* InternalRepeatedField() { return repeated_field_; }
   bool IsMapClean() {
     return state_.load(std::memory_order_relaxed) != STATE_MODIFIED_MAP;
   }
@@ -80,15 +78,11 @@
   void SetRepeatedDirty() {
     state_.store(STATE_MODIFIED_REPEATED, std::memory_order_relaxed);
   }
-  bool ContainsMapKey(const MapKey& map_key) const {
-    return false;
-  }
+  bool ContainsMapKey(const MapKey& map_key) const { return false; }
   bool InsertOrLookupMapValue(const MapKey& map_key, MapValueRef* val) {
     return false;
   }
-  bool DeleteMapValue(const MapKey& map_key) {
-    return false;
-  }
+  bool DeleteMapValue(const MapKey& map_key) { return false; }
   bool EqualIterator(const MapIterator& a, const MapIterator& b) const {
     return false;
   }
@@ -210,8 +204,7 @@
 enum State { CLEAN, MAP_DIRTY, REPEATED_DIRTY };
 }  // anonymous namespace
 
-class MapFieldStateTest
-    : public testing::TestWithParam<State> {
+class MapFieldStateTest : public testing::TestWithParam<State> {
  public:
  protected:
   typedef unittest::TestMap_MapInt32Int32Entry_DoNotUse EntryType;
diff --git a/src/google/protobuf/map_test.cc b/src/google/protobuf/map_test.cc
index 137a4d8..ec13b3c 100644
--- a/src/google/protobuf/map_test.cc
+++ b/src/google/protobuf/map_test.cc
@@ -132,9 +132,9 @@
     Map<int32, int32>::iterator it = map_.find(key);
 
     // iterator dereferenceable
-    EXPECT_EQ(key,   (*it).first);
+    EXPECT_EQ(key, (*it).first);
     EXPECT_EQ(value, (*it).second);
-    EXPECT_EQ(key,   it->first);
+    EXPECT_EQ(key, it->first);
     EXPECT_EQ(value, it->second);
 
     // iterator mutable
@@ -244,13 +244,9 @@
   EXPECT_EQ("abc", to.GetStringValue());
 }
 
-TEST_F(MapImplTest, CountNonExist) {
-  EXPECT_EQ(0, map_.count(0));
-}
+TEST_F(MapImplTest, CountNonExist) { EXPECT_EQ(0, map_.count(0)); }
 
-TEST_F(MapImplTest, ContainNotExist) {
-  EXPECT_FALSE(map_.contains(0));
-}
+TEST_F(MapImplTest, ContainNotExist) { EXPECT_FALSE(map_.contains(0)); }
 
 TEST_F(MapImplTest, ImmutableContainNotExist) {
   EXPECT_FALSE(const_map_.contains(0));
@@ -433,8 +429,7 @@
 }
 
 template <typename T, typename U>
-static void TestValidityForAllKeysExcept(int key_to_avoid,
-                                         const T& check_map,
+static void TestValidityForAllKeysExcept(int key_to_avoid, const T& check_map,
                                          const U& map) {
   typedef typename U::value_type value_type;  // a key-value pair
   for (typename U::const_iterator it = map.begin(); it != map.end(); ++it) {
@@ -466,7 +461,8 @@
 static void TestOldVersusNewIterator(int skip, Map<int, int>* m) {
   const int initial_size = m->size();
   IteratorType it = m->begin();
-  for (int i = 0; i < skip && it != m->end(); it++, i++) {}
+  for (int i = 0; i < skip && it != m->end(); it++, i++) {
+  }
   if (it == m->end()) return;
   const IteratorType old = it;
   GOOGLE_LOG(INFO) << "skip=" << skip << ", old->first=" << old->first;
@@ -633,8 +629,9 @@
 TEST_F(MapImplTest, IteratorCategory) {
   EXPECT_TRUE(IsForwardIteratorHelper(
       std::iterator_traits<Map<int, int>::iterator>::iterator_category()));
-  EXPECT_TRUE(IsForwardIteratorHelper(std::iterator_traits<
-      Map<int, int>::const_iterator>::iterator_category()));
+  EXPECT_TRUE(IsForwardIteratorHelper(
+      std::iterator_traits<
+          Map<int, int>::const_iterator>::iterator_category()));
 }
 
 TEST_F(MapImplTest, InsertSingle) {
@@ -948,11 +945,10 @@
   another[9398] = 41999;
   another[8070] = 42056;
   another.swap(map_);
-  EXPECT_THAT(another, testing::UnorderedElementsAre(
-      testing::Pair(9398, 41999)));
-  EXPECT_THAT(map_, testing::UnorderedElementsAre(
-      testing::Pair(8070, 42056),
-      testing::Pair(9398, 41999)));
+  EXPECT_THAT(another,
+              testing::UnorderedElementsAre(testing::Pair(9398, 41999)));
+  EXPECT_THAT(map_, testing::UnorderedElementsAre(testing::Pair(8070, 42056),
+                                                  testing::Pair(9398, 41999)));
 }
 
 TEST_F(MapImplTest, SwapArena) {
@@ -965,23 +961,18 @@
   m2[10244] = 10247;
   m2[8070] = 42056;
   m1.swap(map_);
-  EXPECT_THAT(m1, testing::UnorderedElementsAre(
-      testing::Pair(9398, 41999)));
-  EXPECT_THAT(map_, testing::UnorderedElementsAre(
-      testing::Pair(8070, 42056),
-      testing::Pair(9398, 41999)));
+  EXPECT_THAT(m1, testing::UnorderedElementsAre(testing::Pair(9398, 41999)));
+  EXPECT_THAT(map_, testing::UnorderedElementsAre(testing::Pair(8070, 42056),
+                                                  testing::Pair(9398, 41999)));
   m2.swap(m1);
-  EXPECT_THAT(m1, testing::UnorderedElementsAre(
-      testing::Pair(8070, 42056),
-      testing::Pair(10244, 10247)));
-  EXPECT_THAT(m2, testing::UnorderedElementsAre(
-      testing::Pair(9398, 41999)));
+  EXPECT_THAT(m1, testing::UnorderedElementsAre(testing::Pair(8070, 42056),
+                                                testing::Pair(10244, 10247)));
+  EXPECT_THAT(m2, testing::UnorderedElementsAre(testing::Pair(9398, 41999)));
 }
 
 TEST_F(MapImplTest, CopyAssignMapIterator) {
   TestMap message;
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.SetMapFieldsViaMapReflection(&message);
   MapIterator it1 = reflection_tester.MapBegin(&message, "map_int32_int32");
   MapIterator it2 = reflection_tester.MapEnd(&message, "map_int32_int32");
@@ -991,9 +982,7 @@
 
 // Map Field Reflection Test ========================================
 
-static int Func(int i, int j) {
-  return i * j;
-}
+static int Func(int i, int j) { return i * j; }
 
 static std::string StrFunc(int i, int j) {
   std::string str;
@@ -1070,10 +1059,8 @@
       refl->GetRepeatedPtrField<Message>(message, fd_map_int32_double);
   const RepeatedPtrField<Message>& mf_string_string =
       refl->GetRepeatedPtrField<Message>(message, fd_map_string_string);
-  const RepeatedPtrField<Message>&
-      mf_int32_foreign_message =
-          refl->GetRepeatedPtrField<Message>(
-              message, fd_map_int32_foreign_message);
+  const RepeatedPtrField<Message>& mf_int32_foreign_message =
+      refl->GetRepeatedPtrField<Message>(message, fd_map_int32_foreign_message);
 
   // Get mutable RepeatedPtrField objects for all fields of interest.
   RepeatedPtrField<Message>* mmf_int32_int32 =
@@ -1083,8 +1070,8 @@
   RepeatedPtrField<Message>* mmf_string_string =
       refl->MutableRepeatedPtrField<Message>(&message, fd_map_string_string);
   RepeatedPtrField<Message>* mmf_int32_foreign_message =
-      refl->MutableRepeatedPtrField<Message>(
-          &message, fd_map_int32_foreign_message);
+      refl->MutableRepeatedPtrField<Message>(&message,
+                                             fd_map_int32_foreign_message);
 
   // Make sure we can do gets through the RepeatedPtrField objects.
   for (int i = 0; i < 10; ++i) {
@@ -1119,9 +1106,8 @@
           message_int32_message, fd_map_int32_foreign_message_key);
       const ForeignMessage& value_int32_message =
           down_cast<const ForeignMessage&>(
-              message_int32_message.GetReflection()
-                  ->GetMessage(message_int32_message,
-                               fd_map_int32_foreign_message_value));
+              message_int32_message.GetReflection()->GetMessage(
+                  message_int32_message, fd_map_int32_foreign_message_value));
       EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
     }
 
@@ -1156,9 +1142,8 @@
           message_int32_message, fd_map_int32_foreign_message_key);
       const ForeignMessage& value_int32_message =
           down_cast<const ForeignMessage&>(
-              message_int32_message.GetReflection()
-                  ->GetMessage(message_int32_message,
-                               fd_map_int32_foreign_message_value));
+              message_int32_message.GetReflection()->GetMessage(
+                  message_int32_message, fd_map_int32_foreign_message_value));
       EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
     }
   }
@@ -1193,9 +1178,8 @@
           message_int32_message->GetReflection()->GetInt32(
               *message_int32_message, fd_map_int32_foreign_message_key);
       ForeignMessage* value_int32_message = down_cast<ForeignMessage*>(
-          message_int32_message->GetReflection()
-              ->MutableMessage(message_int32_message,
-                               fd_map_int32_foreign_message_value));
+          message_int32_message->GetReflection()->MutableMessage(
+              message_int32_message, fd_map_int32_foreign_message_value));
       value_int32_message->set_c(Func(key_int32_message, -6));
     }
   }
@@ -1272,10 +1256,9 @@
       refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_int32_double);
   const MutableRepeatedFieldRef<Message> mmf_string_string =
       refl->GetMutableRepeatedFieldRef<Message>(&message, fd_map_string_string);
-  const MutableRepeatedFieldRef<Message>
-      mmf_int32_foreign_message =
-          refl->GetMutableRepeatedFieldRef<Message>(
-              &message, fd_map_int32_foreign_message);
+  const MutableRepeatedFieldRef<Message> mmf_int32_foreign_message =
+      refl->GetMutableRepeatedFieldRef<Message>(&message,
+                                                fd_map_int32_foreign_message);
 
   // Get entry default instances
   std::unique_ptr<Message> entry_int32_int32(
@@ -1350,9 +1333,8 @@
           message_int32_message, fd_map_int32_foreign_message_key);
       const ForeignMessage& value_int32_message =
           down_cast<const ForeignMessage&>(
-              message_int32_message.GetReflection()
-                  ->GetMessage(message_int32_message,
-                               fd_map_int32_foreign_message_value));
+              message_int32_message.GetReflection()->GetMessage(
+                  message_int32_message, fd_map_int32_foreign_message_value));
       EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
     }
 
@@ -1391,9 +1373,8 @@
           message_int32_message, fd_map_int32_foreign_message_key);
       const ForeignMessage& value_int32_message =
           down_cast<const ForeignMessage&>(
-              message_int32_message.GetReflection()
-                  ->GetMessage(message_int32_message,
-                               fd_map_int32_foreign_message_value));
+              message_int32_message.GetReflection()->GetMessage(
+                  message_int32_message, fd_map_int32_foreign_message_value));
       EXPECT_EQ(value_int32_message.c(), Func(key_int32_message, 6));
     }
   }
@@ -1518,9 +1499,9 @@
       const Message& message = *it;
       int32 key = message.GetReflection()->GetInt32(
           message, fd_map_int32_foreign_message_key);
-      const ForeignMessage& sub_message = down_cast<const ForeignMessage&>(
-          message.GetReflection()
-              ->GetMessage(message, fd_map_int32_foreign_message_value));
+      const ForeignMessage& sub_message =
+          down_cast<const ForeignMessage&>(message.GetReflection()->GetMessage(
+              message, fd_map_int32_foreign_message_value));
       result[key].MergeFrom(sub_message);
       ++index;
     }
@@ -1552,8 +1533,8 @@
   EXPECT_EQ(1234.0, message.map_int32_double().at(4321));
 
   entry_string_string->GetReflection()->SetString(
-      entry_string_string.get(),
-      fd_map_string_string->message_type()->field(0), "4321");
+      entry_string_string.get(), fd_map_string_string->message_type()->field(0),
+      "4321");
   entry_string_string->GetReflection()->SetString(
       entry_string_string.get(), fd_map_string_string->message_type()->field(1),
       "1234");
@@ -1575,12 +1556,13 @@
   EXPECT_EQ(1234, message.map_int32_foreign_message().at(4321).c());
 
   // Test Reflection::AddAllocatedMessage
-  Message* free_entry_string_string = MessageFactory::generated_factory()
-      ->GetPrototype(fd_map_string_string->message_type())
-      ->New();
+  Message* free_entry_string_string =
+      MessageFactory::generated_factory()
+          ->GetPrototype(fd_map_string_string->message_type())
+          ->New();
   entry_string_string->GetReflection()->SetString(
-      free_entry_string_string,
-      fd_map_string_string->message_type()->field(0), "4321");
+      free_entry_string_string, fd_map_string_string->message_type()->field(0),
+      "4321");
   entry_string_string->GetReflection()->SetString(
       free_entry_string_string, fd_map_string_string->message_type()->field(1),
       "1234");
@@ -1672,30 +1654,30 @@
   {
     const Message& message0a =
         mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get());
-    const ForeignMessage& sub_message0a = down_cast<const ForeignMessage&>(
-        message0a.GetReflection()
-            ->GetMessage(message0a, fd_map_int32_foreign_message_value));
+    const ForeignMessage& sub_message0a =
+        down_cast<const ForeignMessage&>(message0a.GetReflection()->GetMessage(
+            message0a, fd_map_int32_foreign_message_value));
     int32 int32_value0a = sub_message0a.c();
     const Message& message9a =
         mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get());
-    const ForeignMessage& sub_message9a = down_cast<const ForeignMessage&>(
-        message9a.GetReflection()
-            ->GetMessage(message9a, fd_map_int32_foreign_message_value));
+    const ForeignMessage& sub_message9a =
+        down_cast<const ForeignMessage&>(message9a.GetReflection()->GetMessage(
+            message9a, fd_map_int32_foreign_message_value));
     int32 int32_value9a = sub_message9a.c();
 
     mmf_int32_foreign_message.SwapElements(0, 9);
 
     const Message& message0b =
         mmf_int32_foreign_message.Get(0, entry_int32_foreign_message.get());
-    const ForeignMessage& sub_message0b = down_cast<const ForeignMessage&>(
-        message0b.GetReflection()
-            ->GetMessage(message0b, fd_map_int32_foreign_message_value));
+    const ForeignMessage& sub_message0b =
+        down_cast<const ForeignMessage&>(message0b.GetReflection()->GetMessage(
+            message0b, fd_map_int32_foreign_message_value));
     int32 int32_value0b = sub_message0b.c();
     const Message& message9b =
         mmf_int32_foreign_message.Get(9, entry_int32_foreign_message.get());
-    const ForeignMessage& sub_message9b = down_cast<const ForeignMessage&>(
-        message9b.GetReflection()
-            ->GetMessage(message9b, fd_map_int32_foreign_message_value));
+    const ForeignMessage& sub_message9b =
+        down_cast<const ForeignMessage&>(message9b.GetReflection()->GetMessage(
+            message9b, fd_map_int32_foreign_message_value));
     int32 int32_value9b = sub_message9b.c();
 
     EXPECT_EQ(int32_value9a, int32_value0b);
@@ -1734,34 +1716,26 @@
   const FieldDescriptor* fd_map_int32_foreign_message =
       desc->FindFieldByName("map_int32_foreign_message");
 
-    // Get MutableRepeatedFieldRef objects for all fields of interest.
+  // Get MutableRepeatedFieldRef objects for all fields of interest.
   const MutableRepeatedFieldRef<Message> mmf_int32_int32 =
-      refl->GetMutableRepeatedFieldRef<Message>(
-          &m0, fd_map_int32_int32);
+      refl->GetMutableRepeatedFieldRef<Message>(&m0, fd_map_int32_int32);
   const MutableRepeatedFieldRef<Message> mmf_int32_double =
-      refl->GetMutableRepeatedFieldRef<Message>(
-          &m0, fd_map_int32_double);
+      refl->GetMutableRepeatedFieldRef<Message>(&m0, fd_map_int32_double);
   const MutableRepeatedFieldRef<Message> mmf_string_string =
-      refl->GetMutableRepeatedFieldRef<Message>(
-          &m0, fd_map_string_string);
-  const MutableRepeatedFieldRef<Message>
-      mmf_int32_foreign_message =
-          refl->GetMutableRepeatedFieldRef<Message>(
-              &m0, fd_map_int32_foreign_message);
+      refl->GetMutableRepeatedFieldRef<Message>(&m0, fd_map_string_string);
+  const MutableRepeatedFieldRef<Message> mmf_int32_foreign_message =
+      refl->GetMutableRepeatedFieldRef<Message>(&m0,
+                                                fd_map_int32_foreign_message);
 
   // Test MutableRepeatedRef::CopyFrom
   mmf_int32_int32.CopyFrom(
-      refl->GetRepeatedFieldRef<Message>(
-          m1, fd_map_int32_int32));
+      refl->GetRepeatedFieldRef<Message>(m1, fd_map_int32_int32));
   mmf_int32_double.CopyFrom(
-      refl->GetRepeatedFieldRef<Message>(
-          m1, fd_map_int32_double));
+      refl->GetRepeatedFieldRef<Message>(m1, fd_map_int32_double));
   mmf_string_string.CopyFrom(
-      refl->GetRepeatedFieldRef<Message>(
-          m1, fd_map_string_string));
+      refl->GetRepeatedFieldRef<Message>(m1, fd_map_string_string));
   mmf_int32_foreign_message.CopyFrom(
-      refl->GetRepeatedFieldRef<Message>(
-          m1, fd_map_int32_foreign_message));
+      refl->GetRepeatedFieldRef<Message>(m1, fd_map_int32_foreign_message));
 
   for (int i = 0; i < 10; ++i) {
     EXPECT_EQ(Func(i, 11), m0.map_int32_int32().at(i + 10));
@@ -1772,17 +1746,13 @@
 
   // Test MutableRepeatedRef::MergeFrom
   mmf_int32_int32.MergeFrom(
-      refl->GetRepeatedFieldRef<Message>(
-          m2, fd_map_int32_int32));
+      refl->GetRepeatedFieldRef<Message>(m2, fd_map_int32_int32));
   mmf_int32_double.MergeFrom(
-      refl->GetRepeatedFieldRef<Message>(
-          m2, fd_map_int32_double));
+      refl->GetRepeatedFieldRef<Message>(m2, fd_map_int32_double));
   mmf_string_string.MergeFrom(
-      refl->GetRepeatedFieldRef<Message>(
-          m2, fd_map_string_string));
+      refl->GetRepeatedFieldRef<Message>(m2, fd_map_string_string));
   mmf_int32_foreign_message.MergeFrom(
-      refl->GetRepeatedFieldRef<Message>(
-          m2, fd_map_int32_foreign_message));
+      refl->GetRepeatedFieldRef<Message>(m2, fd_map_int32_foreign_message));
   for (int i = 0; i < 10; ++i) {
     EXPECT_EQ(Func(i, 21), m0.map_int32_int32().at(i + 20));
     EXPECT_EQ(Func(i, 22), m0.map_int32_double().at(i + 20));
@@ -1793,17 +1763,13 @@
   // Test MutableRepeatedRef::Swap
   // Swap between m0 and m2.
   mmf_int32_int32.Swap(
-      refl->GetMutableRepeatedFieldRef<Message>(
-          &m2, fd_map_int32_int32));
+      refl->GetMutableRepeatedFieldRef<Message>(&m2, fd_map_int32_int32));
   mmf_int32_double.Swap(
-      refl->GetMutableRepeatedFieldRef<Message>(
-          &m2, fd_map_int32_double));
+      refl->GetMutableRepeatedFieldRef<Message>(&m2, fd_map_int32_double));
   mmf_string_string.Swap(
-      refl->GetMutableRepeatedFieldRef<Message>(
-          &m2, fd_map_string_string));
-  mmf_int32_foreign_message.Swap(
-      refl->GetMutableRepeatedFieldRef<Message>(
-          &m2, fd_map_int32_foreign_message));
+      refl->GetMutableRepeatedFieldRef<Message>(&m2, fd_map_string_string));
+  mmf_int32_foreign_message.Swap(refl->GetMutableRepeatedFieldRef<Message>(
+      &m2, fd_map_int32_foreign_message));
   for (int i = 0; i < 10; ++i) {
     // Check the content of m0.
     EXPECT_EQ(Func(i, 21), m0.map_int32_int32().at(i + 20));
@@ -2015,10 +1981,8 @@
   // Construct a new version of the dynamic message via the factory.
   DynamicMessageFactory factory;
   std::unique_ptr<Message> message1;
-  message1.reset(
-      factory.GetPrototype(unittest::TestMap::descriptor())->New());
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  message1.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.SetMapFieldsViaReflection(message1.get());
   reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
   reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
@@ -2032,10 +1996,8 @@
   // Construct a new version of the dynamic message via the factory.
   DynamicMessageFactory factory;
   std::unique_ptr<Message> message1;
-  message1.reset(
-      factory.GetPrototype(unittest::TestMap::descriptor())->New());
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  message1.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.SetMapFieldsViaMapReflection(message1.get());
   reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
   reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
@@ -2047,23 +2009,19 @@
   // Construct two dynamic message and sets via map reflection.
   DynamicMessageFactory factory;
   std::unique_ptr<Message> message1;
-  message1.reset(
-      factory.GetPrototype(unittest::TestMap::descriptor())->New());
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  message1.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.SetMapFieldsViaMapReflection(message1.get());
 
   // message2 is created by same factory.
   std::unique_ptr<Message> message2;
-  message2.reset(
-      factory.GetPrototype(unittest::TestMap::descriptor())->New());
+  message2.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
   reflection_tester.SetMapFieldsViaMapReflection(message2.get());
 
   // message3 is created by different factory.
   DynamicMessageFactory factory3;
   std::unique_ptr<Message> message3;
-  message3.reset(
-      factory3.GetPrototype(unittest::TestMap::descriptor())->New());
+  message3.reset(factory3.GetPrototype(unittest::TestMap::descriptor())->New());
   reflection_tester.SetMapFieldsViaMapReflection(message3.get());
 
   message2->MergeFrom(*message1);
@@ -2087,27 +2045,23 @@
   // Construct a new version of the dynamic message via the factory.
   DynamicMessageFactory factory;
   std::unique_ptr<Message> message1;
-  message1.reset(
-      factory.GetPrototype(unittest::TestMap::descriptor())->New());
+  message1.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
 
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   message1->MergeFrom(message2);
   reflection_tester.ExpectMapFieldsSetViaReflection(*message1);
   reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
 }
 
 TEST(GeneratedMapFieldTest, DynamicMessageCopyFromMapReflection) {
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   unittest::TestMap message2;
   reflection_tester.SetMapFieldsViaMapReflection(&message2);
 
   // Construct a dynamic message via the factory.
   DynamicMessageFactory factory;
   std::unique_ptr<Message> message1;
-  message1.reset(
-      factory.GetPrototype(unittest::TestMap::descriptor())->New());
+  message1.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
 
   message1->MergeFrom(message2);
   reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message1.get());
@@ -2116,12 +2070,10 @@
 
 TEST(GeneratedMapFieldTest, SyncDynamicMapWithRepeatedField) {
   // Construct a dynamic message via the factory.
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   DynamicMessageFactory factory;
   std::unique_ptr<Message> message;
-  message.reset(
-      factory.GetPrototype(unittest::TestMap::descriptor())->New());
+  message.reset(factory.GetPrototype(unittest::TestMap::descriptor())->New());
   reflection_tester.SetMapFieldsViaReflection(message.get());
   reflection_tester.ExpectMapFieldsSetViaReflectionIterator(message.get());
   reflection_tester.ExpectMapFieldsSetViaReflection(*message);
@@ -2336,8 +2288,8 @@
       for (int k = i, j = 0; j < items; j++, k >>= kBitsOfIPerItem) {
         bool is_key = k & 0x1;
         bool is_value = !is_key && (k & 0x2);
-        wire_format.push_back(is_key ? kKeyTag :
-                              is_value ? kValueTag : kJunkTag);
+        wire_format.push_back(is_key ? kKeyTag
+                                     : is_value ? kValueTag : kJunkTag);
         char c = static_cast<char>(k & mask) >> 2;  // One char after the tag.
         wire_format.push_back(c);
         if (is_key) expected_key = static_cast<int>(c);
@@ -2499,10 +2451,10 @@
   EXPECT_EQ(99, map_message.map_field().find(key)->second.dummy5());
 
   // Test key then value then value then key.
-  s.push_back(s[2]);       // Copy the key's tag.
+  s.push_back(s[2]);  // Copy the key's tag.
   key = 19;
-  s.push_back(key);        // Second key is 19 instead of 0.
-  s[1] += 2;               // Adjust encoded size.
+  s.push_back(key);  // Second key is 19 instead of 0.
+  s[1] += 2;         // Adjust encoded size.
   ASSERT_TRUE(map_message.ParseFromString(s));
   ASSERT_EQ(1, map_message.map_field().size());
   ASSERT_EQ(1, map_message.map_field().count(key));
@@ -2517,8 +2469,7 @@
 
 TEST(GeneratedMapFieldReflectionTest, SpaceUsed) {
   unittest::TestMap message;
-  MapReflectionTester reflection_tester(
-    unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.SetMapFieldsViaReflection(&message);
 
   EXPECT_LT(0, message.GetReflection()->SpaceUsed(message));
@@ -2528,8 +2479,7 @@
   // Set every field to a unique value then go back and check all those
   // values.
   unittest::TestMap message;
-  MapReflectionTester reflection_tester(
-    unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.SetMapFieldsViaReflection(&message);
   MapTestUtil::ExpectMapFieldsSet(message);
   reflection_tester.ExpectMapFieldsSetViaReflection(message);
@@ -2587,8 +2537,7 @@
   MapTestUtil::SetMapFields(&message);
   MapTestUtil::ExpectMapFieldsSet(message);
 
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.ClearMapFieldsViaReflection(&message);
   reflection_tester.ExpectClearViaReflection(message);
   reflection_tester.ExpectClearViaReflectionIterator(&message);
@@ -2596,8 +2545,7 @@
 
 TEST(GeneratedMapFieldReflectionTest, RemoveLast) {
   unittest::TestMap message;
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
 
   MapTestUtil::SetMapFields(&message);
   MapTestUtil::ExpectMapsSize(message, 2);
@@ -2644,8 +2592,7 @@
 
 TEST(GeneratedMapFieldReflectionTest, SwapElements) {
   unittest::TestMap message;
-  MapReflectionTester reflection_tester(
-    unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
 
   MapTestUtil::SetMapFields(&message);
 
@@ -2684,8 +2631,7 @@
 
 TEST(GeneratedMapFieldReflectionTest, MutableUnknownFields) {
   unittest::TestMap message;
-  MapReflectionTester reflection_tester(
-    unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.MutableUnknownFieldsOfMapFieldsViaReflection(&message);
 }
 
@@ -2740,8 +2686,7 @@
 
 TEST(GeneratedMapFieldReflectionTest, MapEntryClear) {
   unittest::TestMap message;
-  MapReflectionTester reflection_tester(
-    unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.MutableUnknownFieldsOfMapFieldsViaReflection(&message);
 }
 
@@ -2762,8 +2707,7 @@
 
 TEST(GeneratedMapFieldReflectionTest, SetViaMapReflection) {
   unittest::TestMap message;
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.SetMapFieldsViaMapReflection(&message);
   reflection_tester.ExpectMapFieldsSetViaReflection(message);
   reflection_tester.ExpectMapFieldsSetViaReflectionIterator(&message);
@@ -2783,8 +2727,7 @@
       : pool_(DescriptorPool::generated_pool()), factory_(pool_) {}
 
   virtual void SetUp() {
-    map_descriptor_ =
-      pool_->FindMessageTypeByName("protobuf_unittest.TestMap");
+    map_descriptor_ = pool_->FindMessageTypeByName("protobuf_unittest.TestMap");
     recursive_map_descriptor_ =
         pool_->FindMessageTypeByName("protobuf_unittest.TestRecursiveMapMessage");
     ASSERT_TRUE(map_descriptor_ != NULL);
@@ -2952,15 +2895,15 @@
   MapTestUtil::SetMapFields(&message);
 
   // Set some unknown fields in message.
-  message.GetReflection()->MutableUnknownFields(&message)->
-      AddVarint(123456, 654321);
+  message.GetReflection()->MutableUnknownFields(&message)->AddVarint(123456,
+                                                                     654321);
 
   // Discard them.
   ReflectionOps::DiscardUnknownFields(&message);
   MapTestUtil::ExpectMapFieldsSet(message);
 
-  EXPECT_EQ(0, message.GetReflection()->
-      GetUnknownFields(message).field_count());
+  EXPECT_EQ(0,
+            message.GetReflection()->GetUnknownFields(message).field_count());
 }
 
 TEST(ReflectionOpsForMapFieldTest, IsInitialized) {
@@ -3042,8 +2985,7 @@
   std::unique_ptr<Message> dynamic_message;
   dynamic_message.reset(
       factory.GetPrototype(unittest::TestMap::descriptor())->New());
-  MapReflectionTester reflection_tester(
-      unittest::TestMap::descriptor());
+  MapReflectionTester reflection_tester(unittest::TestMap::descriptor());
   reflection_tester.SetMapFieldsViaReflection(dynamic_message.get());
   reflection_tester.ExpectMapFieldsSetViaReflection(*dynamic_message);
 
@@ -3106,7 +3048,7 @@
     io::ArrayInputStream stream(data.data(), data.size());
     protobuf_unittest::TestAllTypes message;
     EXPECT_FALSE(
-      message.ParseFromBoundedZeroCopyStream(&stream, data.size() + 1));
+        message.ParseFromBoundedZeroCopyStream(&stream, data.size() + 1));
   }
 }
 
@@ -3263,10 +3205,10 @@
   tester.SetMapFieldsViaReflection(message.get());
 
   std::string expected_text;
-  GOOGLE_CHECK_OK(File::GetContents(
-      TestUtil::GetTestDataPath("net/proto2/internal/"
-                                "testdata/map_test_data.txt"),
-      &expected_text, true));
+  GOOGLE_CHECK_OK(
+      File::GetContents(TestUtil::GetTestDataPath("net/proto2/internal/"
+                                                  "testdata/map_test_data.txt"),
+                        &expected_text, true));
 
   EXPECT_EQ(message->DebugString(), expected_text);
 }
@@ -3312,8 +3254,7 @@
   (*source.mutable_map_int32_int32())[1] = 1;
 
   // Get iterator.
-  Map<int32, int32>::iterator iter =
-      source.mutable_map_int32_int32()->find(1);
+  Map<int32, int32>::iterator iter = source.mutable_map_int32_int32()->find(1);
 
   // Serialize message to text format, which will invalidate the previous
   // iterator previously.
diff --git a/src/google/protobuf/map_test_util.cc b/src/google/protobuf/map_test_util.cc
index 83502af..51c7366 100644
--- a/src/google/protobuf/map_test_util.cc
+++ b/src/google/protobuf/map_test_util.cc
@@ -78,49 +78,59 @@
       message);
 }
 
-void MapTestUtil::ExpectMapFieldsModified(
-    const unittest::TestMap& message) {
+void MapTestUtil::ExpectMapFieldsModified(const unittest::TestMap& message) {
   MapTestUtilImpl::ExpectMapFieldsModified<
       unittest::MapEnum, unittest::MAP_ENUM_BAR, unittest::MAP_ENUM_FOO>(
       message);
 }
 
-void MapTestUtil::ExpectMapsSize(
-    const unittest::TestMap& message, int size) {
+void MapTestUtil::ExpectMapsSize(const unittest::TestMap& message, int size) {
   const Descriptor* descriptor = message.GetDescriptor();
 
   EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_int32_int32")));
+                      message, descriptor->FindFieldByName("map_int32_int32")));
   EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_int64_int64")));
+                      message, descriptor->FindFieldByName("map_int64_int64")));
+  EXPECT_EQ(size,
+            message.GetReflection()->FieldSize(
+                message, descriptor->FindFieldByName("map_uint32_uint32")));
+  EXPECT_EQ(size,
+            message.GetReflection()->FieldSize(
+                message, descriptor->FindFieldByName("map_uint64_uint64")));
+  EXPECT_EQ(size,
+            message.GetReflection()->FieldSize(
+                message, descriptor->FindFieldByName("map_sint32_sint32")));
+  EXPECT_EQ(size,
+            message.GetReflection()->FieldSize(
+                message, descriptor->FindFieldByName("map_sint64_sint64")));
+  EXPECT_EQ(size,
+            message.GetReflection()->FieldSize(
+                message, descriptor->FindFieldByName("map_fixed32_fixed32")));
+  EXPECT_EQ(size,
+            message.GetReflection()->FieldSize(
+                message, descriptor->FindFieldByName("map_fixed64_fixed64")));
+  EXPECT_EQ(size,
+            message.GetReflection()->FieldSize(
+                message, descriptor->FindFieldByName("map_sfixed32_sfixed32")));
+  EXPECT_EQ(size,
+            message.GetReflection()->FieldSize(
+                message, descriptor->FindFieldByName("map_sfixed64_sfixed64")));
   EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_uint32_uint32")));
+                      message, descriptor->FindFieldByName("map_int32_float")));
+  EXPECT_EQ(size,
+            message.GetReflection()->FieldSize(
+                message, descriptor->FindFieldByName("map_int32_double")));
   EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_uint64_uint64")));
+                      message, descriptor->FindFieldByName("map_bool_bool")));
+  EXPECT_EQ(size,
+            message.GetReflection()->FieldSize(
+                message, descriptor->FindFieldByName("map_string_string")));
   EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_sint32_sint32")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_sint64_sint64")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_fixed32_fixed32")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_fixed64_fixed64")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_sfixed32_sfixed32")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_sfixed64_sfixed64")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_int32_float")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_int32_double")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_bool_bool")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_string_string")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_int32_bytes")));
-  EXPECT_EQ(size, message.GetReflection()->FieldSize(
-    message, descriptor->FindFieldByName("map_int32_foreign_message")));
+                      message, descriptor->FindFieldByName("map_int32_bytes")));
+  EXPECT_EQ(
+      size,
+      message.GetReflection()->FieldSize(
+          message, descriptor->FindFieldByName("map_int32_foreign_message")));
 }
 
 std::vector<const Message*> MapTestUtil::GetMapEntries(
@@ -129,39 +139,40 @@
   std::vector<const Message*> result;
 
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_int32_int32"), index));
+      message, descriptor->FindFieldByName("map_int32_int32"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_int64_int64"), index));
+      message, descriptor->FindFieldByName("map_int64_int64"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_uint32_uint32"), index));
+      message, descriptor->FindFieldByName("map_uint32_uint32"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_uint64_uint64"), index));
+      message, descriptor->FindFieldByName("map_uint64_uint64"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_sint32_sint32"), index));
+      message, descriptor->FindFieldByName("map_sint32_sint32"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_sint64_sint64"), index));
+      message, descriptor->FindFieldByName("map_sint64_sint64"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_fixed32_fixed32"), index));
+      message, descriptor->FindFieldByName("map_fixed32_fixed32"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_fixed64_fixed64"), index));
+      message, descriptor->FindFieldByName("map_fixed64_fixed64"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_sfixed32_sfixed32"), index));
+      message, descriptor->FindFieldByName("map_sfixed32_sfixed32"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_sfixed64_sfixed64"), index));
+      message, descriptor->FindFieldByName("map_sfixed64_sfixed64"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_int32_float"), index));
+      message, descriptor->FindFieldByName("map_int32_float"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_int32_double"), index));
+      message, descriptor->FindFieldByName("map_int32_double"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_bool_bool"), index));
+      message, descriptor->FindFieldByName("map_bool_bool"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_string_string"), index));
+      message, descriptor->FindFieldByName("map_string_string"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_int32_bytes"), index));
+      message, descriptor->FindFieldByName("map_int32_bytes"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_int32_enum"), index));
+      message, descriptor->FindFieldByName("map_int32_enum"), index));
   result.push_back(&message.GetReflection()->GetRepeatedMessage(
-    message, descriptor->FindFieldByName("map_int32_foreign_message"), index));
+      message, descriptor->FindFieldByName("map_int32_foreign_message"),
+      index));
 
   return result;
 }
@@ -172,76 +183,74 @@
   std::vector<const Message*> result;
 
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_int32_int32")));
+      message, descriptor->FindFieldByName("map_int32_int32")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_int64_int64")));
+      message, descriptor->FindFieldByName("map_int64_int64")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_uint32_uint32")));
+      message, descriptor->FindFieldByName("map_uint32_uint32")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_uint64_uint64")));
+      message, descriptor->FindFieldByName("map_uint64_uint64")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_sint32_sint32")));
+      message, descriptor->FindFieldByName("map_sint32_sint32")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_sint64_sint64")));
+      message, descriptor->FindFieldByName("map_sint64_sint64")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_fixed32_fixed32")));
+      message, descriptor->FindFieldByName("map_fixed32_fixed32")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_fixed64_fixed64")));
+      message, descriptor->FindFieldByName("map_fixed64_fixed64")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_sfixed32_sfixed32")));
+      message, descriptor->FindFieldByName("map_sfixed32_sfixed32")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_sfixed64_sfixed64")));
+      message, descriptor->FindFieldByName("map_sfixed64_sfixed64")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_int32_float")));
+      message, descriptor->FindFieldByName("map_int32_float")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_int32_double")));
+      message, descriptor->FindFieldByName("map_int32_double")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_bool_bool")));
+      message, descriptor->FindFieldByName("map_bool_bool")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_string_string")));
+      message, descriptor->FindFieldByName("map_string_string")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_int32_bytes")));
+      message, descriptor->FindFieldByName("map_int32_bytes")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_int32_enum")));
+      message, descriptor->FindFieldByName("map_int32_enum")));
   result.push_back(message->GetReflection()->ReleaseLast(
-    message, descriptor->FindFieldByName("map_int32_foreign_message")));
+      message, descriptor->FindFieldByName("map_int32_foreign_message")));
 
   return result;
 }
 
-MapReflectionTester::MapReflectionTester(
-    const Descriptor* base_descriptor)
-  : base_descriptor_(base_descriptor) {
+MapReflectionTester::MapReflectionTester(const Descriptor* base_descriptor)
+    : base_descriptor_(base_descriptor) {
   const DescriptorPool* pool = base_descriptor->file()->pool();
 
   map_enum_foo_ = pool->FindEnumValueByName("protobuf_unittest.MAP_ENUM_FOO");
   map_enum_bar_ = pool->FindEnumValueByName("protobuf_unittest.MAP_ENUM_BAR");
   map_enum_baz_ = pool->FindEnumValueByName("protobuf_unittest.MAP_ENUM_BAZ");
 
-  foreign_c_ = pool->FindFieldByName(
-      "protobuf_unittest.ForeignMessage.c");
-  map_int32_int32_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt32Int32Entry.key");
-  map_int32_int32_val_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt32Int32Entry.value");
-  map_int64_int64_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt64Int64Entry.key");
-  map_int64_int64_val_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt64Int64Entry.value");
-  map_uint32_uint32_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapUint32Uint32Entry.key");
+  foreign_c_ = pool->FindFieldByName("protobuf_unittest.ForeignMessage.c");
+  map_int32_int32_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt32Int32Entry.key");
+  map_int32_int32_val_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt32Int32Entry.value");
+  map_int64_int64_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt64Int64Entry.key");
+  map_int64_int64_val_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt64Int64Entry.value");
+  map_uint32_uint32_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapUint32Uint32Entry.key");
   map_uint32_uint32_val_ = pool->FindFieldByName(
       "protobuf_unittest.TestMap.MapUint32Uint32Entry.value");
-  map_uint64_uint64_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapUint64Uint64Entry.key");
+  map_uint64_uint64_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapUint64Uint64Entry.key");
   map_uint64_uint64_val_ = pool->FindFieldByName(
       "protobuf_unittest.TestMap.MapUint64Uint64Entry.value");
-  map_sint32_sint32_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapSint32Sint32Entry.key");
+  map_sint32_sint32_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapSint32Sint32Entry.key");
   map_sint32_sint32_val_ = pool->FindFieldByName(
       "protobuf_unittest.TestMap.MapSint32Sint32Entry.value");
-  map_sint64_sint64_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapSint64Sint64Entry.key");
+  map_sint64_sint64_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapSint64Sint64Entry.key");
   map_sint64_sint64_val_ = pool->FindFieldByName(
       "protobuf_unittest.TestMap.MapSint64Sint64Entry.value");
   map_fixed32_fixed32_key_ = pool->FindFieldByName(
@@ -260,30 +269,30 @@
       "protobuf_unittest.TestMap.MapSfixed64Sfixed64Entry.key");
   map_sfixed64_sfixed64_val_ = pool->FindFieldByName(
       "protobuf_unittest.TestMap.MapSfixed64Sfixed64Entry.value");
-  map_int32_float_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt32FloatEntry.key");
-  map_int32_float_val_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt32FloatEntry.value");
-  map_int32_double_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt32DoubleEntry.key");
+  map_int32_float_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt32FloatEntry.key");
+  map_int32_float_val_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt32FloatEntry.value");
+  map_int32_double_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt32DoubleEntry.key");
   map_int32_double_val_ = pool->FindFieldByName(
       "protobuf_unittest.TestMap.MapInt32DoubleEntry.value");
-  map_bool_bool_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapBoolBoolEntry.key");
-  map_bool_bool_val_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapBoolBoolEntry.value");
-  map_string_string_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapStringStringEntry.key");
+  map_bool_bool_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapBoolBoolEntry.key");
+  map_bool_bool_val_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapBoolBoolEntry.value");
+  map_string_string_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapStringStringEntry.key");
   map_string_string_val_ = pool->FindFieldByName(
       "protobuf_unittest.TestMap.MapStringStringEntry.value");
-  map_int32_bytes_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt32BytesEntry.key");
-  map_int32_bytes_val_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt32BytesEntry.value");
-  map_int32_enum_key_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt32EnumEntry.key");
-  map_int32_enum_val_ = pool->FindFieldByName(
-      "protobuf_unittest.TestMap.MapInt32EnumEntry.value");
+  map_int32_bytes_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt32BytesEntry.key");
+  map_int32_bytes_val_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt32BytesEntry.value");
+  map_int32_enum_key_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt32EnumEntry.key");
+  map_int32_enum_val_ =
+      pool->FindFieldByName("protobuf_unittest.TestMap.MapInt32EnumEntry.value");
   map_int32_foreign_message_key_ = pool->FindFieldByName(
       "protobuf_unittest.TestMap.MapInt32ForeignMessageEntry.key");
   map_int32_foreign_message_val_ = pool->FindFieldByName(
@@ -336,227 +345,203 @@
   return result;
 }
 
-void MapReflectionTester::SetMapFieldsViaReflection(
-    Message* message) {
+void MapReflectionTester::SetMapFieldsViaReflection(Message* message) {
   const Reflection* reflection = message->GetReflection();
   Message* sub_message = NULL;
   Message* sub_foreign_message = NULL;
 
   // Add first element.
   sub_message = reflection->AddMessage(message, F("map_int32_int32"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_int32_key_, 0);
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_int32_val_, 0);
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_int32_key_, 0);
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_int32_val_, 0);
 
   sub_message = reflection->AddMessage(message, F("map_int64_int64"));
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_int64_int64_key_, 0);
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_int64_int64_val_, 0);
+  sub_message->GetReflection()->SetInt64(sub_message, map_int64_int64_key_, 0);
+  sub_message->GetReflection()->SetInt64(sub_message, map_int64_int64_val_, 0);
 
   sub_message = reflection->AddMessage(message, F("map_uint32_uint32"));
-  sub_message->GetReflection()
-      ->SetUInt32(sub_message, map_uint32_uint32_key_, 0);
-  sub_message->GetReflection()
-      ->SetUInt32(sub_message, map_uint32_uint32_val_, 0);
+  sub_message->GetReflection()->SetUInt32(sub_message, map_uint32_uint32_key_,
+                                          0);
+  sub_message->GetReflection()->SetUInt32(sub_message, map_uint32_uint32_val_,
+                                          0);
 
   sub_message = reflection->AddMessage(message, F("map_uint64_uint64"));
-  sub_message->GetReflection()
-      ->SetUInt64(sub_message, map_uint64_uint64_key_, 0);
-  sub_message->GetReflection()
-      ->SetUInt64(sub_message, map_uint64_uint64_val_, 0);
+  sub_message->GetReflection()->SetUInt64(sub_message, map_uint64_uint64_key_,
+                                          0);
+  sub_message->GetReflection()->SetUInt64(sub_message, map_uint64_uint64_val_,
+                                          0);
 
   sub_message = reflection->AddMessage(message, F("map_sint32_sint32"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_sint32_sint32_key_, 0);
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_sint32_sint32_val_, 0);
+  sub_message->GetReflection()->SetInt32(sub_message, map_sint32_sint32_key_,
+                                         0);
+  sub_message->GetReflection()->SetInt32(sub_message, map_sint32_sint32_val_,
+                                         0);
 
   sub_message = reflection->AddMessage(message, F("map_sint64_sint64"));
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_sint64_sint64_key_, 0);
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_sint64_sint64_val_, 0);
+  sub_message->GetReflection()->SetInt64(sub_message, map_sint64_sint64_key_,
+                                         0);
+  sub_message->GetReflection()->SetInt64(sub_message, map_sint64_sint64_val_,
+                                         0);
 
   sub_message = reflection->AddMessage(message, F("map_fixed32_fixed32"));
-  sub_message->GetReflection()
-      ->SetUInt32(sub_message, map_fixed32_fixed32_key_, 0);
-  sub_message->GetReflection()
-      ->SetUInt32(sub_message, map_fixed32_fixed32_val_, 0);
+  sub_message->GetReflection()->SetUInt32(sub_message, map_fixed32_fixed32_key_,
+                                          0);
+  sub_message->GetReflection()->SetUInt32(sub_message, map_fixed32_fixed32_val_,
+                                          0);
 
   sub_message = reflection->AddMessage(message, F("map_fixed64_fixed64"));
-  sub_message->GetReflection()
-      ->SetUInt64(sub_message, map_fixed64_fixed64_key_, 0);
-  sub_message->GetReflection()
-      ->SetUInt64(sub_message, map_fixed64_fixed64_val_, 0);
+  sub_message->GetReflection()->SetUInt64(sub_message, map_fixed64_fixed64_key_,
+                                          0);
+  sub_message->GetReflection()->SetUInt64(sub_message, map_fixed64_fixed64_val_,
+                                          0);
 
   sub_message = reflection->AddMessage(message, F("map_sfixed32_sfixed32"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_sfixed32_sfixed32_key_, 0);
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_sfixed32_sfixed32_val_, 0);
+  sub_message->GetReflection()->SetInt32(sub_message,
+                                         map_sfixed32_sfixed32_key_, 0);
+  sub_message->GetReflection()->SetInt32(sub_message,
+                                         map_sfixed32_sfixed32_val_, 0);
 
   sub_message = reflection->AddMessage(message, F("map_sfixed64_sfixed64"));
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_sfixed64_sfixed64_key_, 0);
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_sfixed64_sfixed64_val_, 0);
+  sub_message->GetReflection()->SetInt64(sub_message,
+                                         map_sfixed64_sfixed64_key_, 0);
+  sub_message->GetReflection()->SetInt64(sub_message,
+                                         map_sfixed64_sfixed64_val_, 0);
 
   sub_message = reflection->AddMessage(message, F("map_int32_float"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_float_key_, 0);
-  sub_message->GetReflection()
-      ->SetFloat(sub_message, map_int32_float_val_, 0.0);
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_float_key_, 0);
+  sub_message->GetReflection()->SetFloat(sub_message, map_int32_float_val_,
+                                         0.0);
 
   sub_message = reflection->AddMessage(message, F("map_int32_double"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_double_key_, 0);
-  sub_message->GetReflection()
-      ->SetDouble(sub_message, map_int32_double_val_, 0.0);
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_double_key_, 0);
+  sub_message->GetReflection()->SetDouble(sub_message, map_int32_double_val_,
+                                          0.0);
 
   sub_message = reflection->AddMessage(message, F("map_bool_bool"));
-  sub_message->GetReflection()
-      ->SetBool(sub_message, map_bool_bool_key_, false);
-  sub_message->GetReflection()
-      ->SetBool(sub_message, map_bool_bool_val_, false);
+  sub_message->GetReflection()->SetBool(sub_message, map_bool_bool_key_, false);
+  sub_message->GetReflection()->SetBool(sub_message, map_bool_bool_val_, false);
 
   sub_message = reflection->AddMessage(message, F("map_string_string"));
-  sub_message->GetReflection()
-      ->SetString(sub_message, map_string_string_key_, "0");
-  sub_message->GetReflection()
-      ->SetString(sub_message, map_string_string_val_, "0");
+  sub_message->GetReflection()->SetString(sub_message, map_string_string_key_,
+                                          "0");
+  sub_message->GetReflection()->SetString(sub_message, map_string_string_val_,
+                                          "0");
 
   sub_message = reflection->AddMessage(message, F("map_int32_bytes"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_bytes_key_, 0);
-  sub_message->GetReflection()
-      ->SetString(sub_message, map_int32_bytes_val_, "0");
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_bytes_key_, 0);
+  sub_message->GetReflection()->SetString(sub_message, map_int32_bytes_val_,
+                                          "0");
 
   sub_message = reflection->AddMessage(message, F("map_int32_enum"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_enum_key_, 0);
-  sub_message->GetReflection()
-      ->SetEnum(sub_message, map_int32_enum_val_, map_enum_bar_);
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_enum_key_, 0);
+  sub_message->GetReflection()->SetEnum(sub_message, map_int32_enum_val_,
+                                        map_enum_bar_);
 
-  sub_message = reflection
-      ->AddMessage(message, F("map_int32_foreign_message"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_foreign_message_key_, 0);
-  sub_foreign_message = sub_message->GetReflection()->
-      MutableMessage(sub_message, map_int32_foreign_message_val_, NULL);
-  sub_foreign_message->GetReflection()->
-      SetInt32(sub_foreign_message, foreign_c_, 0);
+  sub_message = reflection->AddMessage(message, F("map_int32_foreign_message"));
+  sub_message->GetReflection()->SetInt32(sub_message,
+                                         map_int32_foreign_message_key_, 0);
+  sub_foreign_message = sub_message->GetReflection()->MutableMessage(
+      sub_message, map_int32_foreign_message_val_, NULL);
+  sub_foreign_message->GetReflection()->SetInt32(sub_foreign_message,
+                                                 foreign_c_, 0);
 
   // Add second element
   sub_message = reflection->AddMessage(message, F("map_int32_int32"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_int32_key_, 1);
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_int32_val_, 1);
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_int32_key_, 1);
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_int32_val_, 1);
 
   sub_message = reflection->AddMessage(message, F("map_int64_int64"));
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_int64_int64_key_, 1);
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_int64_int64_val_, 1);
+  sub_message->GetReflection()->SetInt64(sub_message, map_int64_int64_key_, 1);
+  sub_message->GetReflection()->SetInt64(sub_message, map_int64_int64_val_, 1);
 
   sub_message = reflection->AddMessage(message, F("map_uint32_uint32"));
-  sub_message->GetReflection()
-      ->SetUInt32(sub_message, map_uint32_uint32_key_, 1);
-  sub_message->GetReflection()
-      ->SetUInt32(sub_message, map_uint32_uint32_val_, 1);
+  sub_message->GetReflection()->SetUInt32(sub_message, map_uint32_uint32_key_,
+                                          1);
+  sub_message->GetReflection()->SetUInt32(sub_message, map_uint32_uint32_val_,
+                                          1);
 
   sub_message = reflection->AddMessage(message, F("map_uint64_uint64"));
-  sub_message->GetReflection()
-      ->SetUInt64(sub_message, map_uint64_uint64_key_, 1);
-  sub_message->GetReflection()
-      ->SetUInt64(sub_message, map_uint64_uint64_val_, 1);
+  sub_message->GetReflection()->SetUInt64(sub_message, map_uint64_uint64_key_,
+                                          1);
+  sub_message->GetReflection()->SetUInt64(sub_message, map_uint64_uint64_val_,
+                                          1);
 
   sub_message = reflection->AddMessage(message, F("map_sint32_sint32"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_sint32_sint32_key_, 1);
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_sint32_sint32_val_, 1);
+  sub_message->GetReflection()->SetInt32(sub_message, map_sint32_sint32_key_,
+                                         1);
+  sub_message->GetReflection()->SetInt32(sub_message, map_sint32_sint32_val_,
+                                         1);
 
   sub_message = reflection->AddMessage(message, F("map_sint64_sint64"));
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_sint64_sint64_key_, 1);
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_sint64_sint64_val_, 1);
+  sub_message->GetReflection()->SetInt64(sub_message, map_sint64_sint64_key_,
+                                         1);
+  sub_message->GetReflection()->SetInt64(sub_message, map_sint64_sint64_val_,
+                                         1);
 
   sub_message = reflection->AddMessage(message, F("map_fixed32_fixed32"));
-  sub_message->GetReflection()
-      ->SetUInt32(sub_message, map_fixed32_fixed32_key_, 1);
-  sub_message->GetReflection()
-      ->SetUInt32(sub_message, map_fixed32_fixed32_val_, 1);
+  sub_message->GetReflection()->SetUInt32(sub_message, map_fixed32_fixed32_key_,
+                                          1);
+  sub_message->GetReflection()->SetUInt32(sub_message, map_fixed32_fixed32_val_,
+                                          1);
 
   sub_message = reflection->AddMessage(message, F("map_fixed64_fixed64"));
-  sub_message->GetReflection()
-      ->SetUInt64(sub_message, map_fixed64_fixed64_key_, 1);
-  sub_message->GetReflection()
-      ->SetUInt64(sub_message, map_fixed64_fixed64_val_, 1);
+  sub_message->GetReflection()->SetUInt64(sub_message, map_fixed64_fixed64_key_,
+                                          1);
+  sub_message->GetReflection()->SetUInt64(sub_message, map_fixed64_fixed64_val_,
+                                          1);
 
   sub_message = reflection->AddMessage(message, F("map_sfixed32_sfixed32"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_sfixed32_sfixed32_key_, 1);
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_sfixed32_sfixed32_val_, 1);
+  sub_message->GetReflection()->SetInt32(sub_message,
+                                         map_sfixed32_sfixed32_key_, 1);
+  sub_message->GetReflection()->SetInt32(sub_message,
+                                         map_sfixed32_sfixed32_val_, 1);
 
   sub_message = reflection->AddMessage(message, F("map_sfixed64_sfixed64"));
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_sfixed64_sfixed64_key_, 1);
-  sub_message->GetReflection()
-      ->SetInt64(sub_message, map_sfixed64_sfixed64_val_, 1);
+  sub_message->GetReflection()->SetInt64(sub_message,
+                                         map_sfixed64_sfixed64_key_, 1);
+  sub_message->GetReflection()->SetInt64(sub_message,
+                                         map_sfixed64_sfixed64_val_, 1);
 
   sub_message = reflection->AddMessage(message, F("map_int32_float"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_float_key_, 1);
-  sub_message->GetReflection()
-      ->SetFloat(sub_message, map_int32_float_val_, 1.0);
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_float_key_, 1);
+  sub_message->GetReflection()->SetFloat(sub_message, map_int32_float_val_,
+                                         1.0);
 
   sub_message = reflection->AddMessage(message, F("map_int32_double"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_double_key_, 1);
-  sub_message->GetReflection()
-      ->SetDouble(sub_message, map_int32_double_val_, 1.0);
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_double_key_, 1);
+  sub_message->GetReflection()->SetDouble(sub_message, map_int32_double_val_,
+                                          1.0);
 
   sub_message = reflection->AddMessage(message, F("map_bool_bool"));
-  sub_message->GetReflection()
-      ->SetBool(sub_message, map_bool_bool_key_, true);
-  sub_message->GetReflection()
-      ->SetBool(sub_message, map_bool_bool_val_, true);
+  sub_message->GetReflection()->SetBool(sub_message, map_bool_bool_key_, true);
+  sub_message->GetReflection()->SetBool(sub_message, map_bool_bool_val_, true);
 
   sub_message = reflection->AddMessage(message, F("map_string_string"));
-  sub_message->GetReflection()
-      ->SetString(sub_message, map_string_string_key_, "1");
-  sub_message->GetReflection()
-      ->SetString(sub_message, map_string_string_val_, "1");
+  sub_message->GetReflection()->SetString(sub_message, map_string_string_key_,
+                                          "1");
+  sub_message->GetReflection()->SetString(sub_message, map_string_string_val_,
+                                          "1");
 
   sub_message = reflection->AddMessage(message, F("map_int32_bytes"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_bytes_key_, 1);
-  sub_message->GetReflection()
-      ->SetString(sub_message, map_int32_bytes_val_, "1");
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_bytes_key_, 1);
+  sub_message->GetReflection()->SetString(sub_message, map_int32_bytes_val_,
+                                          "1");
 
   sub_message = reflection->AddMessage(message, F("map_int32_enum"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_enum_key_, 1);
-  sub_message->GetReflection()
-      ->SetEnum(sub_message, map_int32_enum_val_, map_enum_baz_);
+  sub_message->GetReflection()->SetInt32(sub_message, map_int32_enum_key_, 1);
+  sub_message->GetReflection()->SetEnum(sub_message, map_int32_enum_val_,
+                                        map_enum_baz_);
 
-  sub_message = reflection
-      ->AddMessage(message, F("map_int32_foreign_message"));
-  sub_message->GetReflection()
-      ->SetInt32(sub_message, map_int32_foreign_message_key_, 1);
-  sub_foreign_message = sub_message->GetReflection()->
-      MutableMessage(sub_message, map_int32_foreign_message_val_, NULL);
-  sub_foreign_message->GetReflection()->
-      SetInt32(sub_foreign_message, foreign_c_, 1);
+  sub_message = reflection->AddMessage(message, F("map_int32_foreign_message"));
+  sub_message->GetReflection()->SetInt32(sub_message,
+                                         map_int32_foreign_message_key_, 1);
+  sub_foreign_message = sub_message->GetReflection()->MutableMessage(
+      sub_message, map_int32_foreign_message_val_, NULL);
+  sub_foreign_message->GetReflection()->SetInt32(sub_foreign_message,
+                                                 foreign_c_, 1);
 }
 
-void MapReflectionTester::SetMapFieldsViaMapReflection(
-    Message* message) {
+void MapReflectionTester::SetMapFieldsViaMapReflection(Message* message) {
   const Reflection* reflection = message->GetReflection();
 
   Message* sub_foreign_message = NULL;
@@ -565,13 +550,13 @@
   // Add first element.
   MapKey map_key;
   map_key.SetInt32Value(0);
-  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
-      message, F("map_int32_int32"), map_key, &map_val));
+  EXPECT_TRUE(reflection->InsertOrLookupMapValue(message, F("map_int32_int32"),
+                                                 map_key, &map_val));
   map_val.SetInt32Value(0);
 
   map_key.SetInt64Value(0);
-  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
-      message, F("map_int64_int64"), map_key, &map_val));
+  EXPECT_TRUE(reflection->InsertOrLookupMapValue(message, F("map_int64_int64"),
+                                                 map_key, &map_val));
   map_val.SetInt64Value(0);
 
   map_key.SetUInt32Value(0);
@@ -615,18 +600,18 @@
   map_val.SetInt64Value(0);
 
   map_key.SetInt32Value(0);
-  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
-      message, F("map_int32_float"), map_key, &map_val));
+  EXPECT_TRUE(reflection->InsertOrLookupMapValue(message, F("map_int32_float"),
+                                                 map_key, &map_val));
   map_val.SetFloatValue(0.0);
 
   map_key.SetInt32Value(0);
-  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
-      message, F("map_int32_double"), map_key, &map_val));
+  EXPECT_TRUE(reflection->InsertOrLookupMapValue(message, F("map_int32_double"),
+                                                 map_key, &map_val));
   map_val.SetDoubleValue(0.0);
 
   map_key.SetBoolValue(false);
-  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
-      message, F("map_bool_bool"), map_key, &map_val));
+  EXPECT_TRUE(reflection->InsertOrLookupMapValue(message, F("map_bool_bool"),
+                                                 map_key, &map_val));
   map_val.SetBoolValue(false);
 
   map_key.SetStringValue("0");
@@ -635,113 +620,113 @@
   map_val.SetStringValue("0");
 
   map_key.SetInt32Value(0);
-  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
-      message, F("map_int32_bytes"), map_key, &map_val));
+  EXPECT_TRUE(reflection->InsertOrLookupMapValue(message, F("map_int32_bytes"),
+                                                 map_key, &map_val));
   map_val.SetStringValue("0");
 
   map_key.SetInt32Value(0);
-  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
-      message, F("map_int32_enum"), map_key, &map_val));
+  EXPECT_TRUE(reflection->InsertOrLookupMapValue(message, F("map_int32_enum"),
+                                                 map_key, &map_val));
   map_val.SetEnumValue(map_enum_bar_->number());
 
   map_key.SetInt32Value(0);
   EXPECT_TRUE(reflection->InsertOrLookupMapValue(
       message, F("map_int32_foreign_message"), map_key, &map_val));
   sub_foreign_message = map_val.MutableMessageValue();
-  sub_foreign_message->GetReflection()->SetInt32(
-      sub_foreign_message, foreign_c_, 0);
+  sub_foreign_message->GetReflection()->SetInt32(sub_foreign_message,
+                                                 foreign_c_, 0);
 
   // Add second element
   map_key.SetInt32Value(1);
-  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
-      message, F("map_int32_int32"), map_key, &map_val));
+  EXPECT_TRUE(reflection->InsertOrLookupMapValue(message, F("map_int32_int32"),
+                                                 map_key, &map_val));
   map_val.SetInt32Value(1);
-  EXPECT_FALSE(reflection->InsertOrLookupMapValue(
-      message, F("map_int32_int32"), map_key, &map_val));
+  EXPECT_FALSE(reflection->InsertOrLookupMapValue(message, F("map_int32_int32"),
+                                                  map_key, &map_val));
 
   map_key.SetInt64Value(1);
-  EXPECT_TRUE(reflection->InsertOrLookupMapValue(
-      message, F("map_int64_int64"), map_key, &map_val));
+  EXPECT_TRUE(reflection->InsertOrLookupMapValue(message, F("map_int64_int64"),
+                                                 map_key, &map_val));
   map_val.SetInt64Value(1);
-  EXPECT_FALSE(reflection->InsertOrLookupMapValue(
-      message, F("map_int64_int64"), map_key, &map_val));
+  EXPECT_FALSE(reflection->InsertOrLookupMapValue(message, F("map_int64_int64"),
+                                                  map_key, &map_val));
 
   map_key.SetUInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_uint32_uint32"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_uint32_uint32"), map_key,
+                                     &map_val);
   map_val.SetUInt32Value(1);
 
   map_key.SetUInt64Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_uint64_uint64"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_uint64_uint64"), map_key,
+                                     &map_val);
   map_val.SetUInt64Value(1);
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_sint32_sint32"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_sint32_sint32"), map_key,
+                                     &map_val);
   map_val.SetInt32Value(1);
 
   map_key.SetInt64Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_sint64_sint64"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_sint64_sint64"), map_key,
+                                     &map_val);
   map_val.SetInt64Value(1);
 
   map_key.SetUInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_fixed32_fixed32"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_fixed32_fixed32"), map_key,
+                                     &map_val);
   map_val.SetUInt32Value(1);
 
   map_key.SetUInt64Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_fixed64_fixed64"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_fixed64_fixed64"), map_key,
+                                     &map_val);
   map_val.SetUInt64Value(1);
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_sfixed32_sfixed32"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_sfixed32_sfixed32"),
+                                     map_key, &map_val);
   map_val.SetInt32Value(1);
 
   map_key.SetInt64Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_sfixed64_sfixed64"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_sfixed64_sfixed64"),
+                                     map_key, &map_val);
   map_val.SetInt64Value(1);
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_int32_float"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_int32_float"), map_key,
+                                     &map_val);
   map_val.SetFloatValue(1.0);
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_int32_double"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_int32_double"), map_key,
+                                     &map_val);
   map_val.SetDoubleValue(1.0);
 
   map_key.SetBoolValue(true);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_bool_bool"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_bool_bool"), map_key,
+                                     &map_val);
   map_val.SetBoolValue(true);
 
   map_key.SetStringValue("1");
-  reflection->InsertOrLookupMapValue(
-      message, F("map_string_string"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_string_string"), map_key,
+                                     &map_val);
   map_val.SetStringValue("1");
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_int32_bytes"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_int32_bytes"), map_key,
+                                     &map_val);
   map_val.SetStringValue("1");
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_int32_enum"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_int32_enum"), map_key,
+                                     &map_val);
   map_val.SetEnumValue(map_enum_baz_->number());
 
   map_key.SetInt32Value(1);
   EXPECT_TRUE(reflection->InsertOrLookupMapValue(
       message, F("map_int32_foreign_message"), map_key, &map_val));
   sub_foreign_message = map_val.MutableMessageValue();
-  sub_foreign_message->GetReflection()->SetInt32(
-      sub_foreign_message, foreign_c_, 1);
+  sub_foreign_message->GetReflection()->SetInt32(sub_foreign_message,
+                                                 foreign_c_, 1);
 }
 
 void MapReflectionTester::GetMapValueViaMapReflection(
@@ -770,8 +755,7 @@
   return reflection->MapEnd(message, F(field_name));
 }
 
-void MapReflectionTester::ClearMapFieldsViaReflection(
-    Message* message) {
+void MapReflectionTester::ClearMapFieldsViaReflection(Message* message) {
   const Reflection* reflection = message->GetReflection();
 
   reflection->ClearField(message, F("map_int32_int32"));
@@ -793,8 +777,7 @@
   reflection->ClearField(message, F("map_int32_foreign_message"));
 }
 
-void MapReflectionTester::ModifyMapFieldsViaReflection(
-    Message* message) {
+void MapReflectionTester::ModifyMapFieldsViaReflection(Message* message) {
   const Reflection* reflection = message->GetReflection();
   MapValueRef map_val;
   Message* sub_foreign_message;
@@ -802,13 +785,13 @@
   // Modify the second element
   MapKey map_key;
   map_key.SetInt32Value(1);
-  EXPECT_FALSE(reflection->InsertOrLookupMapValue(
-      message, F("map_int32_int32"), map_key, &map_val));
+  EXPECT_FALSE(reflection->InsertOrLookupMapValue(message, F("map_int32_int32"),
+                                                  map_key, &map_val));
   map_val.SetInt32Value(2);
 
   map_key.SetInt64Value(1);
-  EXPECT_FALSE(reflection->InsertOrLookupMapValue(
-      message, F("map_int64_int64"), map_key, &map_val));
+  EXPECT_FALSE(reflection->InsertOrLookupMapValue(message, F("map_int64_int64"),
+                                                  map_key, &map_val));
   map_val.SetInt64Value(2);
 
   map_key.SetUInt32Value(1);
@@ -817,80 +800,79 @@
   map_val.SetUInt32Value(2);
 
   map_key.SetUInt64Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_uint64_uint64"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_uint64_uint64"), map_key,
+                                     &map_val);
   map_val.SetUInt64Value(2);
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_sint32_sint32"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_sint32_sint32"), map_key,
+                                     &map_val);
   map_val.SetInt32Value(2);
 
   map_key.SetInt64Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_sint64_sint64"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_sint64_sint64"), map_key,
+                                     &map_val);
   map_val.SetInt64Value(2);
 
   map_key.SetUInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_fixed32_fixed32"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_fixed32_fixed32"), map_key,
+                                     &map_val);
   map_val.SetUInt32Value(2);
 
   map_key.SetUInt64Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_fixed64_fixed64"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_fixed64_fixed64"), map_key,
+                                     &map_val);
   map_val.SetUInt64Value(2);
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_sfixed32_sfixed32"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_sfixed32_sfixed32"),
+                                     map_key, &map_val);
   map_val.SetInt32Value(2);
 
   map_key.SetInt64Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_sfixed64_sfixed64"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_sfixed64_sfixed64"),
+                                     map_key, &map_val);
   map_val.SetInt64Value(2);
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_int32_float"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_int32_float"), map_key,
+                                     &map_val);
   map_val.SetFloatValue(2.0);
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_int32_double"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_int32_double"), map_key,
+                                     &map_val);
   map_val.SetDoubleValue(2.0);
 
   map_key.SetBoolValue(true);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_bool_bool"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_bool_bool"), map_key,
+                                     &map_val);
   map_val.SetBoolValue(false);
 
   map_key.SetStringValue("1");
-  reflection->InsertOrLookupMapValue(
-      message, F("map_string_string"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_string_string"), map_key,
+                                     &map_val);
   map_val.SetStringValue("2");
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_int32_bytes"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_int32_bytes"), map_key,
+                                     &map_val);
   map_val.SetStringValue("2");
 
   map_key.SetInt32Value(1);
-  reflection->InsertOrLookupMapValue(
-      message, F("map_int32_enum"), map_key, &map_val);
+  reflection->InsertOrLookupMapValue(message, F("map_int32_enum"), map_key,
+                                     &map_val);
   map_val.SetEnumValue(map_enum_foo_->number());
 
   map_key.SetInt32Value(1);
   EXPECT_FALSE(reflection->InsertOrLookupMapValue(
       message, F("map_int32_foreign_message"), map_key, &map_val));
   sub_foreign_message = map_val.MutableMessageValue();
-  sub_foreign_message->GetReflection()->SetInt32(
-      sub_foreign_message, foreign_c_, 2);
+  sub_foreign_message->GetReflection()->SetInt32(sub_foreign_message,
+                                                 foreign_c_, 2);
 }
 
-void MapReflectionTester::RemoveLastMapsViaReflection(
-    Message* message) {
+void MapReflectionTester::RemoveLastMapsViaReflection(Message* message) {
   const Reflection* reflection = message->GetReflection();
 
   std::vector<const FieldDescriptor*> output;
@@ -902,8 +884,7 @@
   }
 }
 
-void MapReflectionTester::ReleaseLastMapsViaReflection(
-    Message* message) {
+void MapReflectionTester::ReleaseLastMapsViaReflection(Message* message) {
   const Reflection* reflection = message->GetReflection();
 
   std::vector<const FieldDescriptor*> output;
@@ -914,8 +895,8 @@
     if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) continue;
 
     Message* released = reflection->ReleaseLast(message, field);
-    ASSERT_TRUE(released != NULL) << "ReleaseLast returned NULL for: "
-                                  << field->name();
+    ASSERT_TRUE(released != NULL)
+        << "ReleaseLast returned NULL for: " << field->name();
     delete released;
   }
 }
@@ -931,8 +912,8 @@
   }
 }
 
-void MapReflectionTester::
-    MutableUnknownFieldsOfMapFieldsViaReflection(Message* message) {
+void MapReflectionTester::MutableUnknownFieldsOfMapFieldsViaReflection(
+    Message* message) {
   const Reflection* reflection = message->GetReflection();
   Message* sub_message = NULL;
 
@@ -1024,15 +1005,15 @@
       // Check with RepeatedField Reflection
       sub_message =
           &reflection->GetRepeatedMessage(message, F("map_int32_int32"), i);
-      int32 key = sub_message->GetReflection()->GetInt32(
-          *sub_message, map_int32_int32_key_);
-      int32 val = sub_message->GetReflection()->GetInt32(
-          *sub_message, map_int32_int32_val_);
+      int32 key = sub_message->GetReflection()->GetInt32(*sub_message,
+                                                         map_int32_int32_key_);
+      int32 val = sub_message->GetReflection()->GetInt32(*sub_message,
+                                                         map_int32_int32_val_);
       EXPECT_EQ(map[key], val);
       // Check with Map Reflection
       map_key.SetInt32Value(key);
-      EXPECT_TRUE(reflection->ContainsMapKey(
-          message, F("map_int32_int32"), map_key));
+      EXPECT_TRUE(
+          reflection->ContainsMapKey(message, F("map_int32_int32"), map_key));
     }
   }
   {
@@ -1043,15 +1024,15 @@
       // Check with RepeatedField Reflection
       sub_message =
           &reflection->GetRepeatedMessage(message, F("map_int64_int64"), i);
-      int64 key = sub_message->GetReflection()->GetInt64(
-          *sub_message, map_int64_int64_key_);
-      int64 val = sub_message->GetReflection()->GetInt64(
-          *sub_message, map_int64_int64_val_);
+      int64 key = sub_message->GetReflection()->GetInt64(*sub_message,
+                                                         map_int64_int64_key_);
+      int64 val = sub_message->GetReflection()->GetInt64(*sub_message,
+                                                         map_int64_int64_val_);
       EXPECT_EQ(map[key], val);
       // Check with Map Reflection
       map_key.SetInt64Value(key);
-      EXPECT_TRUE(reflection->ContainsMapKey(
-          message, F("map_int64_int64"), map_key));
+      EXPECT_TRUE(
+          reflection->ContainsMapKey(message, F("map_int64_int64"), map_key));
     }
   }
   {
@@ -1069,8 +1050,8 @@
       EXPECT_EQ(map[key], val);
       // Check with Map Reflection
       map_key.SetUInt32Value(key);
-      EXPECT_TRUE(reflection->ContainsMapKey(
-          message, F("map_uint32_uint32"), map_key));
+      EXPECT_TRUE(
+          reflection->ContainsMapKey(message, F("map_uint32_uint32"), map_key));
     }
   }
   {
@@ -1087,8 +1068,8 @@
       EXPECT_EQ(map[key], val);
       // Check with Map Reflection
       map_key.SetUInt64Value(key);
-      EXPECT_TRUE(reflection->ContainsMapKey(
-          message, F("map_uint64_uint64"), map_key));
+      EXPECT_TRUE(
+          reflection->ContainsMapKey(message, F("map_uint64_uint64"), map_key));
     }
   }
   {
@@ -1106,7 +1087,7 @@
       // Check with Map Reflection
       map_key.SetInt32Value(key);
       EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_sint32_sint32"), map_key));
+                          message, F("map_sint32_sint32"), map_key));
     }
   }
   {
@@ -1124,7 +1105,7 @@
       // Check with Map Reflection
       map_key.SetInt64Value(key);
       EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_sint64_sint64"), map_key));
+                          message, F("map_sint64_sint64"), map_key));
     }
   }
   {
@@ -1142,7 +1123,7 @@
       // Check with Map Reflection
       map_key.SetUInt32Value(key);
       EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_fixed32_fixed32"), map_key));
+                          message, F("map_fixed32_fixed32"), map_key));
     }
   }
   {
@@ -1160,7 +1141,7 @@
       // Check with Map Reflection
       map_key.SetUInt64Value(key);
       EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_fixed64_fixed64"), map_key));
+                          message, F("map_fixed64_fixed64"), map_key));
     }
   }
   {
@@ -1178,7 +1159,7 @@
       // Check with Map Reflection
       map_key.SetInt32Value(key);
       EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_sfixed32_sfixed32"), map_key));
+                          message, F("map_sfixed32_sfixed32"), map_key));
     }
   }
   {
@@ -1196,7 +1177,7 @@
       // Check with Map Reflection
       map_key.SetInt64Value(key);
       EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_sfixed64_sfixed64"), map_key));
+                          message, F("map_sfixed64_sfixed64"), map_key));
     }
   }
   {
@@ -1206,15 +1187,15 @@
     for (int i = 0; i < 2; i++) {
       sub_message =
           &reflection->GetRepeatedMessage(message, F("map_int32_float"), i);
-      int32  key = sub_message->GetReflection()->GetInt32(
-          *sub_message, map_int32_float_key_);
-      float val = sub_message->GetReflection()->GetFloat(
-          *sub_message, map_int32_float_val_);
+      int32 key = sub_message->GetReflection()->GetInt32(*sub_message,
+                                                         map_int32_float_key_);
+      float val = sub_message->GetReflection()->GetFloat(*sub_message,
+                                                         map_int32_float_val_);
       EXPECT_EQ(map[key], val);
       // Check with Map Reflection
       map_key.SetInt32Value(key);
-      EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_int32_float"), map_key));
+      EXPECT_EQ(true, reflection->ContainsMapKey(message, F("map_int32_float"),
+                                                 map_key));
     }
   }
   {
@@ -1224,15 +1205,15 @@
     for (int i = 0; i < 2; i++) {
       sub_message =
           &reflection->GetRepeatedMessage(message, F("map_int32_double"), i);
-      int32  key = sub_message->GetReflection()->GetInt32(
-          *sub_message, map_int32_double_key_);
+      int32 key = sub_message->GetReflection()->GetInt32(*sub_message,
+                                                         map_int32_double_key_);
       double val = sub_message->GetReflection()->GetDouble(
           *sub_message, map_int32_double_val_);
       EXPECT_EQ(map[key], val);
       // Check with Map Reflection
       map_key.SetInt32Value(key);
-      EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_int32_double"), map_key));
+      EXPECT_EQ(true, reflection->ContainsMapKey(message, F("map_int32_double"),
+                                                 map_key));
     }
   }
   {
@@ -1242,15 +1223,15 @@
     for (int i = 0; i < 2; i++) {
       sub_message =
           &reflection->GetRepeatedMessage(message, F("map_bool_bool"), i);
-      bool key = sub_message->GetReflection()->GetBool(
-          *sub_message, map_bool_bool_key_);
-      bool val = sub_message->GetReflection()->GetBool(
-          *sub_message, map_bool_bool_val_);
+      bool key = sub_message->GetReflection()->GetBool(*sub_message,
+                                                       map_bool_bool_key_);
+      bool val = sub_message->GetReflection()->GetBool(*sub_message,
+                                                       map_bool_bool_val_);
       EXPECT_EQ(map[key], val);
       // Check with Map Reflection
       map_key.SetBoolValue(key);
-      EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_bool_bool"), map_key));
+      EXPECT_EQ(true, reflection->ContainsMapKey(message, F("map_bool_bool"),
+                                                 map_key));
     }
   }
   {
@@ -1268,7 +1249,7 @@
       // Check with Map Reflection
       map_key.SetStringValue(key);
       EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_string_string"), map_key));
+                          message, F("map_string_string"), map_key));
     }
   }
   {
@@ -1278,15 +1259,15 @@
     for (int i = 0; i < 2; i++) {
       sub_message =
           &reflection->GetRepeatedMessage(message, F("map_int32_bytes"), i);
-      int32  key = sub_message->GetReflection()->GetInt32(
-          *sub_message, map_int32_bytes_key_);
+      int32 key = sub_message->GetReflection()->GetInt32(*sub_message,
+                                                         map_int32_bytes_key_);
       std::string val = sub_message->GetReflection()->GetString(
           *sub_message, map_int32_bytes_val_);
       EXPECT_EQ(map[key], val);
       // Check with Map Reflection
       map_key.SetInt32Value(key);
-      EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_int32_bytes"), map_key));
+      EXPECT_EQ(true, reflection->ContainsMapKey(message, F("map_int32_bytes"),
+                                                 map_key));
     }
   }
   {
@@ -1294,17 +1275,17 @@
     map[0] = map_enum_bar_;
     map[1] = map_enum_baz_;
     for (int i = 0; i < 2; i++) {
-      sub_message = &reflection->GetRepeatedMessage(
-          message, F("map_int32_enum"), i);
-      int32 key = sub_message->GetReflection()->GetInt32(
-          *sub_message, map_int32_enum_key_);
+      sub_message =
+          &reflection->GetRepeatedMessage(message, F("map_int32_enum"), i);
+      int32 key = sub_message->GetReflection()->GetInt32(*sub_message,
+                                                         map_int32_enum_key_);
       const EnumValueDescriptor* val = sub_message->GetReflection()->GetEnum(
           *sub_message, map_int32_enum_val_);
       EXPECT_EQ(map[key], val);
       // Check with Map Reflection
       map_key.SetInt32Value(key);
-      EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_int32_enum"), map_key));
+      EXPECT_EQ(true, reflection->ContainsMapKey(message, F("map_int32_enum"),
+                                                 map_key));
     }
   }
   {
@@ -1314,17 +1295,17 @@
     for (int i = 0; i < 2; i++) {
       sub_message = &reflection->GetRepeatedMessage(
           message, F("map_int32_foreign_message"), i);
-      int32  key = sub_message->GetReflection()->GetInt32(
+      int32 key = sub_message->GetReflection()->GetInt32(
           *sub_message, map_int32_foreign_message_key_);
       const Message& foreign_message = sub_message->GetReflection()->GetMessage(
           *sub_message, map_int32_foreign_message_val_);
-      int32 val = foreign_message.GetReflection()->GetInt32(
-          foreign_message, foreign_c_);
+      int32 val = foreign_message.GetReflection()->GetInt32(foreign_message,
+                                                            foreign_c_);
       EXPECT_EQ(map[key], val);
       // Check with Map Reflection
       map_key.SetInt32Value(key);
       EXPECT_EQ(true, reflection->ContainsMapKey(
-          message, F("map_int32_foreign_message"), map_key));
+                          message, F("map_int32_foreign_message"), map_key));
     }
   }
 }
@@ -1386,10 +1367,9 @@
     std::map<uint32, uint32> map;
     map[0] = 0;
     map[1] = 1;
-    for (MapIterator iter = reflection->MapBegin(
-             message, F("map_uint32_uint32"));
-         iter != reflection->MapEnd(message, F("map_uint32_uint32"));
-         ++iter) {
+    for (MapIterator iter =
+             reflection->MapBegin(message, F("map_uint32_uint32"));
+         iter != reflection->MapEnd(message, F("map_uint32_uint32")); ++iter) {
       EXPECT_EQ(map[iter.GetKey().GetUInt32Value()],
                 iter.GetValueRef().GetUInt32Value());
     }
@@ -1398,10 +1378,9 @@
     std::map<uint64, uint64> map;
     map[0] = 0;
     map[1] = 1;
-    for (MapIterator iter = reflection->MapBegin(
-             message, F("map_uint64_uint64"));
-         iter != reflection->MapEnd(message, F("map_uint64_uint64"));
-         ++iter) {
+    for (MapIterator iter =
+             reflection->MapBegin(message, F("map_uint64_uint64"));
+         iter != reflection->MapEnd(message, F("map_uint64_uint64")); ++iter) {
       EXPECT_EQ(map[iter.GetKey().GetUInt64Value()],
                 iter.GetValueRef().GetUInt64Value());
     }
@@ -1410,10 +1389,9 @@
     std::map<int32, int32> map;
     map[0] = 0;
     map[1] = 1;
-    for (MapIterator iter = reflection->MapBegin(
-             message, F("map_sint32_sint32"));
-         iter != reflection->MapEnd(message, F("map_sint32_sint32"));
-         ++iter) {
+    for (MapIterator iter =
+             reflection->MapBegin(message, F("map_sint32_sint32"));
+         iter != reflection->MapEnd(message, F("map_sint32_sint32")); ++iter) {
       EXPECT_EQ(map[iter.GetKey().GetInt32Value()],
                 iter.GetValueRef().GetInt32Value());
     }
@@ -1422,8 +1400,8 @@
     std::map<int64, int64> map;
     map[0] = 0;
     map[1] = 1;
-    for (MapIterator iter = reflection->MapBegin(
-             message, F("map_sint64_sint64"));
+    for (MapIterator iter =
+             reflection->MapBegin(message, F("map_sint64_sint64"));
          iter != reflection->MapEnd(message, F("map_sint64_sint64")); ++iter) {
       EXPECT_EQ(map[iter.GetKey().GetInt64Value()],
                 iter.GetValueRef().GetInt64Value());
@@ -1433,8 +1411,8 @@
     std::map<uint32, uint32> map;
     map[0] = 0;
     map[1] = 1;
-    for (MapIterator iter = reflection->MapBegin(
-             message, F("map_fixed32_fixed32"));
+    for (MapIterator iter =
+             reflection->MapBegin(message, F("map_fixed32_fixed32"));
          iter != reflection->MapEnd(message, F("map_fixed32_fixed32"));
          ++iter) {
       EXPECT_EQ(map[iter.GetKey().GetUInt32Value()],
@@ -1445,8 +1423,8 @@
     std::map<uint64, uint64> map;
     map[0] = 0;
     map[1] = 1;
-    for (MapIterator iter = reflection->MapBegin(
-             message, F("map_fixed64_fixed64"));
+    for (MapIterator iter =
+             reflection->MapBegin(message, F("map_fixed64_fixed64"));
          iter != reflection->MapEnd(message, F("map_fixed64_fixed64"));
          ++iter) {
       EXPECT_EQ(map[iter.GetKey().GetUInt64Value()],
@@ -1457,8 +1435,8 @@
     std::map<int32, int32> map;
     map[0] = 0;
     map[1] = 1;
-    for (MapIterator iter = reflection->MapBegin(
-             message, F("map_sfixed32_sfixed32"));
+    for (MapIterator iter =
+             reflection->MapBegin(message, F("map_sfixed32_sfixed32"));
          iter != reflection->MapEnd(message, F("map_sfixed32_sfixed32"));
          ++iter) {
       EXPECT_EQ(map[iter.GetKey().GetInt32Value()],
@@ -1479,8 +1457,8 @@
     std::map<int32, double> map;
     map[0] = 0.0;
     map[1] = 1.0;
-    for (MapIterator iter = reflection->MapBegin(
-             message, F("map_int32_double"));
+    for (MapIterator iter =
+             reflection->MapBegin(message, F("map_int32_double"));
          iter != reflection->MapEnd(message, F("map_int32_double")); ++iter) {
       EXPECT_EQ(map[iter.GetKey().GetInt32Value()],
                 iter.GetValueRef().GetDoubleValue());
@@ -1501,8 +1479,8 @@
     map["0"] = "0";
     map["1"] = "1";
     int size = 0;
-    for (MapIterator iter = reflection->MapBegin(
-             message, F("map_string_string"));
+    for (MapIterator iter =
+             reflection->MapBegin(message, F("map_string_string"));
          iter != reflection->MapEnd(message, F("map_string_string"));
          ++iter, ++size) {
       // Check const methods do not invalidate map.
@@ -1541,8 +1519,8 @@
     map[0] = 0;
     map[1] = 1;
     int size = 0;
-    for (MapIterator iter = reflection->MapBegin(
-             message, F("map_int32_foreign_message"));
+    for (MapIterator iter =
+             reflection->MapBegin(message, F("map_int32_foreign_message"));
          iter != reflection->MapEnd(message, F("map_int32_foreign_message"));
          ++iter, ++size) {
       // Check const methods do not invalidate map.
@@ -1559,8 +1537,7 @@
   }
 }
 
-void MapReflectionTester::ExpectClearViaReflection(
-    const Message& message) {
+void MapReflectionTester::ExpectClearViaReflection(const Message& message) {
   const Reflection* reflection = message.GetReflection();
   // Map fields are empty.
   EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_int32")));
@@ -1580,12 +1557,11 @@
   EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_bytes")));
   EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_enum")));
   EXPECT_EQ(0, reflection->FieldSize(message, F("map_int32_foreign_message")));
-  EXPECT_TRUE(reflection->GetMapData(
-      message, F("map_int32_foreign_message"))->IsMapValid());
+  EXPECT_TRUE(reflection->GetMapData(message, F("map_int32_foreign_message"))
+                  ->IsMapValid());
 }
 
-void MapReflectionTester::ExpectClearViaReflectionIterator(
-    Message* message) {
+void MapReflectionTester::ExpectClearViaReflectionIterator(Message* message) {
   const Reflection* reflection = message->GetReflection();
   EXPECT_TRUE(reflection->MapBegin(message, F("map_int32_int32")) ==
               reflection->MapEnd(message, F("map_int32_int32")));
@@ -1623,8 +1599,7 @@
               reflection->MapEnd(message, F("map_int32_foreign_message")));
 }
 
-void MapReflectionTester::ExpectMapEntryClearViaReflection(
-    Message* message) {
+void MapReflectionTester::ExpectMapEntryClearViaReflection(Message* message) {
   const Reflection* reflection = message->GetReflection();
   const Message* sub_message;
 
@@ -1806,7 +1781,7 @@
     EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message,
                                                         key_descriptor));
     EXPECT_EQ("", sub_message->GetReflection()->GetString(*sub_message,
-                                                        value_descriptor));
+                                                          value_descriptor));
   }
   {
     const FieldDescriptor* descriptor = F("map_int32_enum");
diff --git a/src/google/protobuf/map_test_util.h b/src/google/protobuf/map_test_util.h
index ede290b..00d2fa4 100644
--- a/src/google/protobuf/map_test_util.h
+++ b/src/google/protobuf/map_test_util.h
@@ -63,8 +63,7 @@
 
   // Check that all fields have the values that they should have after
   // SetMapFieldsInitialized() is called.
-  static void ExpectMapFieldsSetInitialized(
-      const unittest::TestMap& message);
+  static void ExpectMapFieldsSetInitialized(const unittest::TestMap& message);
 
   // Expect that the message is modified as would be expected from
   // ModifyMapFields().
diff --git a/src/google/protobuf/map_test_util_impl.h b/src/google/protobuf/map_test_util_impl.h
index 2e8b4ba..70145b7 100644
--- a/src/google/protobuf/map_test_util_impl.h
+++ b/src/google/protobuf/map_test_util_impl.h
@@ -36,7 +36,7 @@
 #include <gtest/gtest.h>
 
 
-namespace protobuf_unittest {}  // forward declaration
+namespace protobuf_unittest {}  // namespace protobuf_unittest
 
 namespace google {
 namespace protobuf {
@@ -46,13 +46,13 @@
 class MapTestUtilImpl {
  public:
   // Set every field in the TestMap message to a unique value.
-  template <typename EnumType, EnumType enum_value0,
-            EnumType enum_value1, typename MapMessage>
+  template <typename EnumType, EnumType enum_value0, EnumType enum_value1,
+            typename MapMessage>
   static void SetMapFields(MapMessage* message);
 
   // Set every field in the TestArenaMap message to a unique value.
-  template <typename EnumType, EnumType enum_value0,
-            EnumType enum_value1, typename MapMessage>
+  template <typename EnumType, EnumType enum_value0, EnumType enum_value1,
+            typename MapMessage>
   static void SetArenaMapFields(MapMessage* message);
 
   // Set every field in the message to a default value.
@@ -66,14 +66,14 @@
 
   // Check that all fields have the values that they should have after
   // SetMapFields() is called.
-  template <typename EnumType, EnumType enum_value0,
-            EnumType enum_value1, typename MapMessage>
+  template <typename EnumType, EnumType enum_value0, EnumType enum_value1,
+            typename MapMessage>
   static void ExpectMapFieldsSet(const MapMessage& message);
 
   // Check that all fields have the values that they should have after
   // SetMapFields() is called for TestArenaMap.
-  template <typename EnumType, EnumType enum_value0,
-            EnumType enum_value1, typename MapMessage>
+  template <typename EnumType, EnumType enum_value0, EnumType enum_value1,
+            typename MapMessage>
   static void ExpectArenaMapFieldsSet(const MapMessage& message);
 
   // Check that all fields have the values that they should have after
@@ -83,8 +83,8 @@
 
   // Expect that the message is modified as would be expected from
   // ModifyMapFields().
-  template <typename EnumType, EnumType enum_value0,
-            EnumType enum_value1, typename MapMessage>
+  template <typename EnumType, EnumType enum_value0, EnumType enum_value1,
+            typename MapMessage>
   static void ExpectMapFieldsModified(const MapMessage& message);
 
   // Check that all fields are empty.
@@ -104,8 +104,8 @@
   //     MapMessage* message);
 };
 
-template <typename EnumType, EnumType enum_value0,
-          EnumType enum_value1, typename MapMessage>
+template <typename EnumType, EnumType enum_value0, EnumType enum_value1,
+          typename MapMessage>
 void MapTestUtilImpl::SetMapFields(MapMessage* message) {
   // Add first element.
   (*message->mutable_map_int32_int32())[0] = 0;
@@ -146,8 +146,8 @@
   (*message->mutable_map_int32_foreign_message())[1].set_c(1);
 }
 
-template <typename EnumType, EnumType enum_value0,
-          EnumType enum_value1, typename MapMessage>
+template <typename EnumType, EnumType enum_value0, EnumType enum_value1,
+          typename MapMessage>
 void MapTestUtilImpl::SetArenaMapFields(MapMessage* message) {
   // Add first element.
   (*message->mutable_map_int32_int32())[0] = 0;
@@ -255,10 +255,8 @@
   EXPECT_EQ(0, message.map_int32_foreign_message().size());
 }
 
-
-
-template <typename EnumType, EnumType enum_value0,
-          EnumType enum_value1, typename MapMessage>
+template <typename EnumType, EnumType enum_value0, EnumType enum_value1,
+          typename MapMessage>
 void MapTestUtilImpl::ExpectMapFieldsSet(const MapMessage& message) {
   ASSERT_EQ(2, message.map_int32_int32().size());
   ASSERT_EQ(2, message.map_int64_int64().size());
@@ -315,8 +313,8 @@
   EXPECT_EQ(1, message.map_int32_foreign_message().at(1).c());
 }
 
-template <typename EnumType, EnumType enum_value0,
-          EnumType enum_value1, typename MapMessage>
+template <typename EnumType, EnumType enum_value0, EnumType enum_value1,
+          typename MapMessage>
 void MapTestUtilImpl::ExpectArenaMapFieldsSet(const MapMessage& message) {
   EXPECT_EQ(2, message.map_int32_int32().size());
   EXPECT_EQ(2, message.map_int64_int64().size());
@@ -377,8 +375,7 @@
 }
 
 template <typename EnumType, EnumType enum_value, typename MapMessage>
-void MapTestUtilImpl::ExpectMapFieldsSetInitialized(
-    const MapMessage& message) {
+void MapTestUtilImpl::ExpectMapFieldsSetInitialized(const MapMessage& message) {
   EXPECT_EQ(1, message.map_int32_int32().size());
   EXPECT_EQ(1, message.map_int64_int64().size());
   EXPECT_EQ(1, message.map_uint32_uint32().size());
@@ -416,10 +413,9 @@
   EXPECT_EQ(0, message.map_int32_foreign_message().at(0).ByteSize());
 }
 
-template <typename EnumType, EnumType enum_value0,
-            EnumType enum_value1, typename MapMessage>
-void MapTestUtilImpl::ExpectMapFieldsModified(
-    const MapMessage& message) {
+template <typename EnumType, EnumType enum_value0, EnumType enum_value1,
+          typename MapMessage>
+void MapTestUtilImpl::ExpectMapFieldsModified(const MapMessage& message) {
   // ModifyMapFields only sets the second element of each field.  In addition to
   // verifying this, we also verify that the first element and size were *not*
   // modified.
diff --git a/src/google/protobuf/map_type_handler.h b/src/google/protobuf/map_type_handler.h
index 0caf1a7..7964a97 100644
--- a/src/google/protobuf/map_type_handler.h
+++ b/src/google/protobuf/map_type_handler.h
@@ -46,15 +46,15 @@
 
 // Used for compile time type selection. MapIf::type will be TrueType if Flag is
 // true and FalseType otherwise.
-template<bool Flag, typename TrueType, typename FalseType>
+template <bool Flag, typename TrueType, typename FalseType>
 struct MapIf;
 
-template<typename TrueType, typename FalseType>
+template <typename TrueType, typename FalseType>
 struct MapIf<true, TrueType, FalseType> {
   typedef TrueType type;
 };
 
-template<typename TrueType, typename FalseType>
+template <typename TrueType, typename FalseType>
 struct MapIf<false, TrueType, FalseType> {
   typedef FalseType type;
 };
@@ -78,7 +78,8 @@
 template <typename Type>
 class MapValueInitializer<false, Type> {
  public:
-  static inline void Initialize(Type& /* value */, int /* default_enum_value */) {}
+  static inline void Initialize(Type& /* value */,
+                                int /* default_enum_value */) {}
 };
 
 template <typename Type, bool is_arena_constructable>
@@ -119,23 +120,23 @@
         WireFormatLite::WIRETYPE_##WireFormatType;                         \
   };
 
-TYPE_TRAITS(MESSAGE , Type, LENGTH_DELIMITED, true, false)
-TYPE_TRAITS(STRING  , ArenaStringPtr, LENGTH_DELIMITED, false, false)
-TYPE_TRAITS(BYTES   , ArenaStringPtr ,  LENGTH_DELIMITED, false, false)
-TYPE_TRAITS(INT64   , int64  ,  VARINT , false, false)
-TYPE_TRAITS(UINT64  , uint64 ,  VARINT , false, false)
-TYPE_TRAITS(INT32   , int32  ,  VARINT , false, false)
-TYPE_TRAITS(UINT32  , uint32 ,  VARINT , false, false)
-TYPE_TRAITS(SINT64  , int64  ,  VARINT , false, false)
-TYPE_TRAITS(SINT32  , int32  ,  VARINT , false, false)
-TYPE_TRAITS(ENUM    , int    ,  VARINT , false, true )
-TYPE_TRAITS(DOUBLE  , double ,  FIXED64, false, false)
-TYPE_TRAITS(FLOAT   , float  ,  FIXED32, false, false)
-TYPE_TRAITS(FIXED64 , uint64 ,  FIXED64, false, false)
-TYPE_TRAITS(FIXED32 , uint32 ,  FIXED32, false, false)
-TYPE_TRAITS(SFIXED64, int64  ,  FIXED64, false, false)
-TYPE_TRAITS(SFIXED32, int32  ,  FIXED32, false, false)
-TYPE_TRAITS(BOOL    , bool   ,  VARINT , false, false)
+TYPE_TRAITS(MESSAGE, Type, LENGTH_DELIMITED, true, false)
+TYPE_TRAITS(STRING, ArenaStringPtr, LENGTH_DELIMITED, false, false)
+TYPE_TRAITS(BYTES, ArenaStringPtr, LENGTH_DELIMITED, false, false)
+TYPE_TRAITS(INT64, int64, VARINT, false, false)
+TYPE_TRAITS(UINT64, uint64, VARINT, false, false)
+TYPE_TRAITS(INT32, int32, VARINT, false, false)
+TYPE_TRAITS(UINT32, uint32, VARINT, false, false)
+TYPE_TRAITS(SINT64, int64, VARINT, false, false)
+TYPE_TRAITS(SINT32, int32, VARINT, false, false)
+TYPE_TRAITS(ENUM, int, VARINT, false, true)
+TYPE_TRAITS(DOUBLE, double, FIXED64, false, false)
+TYPE_TRAITS(FLOAT, float, FIXED32, false, false)
+TYPE_TRAITS(FIXED64, uint64, FIXED64, false, false)
+TYPE_TRAITS(FIXED32, uint32, FIXED32, false, false)
+TYPE_TRAITS(SFIXED64, int64, FIXED64, false, false)
+TYPE_TRAITS(SFIXED32, int32, FIXED32, false, false)
+TYPE_TRAITS(BOOL, bool, VARINT, false, false)
 
 #undef TYPE_TRAITS
 
@@ -148,7 +149,8 @@
   // Enum type cannot be used for MapTypeHandler::Read. Define a type which will
   // replace Enum with int.
   typedef typename MapWireFieldTypeTraits<WireFormatLite::TYPE_MESSAGE,
-      Type>::MapEntryAccessorType MapEntryAccessorType;
+                                          Type>::MapEntryAccessorType
+      MapEntryAccessorType;
   // Internal stored type in MapEntryLite for given wire field type.
   typedef typename MapWireFieldTypeTraits<WireFormatLite::TYPE_MESSAGE,
                                           Type>::TypeOnMemory TypeOnMemory;
@@ -198,8 +200,8 @@
   static inline void AssignDefaultValue(Type** value);
   // Return default instance if value is not initialized when calling const
   // reference accessor.
-  static inline const Type& DefaultIfNotInitialized(
-      const Type* value, const Type* default_value);
+  static inline const Type& DefaultIfNotInitialized(const Type* value,
+                                                    const Type* default_value);
   // Check if all required fields have values set.
   static inline bool IsInitialized(Type* value);
 };
@@ -276,8 +278,7 @@
 #undef MAP_HANDLER
 
 template <typename Type>
-inline size_t
-MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::ByteSize(
+inline size_t MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::ByteSize(
     const MapEntryAccessorType& value) {
   return WireFormatLite::MessageSizeNoVirtual(value);
 }
@@ -290,14 +291,14 @@
   }
 
 GOOGLE_PROTOBUF_BYTE_SIZE(STRING, String)
-GOOGLE_PROTOBUF_BYTE_SIZE(BYTES , Bytes)
-GOOGLE_PROTOBUF_BYTE_SIZE(INT64 , Int64)
+GOOGLE_PROTOBUF_BYTE_SIZE(BYTES, Bytes)
+GOOGLE_PROTOBUF_BYTE_SIZE(INT64, Int64)
 GOOGLE_PROTOBUF_BYTE_SIZE(UINT64, UInt64)
-GOOGLE_PROTOBUF_BYTE_SIZE(INT32 , Int32)
+GOOGLE_PROTOBUF_BYTE_SIZE(INT32, Int32)
 GOOGLE_PROTOBUF_BYTE_SIZE(UINT32, UInt32)
 GOOGLE_PROTOBUF_BYTE_SIZE(SINT64, SInt64)
 GOOGLE_PROTOBUF_BYTE_SIZE(SINT32, SInt32)
-GOOGLE_PROTOBUF_BYTE_SIZE(ENUM  , Enum)
+GOOGLE_PROTOBUF_BYTE_SIZE(ENUM, Enum)
 
 #undef GOOGLE_PROTOBUF_BYTE_SIZE
 
@@ -308,23 +309,21 @@
     return WireFormatLite::k##DeclaredType##Size;                              \
   }
 
-FIXED_BYTE_SIZE(DOUBLE  , Double)
-FIXED_BYTE_SIZE(FLOAT   , Float)
-FIXED_BYTE_SIZE(FIXED64 , Fixed64)
-FIXED_BYTE_SIZE(FIXED32 , Fixed32)
+FIXED_BYTE_SIZE(DOUBLE, Double)
+FIXED_BYTE_SIZE(FLOAT, Float)
+FIXED_BYTE_SIZE(FIXED64, Fixed64)
+FIXED_BYTE_SIZE(FIXED32, Fixed32)
 FIXED_BYTE_SIZE(SFIXED64, SFixed64)
 FIXED_BYTE_SIZE(SFIXED32, SFixed32)
-FIXED_BYTE_SIZE(BOOL    , Bool)
+FIXED_BYTE_SIZE(BOOL, Bool)
 
 #undef FIXED_BYTE_SIZE
 
 template <typename Type>
-inline int
-MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::GetCachedSize(
+inline int MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::GetCachedSize(
     const MapEntryAccessorType& value) {
-  return static_cast<int>(
-      WireFormatLite::LengthDelimitedSize(
-          static_cast<size_t>(value.GetCachedSize())));
+  return static_cast<int>(WireFormatLite::LengthDelimitedSize(
+      static_cast<size_t>(value.GetCachedSize())));
 }
 
 #define GET_CACHED_SIZE(FieldType, DeclaredType)                         \
@@ -336,14 +335,14 @@
   }
 
 GET_CACHED_SIZE(STRING, String)
-GET_CACHED_SIZE(BYTES , Bytes)
-GET_CACHED_SIZE(INT64 , Int64)
+GET_CACHED_SIZE(BYTES, Bytes)
+GET_CACHED_SIZE(INT64, Int64)
 GET_CACHED_SIZE(UINT64, UInt64)
-GET_CACHED_SIZE(INT32 , Int32)
+GET_CACHED_SIZE(INT32, Int32)
 GET_CACHED_SIZE(UINT32, UInt32)
 GET_CACHED_SIZE(SINT64, SInt64)
 GET_CACHED_SIZE(SINT32, SInt32)
-GET_CACHED_SIZE(ENUM  , Enum)
+GET_CACHED_SIZE(ENUM, Enum)
 
 #undef GET_CACHED_SIZE
 
@@ -355,13 +354,13 @@
     return WireFormatLite::k##DeclaredType##Size;                        \
   }
 
-GET_FIXED_CACHED_SIZE(DOUBLE  , Double)
-GET_FIXED_CACHED_SIZE(FLOAT   , Float)
-GET_FIXED_CACHED_SIZE(FIXED64 , Fixed64)
-GET_FIXED_CACHED_SIZE(FIXED32 , Fixed32)
+GET_FIXED_CACHED_SIZE(DOUBLE, Double)
+GET_FIXED_CACHED_SIZE(FLOAT, Float)
+GET_FIXED_CACHED_SIZE(FIXED64, Fixed64)
+GET_FIXED_CACHED_SIZE(FIXED32, Fixed32)
 GET_FIXED_CACHED_SIZE(SFIXED64, SFixed64)
 GET_FIXED_CACHED_SIZE(SFIXED32, SFixed32)
-GET_FIXED_CACHED_SIZE(BOOL    , Bool)
+GET_FIXED_CACHED_SIZE(BOOL, Bool)
 
 #undef GET_FIXED_CACHED_SIZE
 
@@ -392,22 +391,22 @@
     return WireFormatLite::Write##DeclaredType##ToArray(field, value, target); \
   }
 
-WRITE_METHOD(STRING  , String)
-WRITE_METHOD(BYTES   , Bytes)
-WRITE_METHOD(INT64   , Int64)
-WRITE_METHOD(UINT64  , UInt64)
-WRITE_METHOD(INT32   , Int32)
-WRITE_METHOD(UINT32  , UInt32)
-WRITE_METHOD(SINT64  , SInt64)
-WRITE_METHOD(SINT32  , SInt32)
-WRITE_METHOD(ENUM    , Enum)
-WRITE_METHOD(DOUBLE  , Double)
-WRITE_METHOD(FLOAT   , Float)
-WRITE_METHOD(FIXED64 , Fixed64)
-WRITE_METHOD(FIXED32 , Fixed32)
+WRITE_METHOD(STRING, String)
+WRITE_METHOD(BYTES, Bytes)
+WRITE_METHOD(INT64, Int64)
+WRITE_METHOD(UINT64, UInt64)
+WRITE_METHOD(INT32, Int32)
+WRITE_METHOD(UINT32, UInt32)
+WRITE_METHOD(SINT64, SInt64)
+WRITE_METHOD(SINT32, SInt32)
+WRITE_METHOD(ENUM, Enum)
+WRITE_METHOD(DOUBLE, Double)
+WRITE_METHOD(FLOAT, Float)
+WRITE_METHOD(FIXED64, Fixed64)
+WRITE_METHOD(FIXED32, Fixed32)
 WRITE_METHOD(SFIXED64, SFixed64)
 WRITE_METHOD(SFIXED32, SFixed32)
-WRITE_METHOD(BOOL    , Bool)
+WRITE_METHOD(BOOL, Bool)
 
 #undef WRITE_METHOD
 
@@ -554,8 +553,8 @@
 
 template <typename Type>
 inline const Type&
-MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
-                        Type>::GetExternalReference(const Type* value) {
+MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::GetExternalReference(
+    const Type* value) {
   return *value;
 }
 
@@ -578,10 +577,8 @@
 }
 template <typename Type>
 inline void
-MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
-                        Type>::ClearMaybeByDefaultEnum(Type** value,
-                                                       Arena* /* arena */,
-                                                       int /* default_enum_value */) {
+MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::ClearMaybeByDefaultEnum(
+    Type** value, Arena* /* arena */, int /* default_enum_value */) {
   if (*value != NULL) (*value)->Clear();
 }
 template <typename Type>
@@ -598,14 +595,13 @@
 
 template <typename Type>
 inline void MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
-                                    Type>::AssignDefaultValue(Type** value) {
+                           Type>::AssignDefaultValue(Type** value) {
   *value = const_cast<Type*>(Type::internal_default_instance());
 }
 
 template <typename Type>
-inline void MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
-                                    Type>::Initialize(Type** x,
-                                                      Arena* /* arena */) {
+inline void MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::Initialize(
+    Type** x, Arena* /* arena */) {
   *x = NULL;
 }
 
@@ -617,26 +613,26 @@
 }
 
 template <typename Type>
-inline Type* MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
-                                     Type>::EnsureMutable(Type** value,
-                                                          Arena* arena) {
+inline Type* MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::EnsureMutable(
+    Type** value, Arena* arena) {
   if (*value == NULL) {
-    *value =
-        MapArenaMessageCreator<Type, Arena::is_arena_constructable<Type>::
-                                         type::value>::CreateMessage(arena);
+    *value = MapArenaMessageCreator<
+        Type,
+        Arena::is_arena_constructable<Type>::type::value>::CreateMessage(arena);
   }
   return *value;
 }
 
 template <typename Type>
-inline const Type& MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::
-    DefaultIfNotInitialized(const Type* value, const Type* default_value) {
+inline const Type&
+MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::DefaultIfNotInitialized(
+    const Type* value, const Type* default_value) {
   return value != NULL ? *value : *default_value;
 }
 
 template <typename Type>
-inline bool MapTypeHandler<WireFormatLite::TYPE_MESSAGE,
-                                    Type>::IsInitialized(Type* value) {
+inline bool MapTypeHandler<WireFormatLite::TYPE_MESSAGE, Type>::IsInitialized(
+    Type* value) {
   return value->IsInitialized();
 }
 
@@ -730,82 +726,81 @@
 STRING_OR_BYTES_HANDLER_FUNCTIONS(BYTES)
 #undef STRING_OR_BYTES_HANDLER_FUNCTIONS
 
-#define PRIMITIVE_HANDLER_FUNCTIONS(FieldType)                                 \
-  template <typename Type>                                                     \
-  inline const typename MapTypeHandler<WireFormatLite::TYPE_##FieldType,       \
-                                       Type>::MapEntryAccessorType&            \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
-                 Type>::GetExternalReference(const TypeOnMemory& value) {      \
-    return value;                                                              \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline size_t                                                                \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
-                 Type>::SpaceUsedInMapEntryLong(const TypeOnMemory& /* value */) {   \
-    return 0;                                                                  \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline size_t                                                                \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::SpaceUsedInMapLong(  \
-      const TypeOnMemory& /* value */) {                                       \
-    return sizeof(Type);                                                       \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Clear(   \
-      TypeOnMemory* value, Arena* /* arena */) {                               \
-    *value = 0;                                                                \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::         \
-      ClearMaybeByDefaultEnum(TypeOnMemory* value, Arena* /* arena */,         \
-                              int default_enum_value) {                        \
-    *value = static_cast<TypeOnMemory>(default_enum_value);                    \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Merge(   \
-      const MapEntryAccessorType& from, TypeOnMemory* to,                      \
-      Arena* /* arena */) {                                                    \
-    *to = from;                                                                \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType,                 \
-                             Type>::DeleteNoArena(TypeOnMemory& /* x */) {}    \
-  template <typename Type>                                                     \
-  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType,                 \
-                             Type>::AssignDefaultValue(TypeOnMemory* /* value */) {} \
-  template <typename Type>                                                     \
-  inline void                                                                  \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Initialize(          \
-      TypeOnMemory* value, Arena* /* arena */) {                               \
-    *value = 0;                                                                \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::         \
-      InitializeMaybeByDefaultEnum(TypeOnMemory* value,                        \
-                                   int default_enum_value,                     \
-                                   Arena* /* arena */) {                       \
-    *value = static_cast<TypeOnMemory>(default_enum_value);                    \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline typename MapTypeHandler<WireFormatLite::TYPE_##FieldType,             \
-                                 Type>::MapEntryAccessorType*                  \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::EnsureMutable(       \
-      TypeOnMemory* value, Arena* /* arena */) {                               \
-    return value;                                                              \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline const typename MapTypeHandler<WireFormatLite::TYPE_##FieldType,       \
-                                       Type>::MapEntryAccessorType&            \
-  MapTypeHandler<WireFormatLite::TYPE_##FieldType,                             \
-                 Type>::DefaultIfNotInitialized(const TypeOnMemory& value,     \
-                                                const TypeOnMemory&            \
-                                                   /* default_value */) {      \
-    return value;                                                              \
-  }                                                                            \
-  template <typename Type>                                                     \
-  inline bool MapTypeHandler<WireFormatLite::TYPE_##FieldType,                 \
-                             Type>::IsInitialized(const TypeOnMemory& /* value */) { \
-    return true;                                                               \
+#define PRIMITIVE_HANDLER_FUNCTIONS(FieldType)                                \
+  template <typename Type>                                                    \
+  inline const typename MapTypeHandler<WireFormatLite::TYPE_##FieldType,      \
+                                       Type>::MapEntryAccessorType&           \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType,                            \
+                 Type>::GetExternalReference(const TypeOnMemory& value) {     \
+    return value;                                                             \
+  }                                                                           \
+  template <typename Type>                                                    \
+  inline size_t MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::      \
+      SpaceUsedInMapEntryLong(const TypeOnMemory& /* value */) {              \
+    return 0;                                                                 \
+  }                                                                           \
+  template <typename Type>                                                    \
+  inline size_t                                                               \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::SpaceUsedInMapLong( \
+      const TypeOnMemory& /* value */) {                                      \
+    return sizeof(Type);                                                      \
+  }                                                                           \
+  template <typename Type>                                                    \
+  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Clear(  \
+      TypeOnMemory* value, Arena* /* arena */) {                              \
+    *value = 0;                                                               \
+  }                                                                           \
+  template <typename Type>                                                    \
+  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::        \
+      ClearMaybeByDefaultEnum(TypeOnMemory* value, Arena* /* arena */,        \
+                              int default_enum_value) {                       \
+    *value = static_cast<TypeOnMemory>(default_enum_value);                   \
+  }                                                                           \
+  template <typename Type>                                                    \
+  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Merge(  \
+      const MapEntryAccessorType& from, TypeOnMemory* to,                     \
+      Arena* /* arena */) {                                                   \
+    *to = from;                                                               \
+  }                                                                           \
+  template <typename Type>                                                    \
+  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType,                \
+                             Type>::DeleteNoArena(TypeOnMemory& /* x */) {}   \
+  template <typename Type>                                                    \
+  inline void                                                                 \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::AssignDefaultValue( \
+      TypeOnMemory* /* value */) {}                                           \
+  template <typename Type>                                                    \
+  inline void                                                                 \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::Initialize(         \
+      TypeOnMemory* value, Arena* /* arena */) {                              \
+    *value = 0;                                                               \
+  }                                                                           \
+  template <typename Type>                                                    \
+  inline void MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::        \
+      InitializeMaybeByDefaultEnum(                                           \
+          TypeOnMemory* value, int default_enum_value, Arena* /* arena */) {  \
+    *value = static_cast<TypeOnMemory>(default_enum_value);                   \
+  }                                                                           \
+  template <typename Type>                                                    \
+  inline typename MapTypeHandler<WireFormatLite::TYPE_##FieldType,            \
+                                 Type>::MapEntryAccessorType*                 \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::EnsureMutable(      \
+      TypeOnMemory* value, Arena* /* arena */) {                              \
+    return value;                                                             \
+  }                                                                           \
+  template <typename Type>                                                    \
+  inline const typename MapTypeHandler<WireFormatLite::TYPE_##FieldType,      \
+                                       Type>::MapEntryAccessorType&           \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::                    \
+      DefaultIfNotInitialized(const TypeOnMemory& value,                      \
+                              const TypeOnMemory& /* default_value */) {      \
+    return value;                                                             \
+  }                                                                           \
+  template <typename Type>                                                    \
+  inline bool                                                                 \
+  MapTypeHandler<WireFormatLite::TYPE_##FieldType, Type>::IsInitialized(      \
+      const TypeOnMemory& /* value */) {                                      \
+    return true;                                                              \
   }
 PRIMITIVE_HANDLER_FUNCTIONS(INT64)
 PRIMITIVE_HANDLER_FUNCTIONS(UINT64)
diff --git a/src/google/protobuf/message.h b/src/google/protobuf/message.h
index 2528413..e274383 100644
--- a/src/google/protobuf/message.h
+++ b/src/google/protobuf/message.h
@@ -149,37 +149,37 @@
 namespace internal {
 class MapFieldBase;
 }
-class UnknownFieldSet;         // unknown_field_set.h
+class UnknownFieldSet;  // unknown_field_set.h
 namespace io {
-class ZeroCopyInputStream;     // zero_copy_stream.h
-class ZeroCopyOutputStream;    // zero_copy_stream.h
-class CodedInputStream;        // coded_stream.h
-class CodedOutputStream;       // coded_stream.h
-}
+class ZeroCopyInputStream;   // zero_copy_stream.h
+class ZeroCopyOutputStream;  // zero_copy_stream.h
+class CodedInputStream;      // coded_stream.h
+class CodedOutputStream;     // coded_stream.h
+}  // namespace io
 namespace python {
-class MapReflectionFriend;     // scalar_map_container.h
+class MapReflectionFriend;  // scalar_map_container.h
 }
 namespace expr {
 class CelMapReflectionFriend;  // field_backed_map_impl.cc
 }
 
 namespace internal {
-class MapFieldPrinterHelper;   // text_format.cc
+class MapFieldPrinterHelper;  // text_format.cc
 }
 
 
 namespace internal {
-class ReflectionAccessor;  // message.cc
-class ReflectionOps;     // reflection_ops.h
-class MapKeySorter;      // wire_format.cc
-class WireFormat;        // wire_format.h
+class ReflectionAccessor;      // message.cc
+class ReflectionOps;           // reflection_ops.h
+class MapKeySorter;            // wire_format.cc
+class WireFormat;              // wire_format.h
 class MapFieldReflectionTest;  // map_test.cc
-}
+}  // namespace internal
 
-template<typename T>
-class RepeatedField;     // repeated_field.h
+template <typename T>
+class RepeatedField;  // repeated_field.h
 
-template<typename T>
+template <typename T>
 class RepeatedPtrField;  // repeated_field.h
 
 // A container to hold message metadata.
@@ -342,7 +342,6 @@
   virtual void SetCachedSize(int size) const;
 
  public:
-
   // Introspection ---------------------------------------------------
 
 
@@ -366,7 +365,7 @@
   // Get a struct containing the metadata for the Message. Most subclasses only
   // need to implement this method, rather than the GetDescriptor() and
   // GetReflection() wrappers.
-  virtual Metadata GetMetadata() const  = 0;
+  virtual Metadata GetMetadata() const = 0;
 
 
  private:
@@ -381,10 +380,10 @@
 
 // Forward-declare RepeatedFieldRef templates. The second type parameter is
 // used for SFINAE tricks. Users should ignore it.
-template<typename T, typename Enable = void>
+template <typename T, typename Enable = void>
 class RepeatedFieldRef;
 
-template<typename T, typename Enable = void>
+template <typename T, typename Enable = void>
 class MutableRepeatedFieldRef;
 
 // This interface contains methods that can be used to dynamically access
@@ -499,16 +498,13 @@
   virtual void Swap(Message* message1, Message* message2) const = 0;
 
   // Swap fields listed in fields vector of two messages.
-  virtual void SwapFields(Message* message1,
-                          Message* message2,
-                          const std::vector<const FieldDescriptor*>& fields)
-      const = 0;
+  virtual void SwapFields(
+      Message* message1, Message* message2,
+      const std::vector<const FieldDescriptor*>& fields) const = 0;
 
   // Swap two elements of a repeated field.
-  virtual void SwapElements(Message* message,
-                            const FieldDescriptor* field,
-                            int index1,
-                            int index2) const = 0;
+  virtual void SwapElements(Message* message, const FieldDescriptor* field,
+                            int index1, int index2) const = 0;
 
   // List all fields of the message which are currently set, except for unknown
   // fields, but including extension known to the parser (i.e. compiled in).
@@ -526,20 +522,20 @@
   // These get the value of a non-repeated field.  They return the default
   // value for fields that aren't set.
 
-  virtual int32  GetInt32 (const Message& message,
-                           const FieldDescriptor* field) const = 0;
-  virtual int64  GetInt64 (const Message& message,
-                           const FieldDescriptor* field) const = 0;
+  virtual int32 GetInt32(const Message& message,
+                         const FieldDescriptor* field) const = 0;
+  virtual int64 GetInt64(const Message& message,
+                         const FieldDescriptor* field) const = 0;
   virtual uint32 GetUInt32(const Message& message,
                            const FieldDescriptor* field) const = 0;
   virtual uint64 GetUInt64(const Message& message,
                            const FieldDescriptor* field) const = 0;
-  virtual float  GetFloat (const Message& message,
-                           const FieldDescriptor* field) const = 0;
+  virtual float GetFloat(const Message& message,
+                         const FieldDescriptor* field) const = 0;
   virtual double GetDouble(const Message& message,
                            const FieldDescriptor* field) const = 0;
-  virtual bool   GetBool  (const Message& message,
-                           const FieldDescriptor* field) const = 0;
+  virtual bool GetBool(const Message& message,
+                       const FieldDescriptor* field) const = 0;
   virtual std::string GetString(const Message& message,
                                 const FieldDescriptor* field) const = 0;
   virtual const EnumValueDescriptor* GetEnum(
@@ -550,8 +546,8 @@
   // known value descriptor, a new value descriptor is created. (Such a value
   // will only be present when the new unknown-enum-value semantics are enabled
   // for a message.)
-  virtual int GetEnumValue(
-      const Message& message, const FieldDescriptor* field) const = 0;
+  virtual int GetEnumValue(const Message& message,
+                           const FieldDescriptor* field) const = 0;
 
   // See MutableMessage() for the meaning of the "factory" parameter.
   virtual const Message& GetMessage(const Message& message,
@@ -581,25 +577,24 @@
   // Singular field mutators -----------------------------------------
   // These mutate the value of a non-repeated field.
 
-  virtual void SetInt32 (Message* message,
-                         const FieldDescriptor* field, int32  value) const = 0;
-  virtual void SetInt64 (Message* message,
-                         const FieldDescriptor* field, int64  value) const = 0;
-  virtual void SetUInt32(Message* message,
-                         const FieldDescriptor* field, uint32 value) const = 0;
-  virtual void SetUInt64(Message* message,
-                         const FieldDescriptor* field, uint64 value) const = 0;
-  virtual void SetFloat (Message* message,
-                         const FieldDescriptor* field, float  value) const = 0;
-  virtual void SetDouble(Message* message,
-                         const FieldDescriptor* field, double value) const = 0;
-  virtual void SetBool  (Message* message,
-                         const FieldDescriptor* field, bool   value) const = 0;
+  virtual void SetInt32(Message* message, const FieldDescriptor* field,
+                        int32 value) const = 0;
+  virtual void SetInt64(Message* message, const FieldDescriptor* field,
+                        int64 value) const = 0;
+  virtual void SetUInt32(Message* message, const FieldDescriptor* field,
+                         uint32 value) const = 0;
+  virtual void SetUInt64(Message* message, const FieldDescriptor* field,
+                         uint64 value) const = 0;
+  virtual void SetFloat(Message* message, const FieldDescriptor* field,
+                        float value) const = 0;
+  virtual void SetDouble(Message* message, const FieldDescriptor* field,
+                         double value) const = 0;
+  virtual void SetBool(Message* message, const FieldDescriptor* field,
+                       bool value) const = 0;
   virtual void SetString(Message* message, const FieldDescriptor* field,
                          const std::string& value) const = 0;
-  virtual void SetEnum  (Message* message,
-                         const FieldDescriptor* field,
-                         const EnumValueDescriptor* value) const = 0;
+  virtual void SetEnum(Message* message, const FieldDescriptor* field,
+                       const EnumValueDescriptor* value) const = 0;
   // Set an enum field's value with an integer rather than EnumValueDescriptor.
   // For proto3 this is just setting the enum field to the value specified, for
   // proto2 it's more complicated. If value is a known enum value the field is
@@ -607,8 +602,7 @@
   // set. Note this matches the behavior of parsing unknown enum values.
   // If multiple calls with unknown values happen than they are all added to the
   // unknown field set in order of the calls.
-  virtual void SetEnumValue(Message* message,
-                            const FieldDescriptor* field,
+  virtual void SetEnumValue(Message* message, const FieldDescriptor* field,
                             int value) const = 0;
 
   // Get a mutable pointer to a field with a message type.  If a MessageFactory
@@ -628,8 +622,7 @@
   // sub_message, passing ownership to the message.  If the field contained a
   // message, that message is deleted.  If sub_message is NULL, the field is
   // cleared.
-  virtual void SetAllocatedMessage(Message* message,
-                                   Message* sub_message,
+  virtual void SetAllocatedMessage(Message* message, Message* sub_message,
                                    const FieldDescriptor* field) const = 0;
   // Releases the message specified by 'field' and returns the pointer,
   // ReleaseMessage() will return the message the message object if it exists.
@@ -646,44 +639,44 @@
   // Repeated field getters ------------------------------------------
   // These get the value of one element of a repeated field.
 
-  virtual int32  GetRepeatedInt32 (const Message& message,
-                                   const FieldDescriptor* field,
-                                   int index) const = 0;
-  virtual int64  GetRepeatedInt64 (const Message& message,
-                                   const FieldDescriptor* field,
-                                   int index) const = 0;
+  virtual int32 GetRepeatedInt32(const Message& message,
+                                 const FieldDescriptor* field,
+                                 int index) const = 0;
+  virtual int64 GetRepeatedInt64(const Message& message,
+                                 const FieldDescriptor* field,
+                                 int index) const = 0;
   virtual uint32 GetRepeatedUInt32(const Message& message,
                                    const FieldDescriptor* field,
                                    int index) const = 0;
   virtual uint64 GetRepeatedUInt64(const Message& message,
                                    const FieldDescriptor* field,
                                    int index) const = 0;
-  virtual float  GetRepeatedFloat (const Message& message,
-                                   const FieldDescriptor* field,
-                                   int index) const = 0;
+  virtual float GetRepeatedFloat(const Message& message,
+                                 const FieldDescriptor* field,
+                                 int index) const = 0;
   virtual double GetRepeatedDouble(const Message& message,
                                    const FieldDescriptor* field,
                                    int index) const = 0;
-  virtual bool   GetRepeatedBool  (const Message& message,
-                                   const FieldDescriptor* field,
-                                   int index) const = 0;
+  virtual bool GetRepeatedBool(const Message& message,
+                               const FieldDescriptor* field,
+                               int index) const = 0;
   virtual std::string GetRepeatedString(const Message& message,
                                         const FieldDescriptor* field,
                                         int index) const = 0;
   virtual const EnumValueDescriptor* GetRepeatedEnum(
-      const Message& message,
-      const FieldDescriptor* field, int index) const = 0;
+      const Message& message, const FieldDescriptor* field,
+      int index) const = 0;
   // GetRepeatedEnumValue() returns an enum field's value as an integer rather
   // than an EnumValueDescriptor*. If the integer value does not correspond to a
   // known value descriptor, a new value descriptor is created. (Such a value
   // will only be present when the new unknown-enum-value semantics are enabled
   // for a message.)
-  virtual int GetRepeatedEnumValue(
-      const Message& message,
-      const FieldDescriptor* field, int index) const = 0;
-  virtual const Message& GetRepeatedMessage(
-      const Message& message,
-      const FieldDescriptor* field, int index) const = 0;
+  virtual int GetRepeatedEnumValue(const Message& message,
+                                   const FieldDescriptor* field,
+                                   int index) const = 0;
+  virtual const Message& GetRepeatedMessage(const Message& message,
+                                            const FieldDescriptor* field,
+                                            int index) const = 0;
 
   // See GetStringReference(), above.
   virtual const std::string& GetRepeatedStringReference(
@@ -694,31 +687,24 @@
   // Repeated field mutators -----------------------------------------
   // These mutate the value of one element of a repeated field.
 
-  virtual void SetRepeatedInt32 (Message* message,
-                                 const FieldDescriptor* field,
-                                 int index, int32  value) const = 0;
-  virtual void SetRepeatedInt64 (Message* message,
-                                 const FieldDescriptor* field,
-                                 int index, int64  value) const = 0;
-  virtual void SetRepeatedUInt32(Message* message,
-                                 const FieldDescriptor* field,
+  virtual void SetRepeatedInt32(Message* message, const FieldDescriptor* field,
+                                int index, int32 value) const = 0;
+  virtual void SetRepeatedInt64(Message* message, const FieldDescriptor* field,
+                                int index, int64 value) const = 0;
+  virtual void SetRepeatedUInt32(Message* message, const FieldDescriptor* field,
                                  int index, uint32 value) const = 0;
-  virtual void SetRepeatedUInt64(Message* message,
-                                 const FieldDescriptor* field,
+  virtual void SetRepeatedUInt64(Message* message, const FieldDescriptor* field,
                                  int index, uint64 value) const = 0;
-  virtual void SetRepeatedFloat (Message* message,
-                                 const FieldDescriptor* field,
-                                 int index, float  value) const = 0;
-  virtual void SetRepeatedDouble(Message* message,
-                                 const FieldDescriptor* field,
+  virtual void SetRepeatedFloat(Message* message, const FieldDescriptor* field,
+                                int index, float value) const = 0;
+  virtual void SetRepeatedDouble(Message* message, const FieldDescriptor* field,
                                  int index, double value) const = 0;
-  virtual void SetRepeatedBool  (Message* message,
-                                 const FieldDescriptor* field,
-                                 int index, bool   value) const = 0;
+  virtual void SetRepeatedBool(Message* message, const FieldDescriptor* field,
+                               int index, bool value) const = 0;
   virtual void SetRepeatedString(Message* message, const FieldDescriptor* field,
                                  int index, const std::string& value) const = 0;
-  virtual void SetRepeatedEnum(Message* message,
-                               const FieldDescriptor* field, int index,
+  virtual void SetRepeatedEnum(Message* message, const FieldDescriptor* field,
+                               int index,
                                const EnumValueDescriptor* value) const = 0;
   // Set an enum field's value with an integer rather than EnumValueDescriptor.
   // For proto3 this is just setting the enum field to the value specified, for
@@ -732,32 +718,32 @@
                                     int value) const = 0;
   // Get a mutable pointer to an element of a repeated field with a message
   // type.
-  virtual Message* MutableRepeatedMessage(
-      Message* message, const FieldDescriptor* field, int index) const = 0;
+  virtual Message* MutableRepeatedMessage(Message* message,
+                                          const FieldDescriptor* field,
+                                          int index) const = 0;
 
 
   // Repeated field adders -------------------------------------------
   // These add an element to a repeated field.
 
-  virtual void AddInt32 (Message* message,
-                         const FieldDescriptor* field, int32  value) const = 0;
-  virtual void AddInt64 (Message* message,
-                         const FieldDescriptor* field, int64  value) const = 0;
-  virtual void AddUInt32(Message* message,
-                         const FieldDescriptor* field, uint32 value) const = 0;
-  virtual void AddUInt64(Message* message,
-                         const FieldDescriptor* field, uint64 value) const = 0;
-  virtual void AddFloat (Message* message,
-                         const FieldDescriptor* field, float  value) const = 0;
-  virtual void AddDouble(Message* message,
-                         const FieldDescriptor* field, double value) const = 0;
-  virtual void AddBool  (Message* message,
-                         const FieldDescriptor* field, bool   value) const = 0;
+  virtual void AddInt32(Message* message, const FieldDescriptor* field,
+                        int32 value) const = 0;
+  virtual void AddInt64(Message* message, const FieldDescriptor* field,
+                        int64 value) const = 0;
+  virtual void AddUInt32(Message* message, const FieldDescriptor* field,
+                         uint32 value) const = 0;
+  virtual void AddUInt64(Message* message, const FieldDescriptor* field,
+                         uint64 value) const = 0;
+  virtual void AddFloat(Message* message, const FieldDescriptor* field,
+                        float value) const = 0;
+  virtual void AddDouble(Message* message, const FieldDescriptor* field,
+                         double value) const = 0;
+  virtual void AddBool(Message* message, const FieldDescriptor* field,
+                       bool value) const = 0;
   virtual void AddString(Message* message, const FieldDescriptor* field,
                          const std::string& value) const = 0;
-  virtual void AddEnum  (Message* message,
-                         const FieldDescriptor* field,
-                         const EnumValueDescriptor* value) const = 0;
+  virtual void AddEnum(Message* message, const FieldDescriptor* field,
+                       const EnumValueDescriptor* value) const = 0;
   // Add an integer value to a repeated enum field rather than
   // EnumValueDescriptor. For proto3 this is just setting the enum field to the
   // value specified, for proto2 it's more complicated. If value is a known enum
@@ -765,12 +751,10 @@
   // to the unknown field set. Note this matches the behavior of parsing unknown
   // enum values. If multiple calls with unknown values happen than they are all
   // added to the unknown field set in order of the calls.
-  virtual void AddEnumValue(Message* message,
-                            const FieldDescriptor* field,
+  virtual void AddEnumValue(Message* message, const FieldDescriptor* field,
                             int value) const = 0;
   // See MutableMessage() for comments on the "factory" parameter.
-  virtual Message* AddMessage(Message* message,
-                              const FieldDescriptor* field,
+  virtual Message* AddMessage(Message* message, const FieldDescriptor* field,
                               MessageFactory* factory = NULL) const = 0;
 
   // Appends an already-allocated object 'new_entry' to the repeated field
@@ -806,13 +790,13 @@
   // Note that to use this method users need to include the header file
   // "net/proto2/public/reflection.h" (which defines the RepeatedFieldRef
   // class templates).
-  template<typename T>
-  RepeatedFieldRef<T> GetRepeatedFieldRef(
-      const Message& message, const FieldDescriptor* field) const;
+  template <typename T>
+  RepeatedFieldRef<T> GetRepeatedFieldRef(const Message& message,
+                                          const FieldDescriptor* field) const;
 
   // Like GetRepeatedFieldRef() but return an object that can also be used
   // manipulate the underlying repeated field.
-  template<typename T>
+  template <typename T>
   MutableRepeatedFieldRef<T> GetMutableRepeatedFieldRef(
       Message* message, const FieldDescriptor* field) const;
 
@@ -936,8 +920,8 @@
       const Message& message, const FieldDescriptor* field,
       FieldDescriptor::CppType cpptype, int ctype,
       const Descriptor* message_type) const {
-    return MutableRawRepeatedField(
-        const_cast<Message*>(&message), field, cpptype, ctype, message_type);
+    return MutableRawRepeatedField(const_cast<Message*>(&message), field,
+                                   cpptype, ctype, message_type);
   }
 
   // The following methods are used to implement (Mutable)RepeatedFieldRef.
@@ -956,10 +940,10 @@
   // "cpp_type"/"message_type" is consistent with the actual type of the field.
   // We use 1 routine rather than 2 (const vs mutable) because it is protected
   // and it doesn't change the message.
-  virtual void* RepeatedFieldData(
-      Message* message, const FieldDescriptor* field,
-      FieldDescriptor::CppType cpp_type,
-      const Descriptor* message_type) const;
+  virtual void* RepeatedFieldData(Message* message,
+                                  const FieldDescriptor* field,
+                                  FieldDescriptor::CppType cpp_type,
+                                  const Descriptor* message_type) const;
 
   // The returned pointer should point to a singleton instance which implements
   // the RepeatedFieldAccessor interface.
@@ -967,9 +951,9 @@
       const FieldDescriptor* field) const;
 
  private:
-  template<typename T, typename Enable>
+  template <typename T, typename Enable>
   friend class RepeatedFieldRef;
-  template<typename T, typename Enable>
+  template <typename T, typename Enable>
   friend class MutableRepeatedFieldRef;
   friend class python::MapReflectionFriend;
 #define GOOGLE_PROTOBUF_HAS_CEL_MAP_REFLECTION_FRIEND
@@ -988,8 +972,8 @@
   // file here is not possible because it would cause a circular include cycle.
   // We use 1 routine rather than 2 (const vs mutable) because it is private
   // and mutable a repeated string field doesn't change the message.
-  void* MutableRawRepeatedString(
-      Message* message, const FieldDescriptor* field, bool is_string) const;
+  void* MutableRawRepeatedString(Message* message, const FieldDescriptor* field,
+                                 bool is_string) const;
 
   friend class MapReflectionTester;
   // TODO(jieluo) - make the map APIs pure virtual after updating
@@ -1022,16 +1006,14 @@
   // Returns a MapIterator referring to the first element in the map field.
   // If the map field is empty, this function returns the same as
   // reflection::MapEnd. Mutation to the field may invalidate the iterator.
-  virtual MapIterator MapBegin(
-      Message* message,
-      const FieldDescriptor* field) const;
+  virtual MapIterator MapBegin(Message* message,
+                               const FieldDescriptor* field) const;
 
   // Returns a MapIterator referring to the theoretical element that would
   // follow the last element in the map field. It does not point to any
   // real element. Mutation to the field may invalidate the iterator.
-  virtual MapIterator MapEnd(
-      Message* message,
-      const FieldDescriptor* field) const;
+  virtual MapIterator MapEnd(Message* message,
+                             const FieldDescriptor* field) const;
 
   // Get the number of <key, value> pair of a map field. The result may be
   // different from FieldSize which can have duplicate keys.
@@ -1150,7 +1132,7 @@
 const T* DynamicCastToGenerated(const Message* from) {
   // Compile-time assert that T is a generated type that has a
   // default_instance() accessor, but avoid actually calling it.
-  const T&(*get_default_instance)() = &T::default_instance;
+  const T& (*get_default_instance)() = &T::default_instance;
   (void)get_default_instance;
 
   // Compile-time assert that T is a subclass of google::protobuf::Message.
@@ -1239,38 +1221,34 @@
 
 // -----
 
-template<>
+template <>
 inline const RepeatedPtrField<Message>& Reflection::GetRepeatedPtrField(
     const Message& message, const FieldDescriptor* field) const {
-  return *static_cast<const RepeatedPtrField<Message>* >(
-      GetRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE,
-                          -1, NULL));
+  return *static_cast<const RepeatedPtrField<Message>*>(GetRawRepeatedField(
+      message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, NULL));
 }
 
-template<>
+template <>
 inline RepeatedPtrField<Message>* Reflection::MutableRepeatedPtrField(
     Message* message, const FieldDescriptor* field) const {
-  return static_cast<RepeatedPtrField<Message>* >(
-      MutableRawRepeatedField(message, field,
-          FieldDescriptor::CPPTYPE_MESSAGE, -1,
-          NULL));
+  return static_cast<RepeatedPtrField<Message>*>(MutableRawRepeatedField(
+      message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1, NULL));
 }
 
-template<typename PB>
+template <typename PB>
 inline const RepeatedPtrField<PB>& Reflection::GetRepeatedPtrField(
     const Message& message, const FieldDescriptor* field) const {
-  return *static_cast<const RepeatedPtrField<PB>* >(
-      GetRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE,
-                          -1, PB::default_instance().GetDescriptor()));
+  return *static_cast<const RepeatedPtrField<PB>*>(
+      GetRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE, -1,
+                          PB::default_instance().GetDescriptor()));
 }
 
-template<typename PB>
+template <typename PB>
 inline RepeatedPtrField<PB>* Reflection::MutableRepeatedPtrField(
     Message* message, const FieldDescriptor* field) const {
-  return static_cast<RepeatedPtrField<PB>* >(
-      MutableRawRepeatedField(message, field,
-          FieldDescriptor::CPPTYPE_MESSAGE, -1,
-          PB::default_instance().GetDescriptor()));
+  return static_cast<RepeatedPtrField<PB>*>(
+      MutableRawRepeatedField(message, field, FieldDescriptor::CPPTYPE_MESSAGE,
+                              -1, PB::default_instance().GetDescriptor()));
 }
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/message_lite.cc b/src/google/protobuf/message_lite.cc
index f531a7c..e8f1344 100644
--- a/src/google/protobuf/message_lite.cc
+++ b/src/google/protobuf/message_lite.cc
@@ -147,13 +147,13 @@
 
 template <bool aliasing>
 bool MergePartialFromImpl(BoundedZCIS input, MessageLite* msg) {
-  // We must prevent reading more than limit from the input. Due to the nature
-  // of EpsCopyInputStream the stream will always read kSlopBytes ahead of
-  // the parser, we can't always backup so we must prevent from reading past
-  // limit in the first place.
-  io::LimitingInputStream zcis(input.zcis, input.limit);
-  return MergePartialFromImpl<aliasing>(&zcis, msg) &&
-         zcis.ByteCount() == input.limit;
+  const char* ptr;
+  internal::ParseContext ctx(io::CodedInputStream::GetDefaultRecursionLimit(),
+                             aliasing, &ptr, input.zcis, input.limit);
+  ptr = msg->_InternalParse(ptr, &ctx);
+  if (PROTOBUF_PREDICT_FALSE(!ptr)) return false;
+  ctx.BackUp(ptr);
+  return ctx.EndedAtLimit();
 }
 
 #else  // !GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
@@ -276,8 +276,8 @@
   return ParseFrom<kParsePartial>(input);
 }
 
-bool MessageLite::MergePartialFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input,
-                                                 int size) {
+bool MessageLite::MergePartialFromBoundedZeroCopyStream(
+    io::ZeroCopyInputStream* input, int size) {
   return ParseFrom<kMergePartial>(internal::BoundedZCIS{input, size});
 }
 
diff --git a/src/google/protobuf/message_lite.h b/src/google/protobuf/message_lite.h
index 8deb143..bc5d4c7 100644
--- a/src/google/protobuf/message_lite.h
+++ b/src/google/protobuf/message_lite.h
@@ -122,13 +122,9 @@
 template <typename T>
 class ExplicitlyConstructed {
  public:
-  void DefaultConstruct() {
-    new (&union_) T();
-  }
+  void DefaultConstruct() { new (&union_) T(); }
 
-  void Destruct() {
-    get_mutable()->~T();
-  }
+  void Destruct() { get_mutable()->~T(); }
 
   constexpr const T& get() const { return reinterpret_cast<const T&>(union_); }
   T* get_mutable() { return reinterpret_cast<T*>(&union_); }
@@ -244,9 +240,7 @@
   // The format of the returned string is subject to change, so please do not
   // assume it will remain stable over time.
   std::string DebugString() const;
-  std::string ShortDebugString() const {
-    return DebugString();
-  }
+  std::string ShortDebugString() const { return DebugString(); }
 
   // Parsing ---------------------------------------------------------
   // Methods for parsing in protocol buffer format.  Most of these are
@@ -271,11 +265,11 @@
   // Read a protocol buffer from the given zero-copy input stream, expecting
   // the message to be exactly "size" bytes long.  If successful, exactly
   // this many bytes will have been consumed from the input.
-  bool MergePartialFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input, int size);
+  bool MergePartialFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input,
+                                             int size);
   // Like ParseFromBoundedZeroCopyStream(), but accepts messages that are
   // missing required fields.
-  bool MergeFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input,
-                                             int size);
+  bool MergeFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input, int size);
   bool ParseFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input, int size);
   // Like ParseFromBoundedZeroCopyStream(), but accepts messages that are
   // missing required fields.
@@ -316,7 +310,7 @@
   // MergeFromCodedStream() is just implemented as MergePartialFromCodedStream()
   // followed by IsInitialized().
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
-  virtual bool MergePartialFromCodedStream(io::CodedInputStream* input);
+  bool MergePartialFromCodedStream(io::CodedInputStream* input);
 #else
   virtual bool MergePartialFromCodedStream(io::CodedInputStream* input) = 0;
 #endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
@@ -376,15 +370,12 @@
 
   // Legacy ByteSize() API.
   PROTOBUF_DEPRECATED_MSG("Please use ByteSizeLong() instead")
-  int ByteSize() const {
-    return internal::ToIntSize(ByteSizeLong());
-  }
+  int ByteSize() const { return internal::ToIntSize(ByteSizeLong()); }
 
   // Serializes the message without recomputing the size.  The message must not
   // have changed since the last call to ByteSize(), and the value returned by
   // ByteSize must be non-negative.  Otherwise the results are undefined.
-  virtual void SerializeWithCachedSizes(
-      io::CodedOutputStream* output) const;
+  virtual void SerializeWithCachedSizes(io::CodedOutputStream* output) const;
 
   // Functions below here are not part of the public interface.  It isn't
   // enforced, but they should be treated as private, and will be private
diff --git a/src/google/protobuf/message_unittest.inc b/src/google/protobuf/message_unittest.inc
index d61ca7d..0cd46d4 100644
--- a/src/google/protobuf/message_unittest.inc
+++ b/src/google/protobuf/message_unittest.inc
@@ -60,7 +60,8 @@
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
-#include <google/protobuf/stubs/io_win32.h>
+
+#include <google/protobuf/io/io_win32.h>
 
 namespace google {
 namespace protobuf {
@@ -68,8 +69,8 @@
 #if defined(_WIN32)
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
-using google::protobuf::internal::win32::close;
-using google::protobuf::internal::win32::open;
+using google::protobuf::io::win32::close;
+using google::protobuf::io::win32::open;
 #endif
 
 #ifndef O_BINARY
diff --git a/src/google/protobuf/metadata.h b/src/google/protobuf/metadata.h
index 928bbf5..009a7e9 100644
--- a/src/google/protobuf/metadata.h
+++ b/src/google/protobuf/metadata.h
@@ -56,19 +56,15 @@
   InternalMetadataWithArena() {}
   explicit InternalMetadataWithArena(Arena* arena)
       : InternalMetadataWithArenaBase<UnknownFieldSet,
-                                           InternalMetadataWithArena>(arena) {}
+                                      InternalMetadataWithArena>(arena) {}
 
-  void DoSwap(UnknownFieldSet* other) {
-    mutable_unknown_fields()->Swap(other);
-  }
+  void DoSwap(UnknownFieldSet* other) { mutable_unknown_fields()->Swap(other); }
 
   void DoMergeFrom(const UnknownFieldSet& other) {
     mutable_unknown_fields()->MergeFrom(other);
   }
 
-  void DoClear() {
-    mutable_unknown_fields()->Clear();
-  }
+  void DoClear() { mutable_unknown_fields()->Clear(); }
 
   static const UnknownFieldSet& default_instance() {
     return *UnknownFieldSet::default_instance();
diff --git a/src/google/protobuf/metadata_lite.h b/src/google/protobuf/metadata_lite.h
index e0aa52b..40c7ea7 100644
--- a/src/google/protobuf/metadata_lite.h
+++ b/src/google/protobuf/metadata_lite.h
@@ -143,9 +143,10 @@
     return reinterpret_cast<intptr_t>(ptr_) & kPtrTagMask;
   }
 
-  template<typename U> U* PtrValue() const {
-    return reinterpret_cast<U*>(
-        reinterpret_cast<intptr_t>(ptr_) & kPtrValueMask);
+  template <typename U>
+  U* PtrValue() const {
+    return reinterpret_cast<U*>(reinterpret_cast<intptr_t>(ptr_) &
+                                kPtrValueMask);
   }
 
   // If ptr_'s tag is kTagContainer, it points to an instance of this struct.
@@ -160,8 +161,8 @@
     // Two-step assignment works around a bug in clang's static analyzer:
     // https://bugs.llvm.org/show_bug.cgi?id=34198.
     ptr_ = container;
-    ptr_ = reinterpret_cast<void*>(
-        reinterpret_cast<intptr_t>(ptr_) | kTagContainer);
+    ptr_ = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(ptr_) |
+                                   kTagContainer);
     container->arena = my_arena;
     return &(container->unknown_fields);
   }
@@ -187,9 +188,7 @@
     mutable_unknown_fields()->append(other);
   }
 
-  void DoClear() {
-    mutable_unknown_fields()->clear();
-  }
+  void DoClear() { mutable_unknown_fields()->clear(); }
 
   static const std::string& default_instance() {
     // Can't use GetEmptyStringAlreadyInited() here because empty string
diff --git a/src/google/protobuf/no_field_presence_test.cc b/src/google/protobuf/no_field_presence_test.cc
index 9645d3a..8b05277 100644
--- a/src/google/protobuf/no_field_presence_test.cc
+++ b/src/google/protobuf/no_field_presence_test.cc
@@ -30,8 +30,8 @@
 
 #include <string>
 
-#include <google/protobuf/unittest_no_field_presence.pb.h>
 #include <google/protobuf/unittest.pb.h>
+#include <google/protobuf/unittest_no_field_presence.pb.h>
 #include <google/protobuf/descriptor.pb.h>
 #include <google/protobuf/descriptor.h>
 #include <gtest/gtest.h>
@@ -120,8 +120,7 @@
   m->mutable_optional_proto2_message()->set_optional_int32(44);
   m->set_optional_nested_enum(
       proto2_nofieldpresence_unittest::TestAllTypes_NestedEnum_BAZ);
-  m->set_optional_foreign_enum(
-      proto2_nofieldpresence_unittest::FOREIGN_BAZ);
+  m->set_optional_foreign_enum(proto2_nofieldpresence_unittest::FOREIGN_BAZ);
   m->mutable_optional_lazy_message()->set_bb(45);
   m->add_repeated_int32(100);
   m->add_repeated_int64(101);
@@ -143,8 +142,7 @@
   m->add_repeated_proto2_message()->set_optional_int32(48);
   m->add_repeated_nested_enum(
       proto2_nofieldpresence_unittest::TestAllTypes_NestedEnum_BAZ);
-  m->add_repeated_foreign_enum(
-      proto2_nofieldpresence_unittest::FOREIGN_BAZ);
+  m->add_repeated_foreign_enum(proto2_nofieldpresence_unittest::FOREIGN_BAZ);
   m->add_repeated_lazy_message()->set_bb(49);
 
   m->set_oneof_uint32(1);
@@ -153,7 +151,7 @@
 }
 
 void CheckNonDefaultValues(
-const proto2_nofieldpresence_unittest::TestAllTypes& m) {
+    const proto2_nofieldpresence_unittest::TestAllTypes& m) {
   EXPECT_EQ(100, m.optional_int32());
   EXPECT_EQ(101, m.optional_int64());
   EXPECT_EQ(102, m.optional_uint32());
@@ -271,8 +269,9 @@
   EXPECT_EQ(false, message.has_optional_lazy_message());
 
   // Test field presence of a message field on the default instance.
-  EXPECT_EQ(false, proto2_nofieldpresence_unittest::TestAllTypes::
-            default_instance().has_optional_nested_message());
+  EXPECT_EQ(false,
+            proto2_nofieldpresence_unittest::TestAllTypes::default_instance()
+                .has_optional_nested_message());
 }
 
 TEST(NoFieldPresenceTest, ReflectionHasFieldTest) {
@@ -294,9 +293,11 @@
   // Test field presence of a message field on the default instance.
   const FieldDescriptor* msg_field =
       desc->FindFieldByName("optional_nested_message");
-  EXPECT_EQ(false, r->HasField(
-      proto2_nofieldpresence_unittest::TestAllTypes::
-      default_instance(), msg_field));
+  EXPECT_EQ(
+      false,
+      r->HasField(
+          proto2_nofieldpresence_unittest::TestAllTypes::default_instance(),
+          msg_field));
 
   // Fill all fields, expect everything to report true (check oneofs below).
   FillValues(&message);
@@ -441,7 +442,8 @@
   message.set_optional_string("");
   message.set_optional_bytes("");
   message.set_optional_nested_enum(
-      proto2_nofieldpresence_unittest::TestAllTypes_NestedEnum_FOO);  // first enum entry
+      proto2_nofieldpresence_unittest::
+          TestAllTypes_NestedEnum_FOO);  // first enum entry
   message.set_optional_foreign_enum(
       proto2_nofieldpresence_unittest::FOREIGN_FOO);  // first enum entry
 
@@ -554,8 +556,9 @@
             message.oneof_field_case());
 
   message.Clear();
-  message.set_oneof_enum(proto2_nofieldpresence_unittest::
-                         TestAllTypes_NestedEnum_FOO);  // default value.
+  message.set_oneof_enum(
+      proto2_nofieldpresence_unittest::TestAllTypes_NestedEnum_FOO);  // default
+                                                                      // value.
   message.SerializeToString(&serialized);
   EXPECT_EQ(3, serialized.size());
   EXPECT_TRUE(message.ParseFromString(serialized));
@@ -571,4 +574,3 @@
 }  // namespace
 }  // namespace protobuf
 }  // namespace google
-
diff --git a/src/google/protobuf/parse_context.cc b/src/google/protobuf/parse_context.cc
index 2aec32e..9efa521 100644
--- a/src/google/protobuf/parse_context.cc
+++ b/src/google/protobuf/parse_context.cc
@@ -82,8 +82,8 @@
         d++;
         break;
       }
-      case 4: {                     // end group
-        if (--d < 0) return true;   // We exit early
+      case 4: {                    // end group
+        if (--d < 0) return true;  // We exit early
         break;
       }
       case 5: {  // fixed32
@@ -114,11 +114,13 @@
   // Note we must use memmove because the previous buffer could be part of
   // buffer_.
   std::memmove(buffer_, buffer_end_, kSlopBytes);
-  if (zcis_ && (d < 0 || !ParseEndsInSlopRegion(buffer_, overrun, d))) {
+  if (overall_limit_ > 0 &&
+      (d < 0 || !ParseEndsInSlopRegion(buffer_, overrun, d))) {
     const void* data;
     // ZeroCopyInputStream indicates Next may return 0 size buffers. Hence
     // we loop.
     while (zcis_->Next(&data, &size_)) {
+      overall_limit_ -= size_;
       if (size_ > kSlopBytes) {
         // We got a large chunk
         std::memcpy(buffer_ + kSlopBytes, data, kSlopBytes);
@@ -135,6 +137,7 @@
       }
       GOOGLE_DCHECK(size_ == 0) << size_;
     }
+    overall_limit_ = 0;  // Next failed, no more needs for next
   }
   // End of stream or array
   if (aliasing_ == kNoDelta) {
@@ -260,6 +263,7 @@
   int size;
   limit_ = INT_MAX;
   if (zcis->Next(&data, &size)) {
+    overall_limit_ -= size;
     if (size > kSlopBytes) {
       auto ptr = static_cast<const char*>(data);
       limit_ -= size - kSlopBytes;
@@ -275,6 +279,7 @@
       return ptr;
     }
   }
+  overall_limit_ = 0;
   next_chunk_ = nullptr;
   size_ = 0;
   limit_end_ = buffer_end_ = buffer_;
@@ -322,7 +327,8 @@
   return {nullptr, 0};
 }
 
-std::pair<const char*, uint64> ParseVarint64Fallback(const char* p, uint64 res) {
+std::pair<const char*, uint64> ParseVarint64Fallback(const char* p,
+                                                     uint64 res) {
   return ParseVarint64FallbackInline(p, res);
 }
 
diff --git a/src/google/protobuf/parse_context.h b/src/google/protobuf/parse_context.h
index 1bf6100..81b9406 100644
--- a/src/google/protobuf/parse_context.h
+++ b/src/google/protobuf/parse_context.h
@@ -190,6 +190,9 @@
     return ptr > limit_end_ &&
            (next_chunk_ == nullptr || ptr - buffer_end_ > limit_);
   }
+  // Returns true if more data is available, if false is returned one has to
+  // call Done for further checks.
+  bool DataAvailable(const char* ptr) { return ptr < limit_end_; }
 
  protected:
   // Returns true is limit (either an explicit limit or end of stream) is
@@ -206,6 +209,7 @@
   }
 
   const char* InitFrom(StringPiece flat) {
+    overall_limit_ = 0;
     if (flat.size() > kSlopBytes) {
       limit_ = kSlopBytes;
       limit_end_ = buffer_end_ = flat.end() - kSlopBytes;
@@ -228,6 +232,7 @@
   const char* InitFrom(io::ZeroCopyInputStream* zcis);
 
   const char* InitFrom(io::ZeroCopyInputStream* zcis, int limit) {
+    overall_limit_ = limit;
     auto res = InitFrom(zcis);
     limit_ = limit - static_cast<int>(buffer_end_ - res);
     limit_end_ = buffer_end_ + (std::min)(0, limit_);
@@ -258,6 +263,7 @@
   // the ParseContext, but case 2 is most easily and optimally implemented in
   // DoneFallback.
   uint32 last_tag_minus_1_ = 0;
+  int overall_limit_ = INT_MAX;  // Overall limit independent of pushed limits.
 
   std::pair<const char*, bool> DoneFallback(const char* ptr, int d);
   const char* Next(int overrun, int d);
diff --git a/src/google/protobuf/preserve_unknown_enum_test.cc b/src/google/protobuf/preserve_unknown_enum_test.cc
index 94addc4..1ac4e13 100644
--- a/src/google/protobuf/preserve_unknown_enum_test.cc
+++ b/src/google/protobuf/preserve_unknown_enum_test.cc
@@ -31,8 +31,8 @@
 #include <google/protobuf/unittest.pb.h>
 #include <google/protobuf/unittest_preserve_unknown_enum.pb.h>
 #include <google/protobuf/unittest_preserve_unknown_enum2.pb.h>
-#include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/descriptor.h>
+#include <google/protobuf/dynamic_message.h>
 #include <gtest/gtest.h>
 
 namespace google {
@@ -41,22 +41,18 @@
 
 void FillMessage(
     proto3_preserve_unknown_enum_unittest::MyMessagePlusExtra* message) {
-  message->set_e(
-      proto3_preserve_unknown_enum_unittest::E_EXTRA);
-  message->add_repeated_e(
-      proto3_preserve_unknown_enum_unittest::E_EXTRA);
+  message->set_e(proto3_preserve_unknown_enum_unittest::E_EXTRA);
+  message->add_repeated_e(proto3_preserve_unknown_enum_unittest::E_EXTRA);
   message->add_repeated_packed_e(
       proto3_preserve_unknown_enum_unittest::E_EXTRA);
   message->add_repeated_packed_unexpected_e(
       proto3_preserve_unknown_enum_unittest::E_EXTRA);
-  message->set_oneof_e_1(
-      proto3_preserve_unknown_enum_unittest::E_EXTRA);
+  message->set_oneof_e_1(proto3_preserve_unknown_enum_unittest::E_EXTRA);
 }
 
 void CheckMessage(
     const proto3_preserve_unknown_enum_unittest::MyMessagePlusExtra& message) {
-  EXPECT_EQ(proto3_preserve_unknown_enum_unittest::E_EXTRA,
-            message.e());
+  EXPECT_EQ(proto3_preserve_unknown_enum_unittest::E_EXTRA, message.e());
   EXPECT_EQ(1, message.repeated_e_size());
   EXPECT_EQ(proto3_preserve_unknown_enum_unittest::E_EXTRA,
             message.repeated_e(0));
@@ -72,23 +68,18 @@
 
 void CheckMessage(
     const proto3_preserve_unknown_enum_unittest::MyMessage& message) {
-  EXPECT_EQ(static_cast<int>(
-              proto3_preserve_unknown_enum_unittest::E_EXTRA),
+  EXPECT_EQ(static_cast<int>(proto3_preserve_unknown_enum_unittest::E_EXTRA),
             static_cast<int>(message.e()));
   EXPECT_EQ(1, message.repeated_e_size());
-  EXPECT_EQ(static_cast<int>(
-              proto3_preserve_unknown_enum_unittest::E_EXTRA),
+  EXPECT_EQ(static_cast<int>(proto3_preserve_unknown_enum_unittest::E_EXTRA),
             static_cast<int>(message.repeated_e(0)));
   EXPECT_EQ(1, message.repeated_packed_e_size());
-  EXPECT_EQ(static_cast<int>(
-              proto3_preserve_unknown_enum_unittest::E_EXTRA),
+  EXPECT_EQ(static_cast<int>(proto3_preserve_unknown_enum_unittest::E_EXTRA),
             static_cast<int>(message.repeated_packed_e(0)));
   EXPECT_EQ(1, message.repeated_packed_unexpected_e_size());
-  EXPECT_EQ(static_cast<int>(
-              proto3_preserve_unknown_enum_unittest::E_EXTRA),
+  EXPECT_EQ(static_cast<int>(proto3_preserve_unknown_enum_unittest::E_EXTRA),
             static_cast<int>(message.repeated_packed_unexpected_e(0)));
-  EXPECT_EQ(static_cast<int>(
-              proto3_preserve_unknown_enum_unittest::E_EXTRA),
+  EXPECT_EQ(static_cast<int>(proto3_preserve_unknown_enum_unittest::E_EXTRA),
             static_cast<int>(message.oneof_e_1()));
 }
 
diff --git a/src/google/protobuf/proto3_arena_lite_unittest.cc b/src/google/protobuf/proto3_arena_lite_unittest.cc
index 9c6d166..e269370 100644
--- a/src/google/protobuf/proto3_arena_lite_unittest.cc
+++ b/src/google/protobuf/proto3_arena_lite_unittest.cc
@@ -52,8 +52,7 @@
   m->mutable_optional_foreign_message()->set_c(43);
   m->set_optional_nested_enum(
       proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ);
-  m->set_optional_foreign_enum(
-      proto3_arena_unittest::FOREIGN_BAZ);
+  m->set_optional_foreign_enum(proto3_arena_unittest::FOREIGN_BAZ);
   m->mutable_optional_lazy_message()->set_bb(45);
   m->add_repeated_int32(100);
   m->add_repeated_string("asdf");
@@ -62,8 +61,7 @@
   m->add_repeated_foreign_message()->set_c(47);
   m->add_repeated_nested_enum(
       proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ);
-  m->add_repeated_foreign_enum(
-      proto3_arena_unittest::FOREIGN_BAZ);
+  m->add_repeated_foreign_enum(proto3_arena_unittest::FOREIGN_BAZ);
   m->add_repeated_lazy_message()->set_bb(49);
 
   m->set_oneof_uint32(1);
@@ -81,8 +79,7 @@
   EXPECT_EQ(43, m.optional_foreign_message().c());
   EXPECT_EQ(proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ,
             m.optional_nested_enum());
-  EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ,
-            m.optional_foreign_enum());
+  EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ, m.optional_foreign_enum());
   EXPECT_EQ(true, m.has_optional_lazy_message());
   EXPECT_EQ(45, m.optional_lazy_message().bb());
 
@@ -100,8 +97,7 @@
   EXPECT_EQ(proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ,
             m.repeated_nested_enum(0));
   EXPECT_EQ(1, m.repeated_foreign_enum_size());
-  EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ,
-            m.repeated_foreign_enum(0));
+  EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ, m.repeated_foreign_enum(0));
   EXPECT_EQ(1, m.repeated_lazy_message_size());
   EXPECT_EQ(49, m.repeated_lazy_message(0).bb());
 
@@ -138,7 +134,7 @@
 
 TEST(Proto3ArenaLiteTest, SetAllocatedMessage) {
   Arena arena;
-  TestAllTypes *arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
+  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
   TestAllTypes::NestedMessage* nested = new TestAllTypes::NestedMessage;
   nested->set_bb(118);
   arena_message->set_allocated_optional_nested_message(nested);
diff --git a/src/google/protobuf/proto3_arena_unittest.cc b/src/google/protobuf/proto3_arena_unittest.cc
index e3c4777..d4b0135 100644
--- a/src/google/protobuf/proto3_arena_unittest.cc
+++ b/src/google/protobuf/proto3_arena_unittest.cc
@@ -54,8 +54,7 @@
   m->mutable_optional_foreign_message()->set_c(43);
   m->set_optional_nested_enum(
       proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ);
-  m->set_optional_foreign_enum(
-      proto3_arena_unittest::FOREIGN_BAZ);
+  m->set_optional_foreign_enum(proto3_arena_unittest::FOREIGN_BAZ);
   m->mutable_optional_lazy_message()->set_bb(45);
   m->add_repeated_int32(100);
   m->add_repeated_string("asdf");
@@ -64,8 +63,7 @@
   m->add_repeated_foreign_message()->set_c(47);
   m->add_repeated_nested_enum(
       proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ);
-  m->add_repeated_foreign_enum(
-      proto3_arena_unittest::FOREIGN_BAZ);
+  m->add_repeated_foreign_enum(proto3_arena_unittest::FOREIGN_BAZ);
   m->add_repeated_lazy_message()->set_bb(49);
 
   m->set_oneof_uint32(1);
@@ -83,8 +81,7 @@
   EXPECT_EQ(43, m.optional_foreign_message().c());
   EXPECT_EQ(proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ,
             m.optional_nested_enum());
-  EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ,
-            m.optional_foreign_enum());
+  EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ, m.optional_foreign_enum());
   EXPECT_EQ(true, m.has_optional_lazy_message());
   EXPECT_EQ(45, m.optional_lazy_message().bb());
 
@@ -102,8 +99,7 @@
   EXPECT_EQ(proto3_arena_unittest::TestAllTypes_NestedEnum_BAZ,
             m.repeated_nested_enum(0));
   EXPECT_EQ(1, m.repeated_foreign_enum_size());
-  EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ,
-            m.repeated_foreign_enum(0));
+  EXPECT_EQ(proto3_arena_unittest::FOREIGN_BAZ, m.repeated_foreign_enum(0));
   EXPECT_EQ(1, m.repeated_lazy_message_size());
   EXPECT_EQ(49, m.repeated_lazy_message(0).bb());
 
@@ -161,7 +157,7 @@
 
 TEST(Proto3ArenaTest, SetAllocatedMessage) {
   Arena arena;
-  TestAllTypes *arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
+  TestAllTypes* arena_message = Arena::CreateMessage<TestAllTypes>(&arena);
   TestAllTypes::NestedMessage* nested = new TestAllTypes::NestedMessage;
   nested->set_bb(118);
   arena_message->set_allocated_optional_nested_message(nested);
@@ -192,8 +188,8 @@
   TestAllTypes* message = Arena::CreateMessage<TestAllTypes>(&arena);
   const Reflection* r = message->GetReflection();
   const Descriptor* d = message->GetDescriptor();
-  const FieldDescriptor* msg_field = d->FindFieldByName(
-      "optional_nested_message");
+  const FieldDescriptor* msg_field =
+      d->FindFieldByName("optional_nested_message");
 
   message->mutable_optional_nested_message()->set_bb(1);
   r->ClearField(message, msg_field);
diff --git a/src/google/protobuf/reflection.h b/src/google/protobuf/reflection.h
index 407ca62..6b1e5f2 100644
--- a/src/google/protobuf/reflection.h
+++ b/src/google/protobuf/reflection.h
@@ -47,39 +47,33 @@
 namespace google {
 namespace protobuf {
 namespace internal {
-template<typename T, typename Enable = void>
+template <typename T, typename Enable = void>
 struct RefTypeTraits;
 }  // namespace internal
 
-template<typename T>
+template <typename T>
 RepeatedFieldRef<T> Reflection::GetRepeatedFieldRef(
     const Message& message, const FieldDescriptor* field) const {
   return RepeatedFieldRef<T>(message, field);
 }
 
-template<typename T>
+template <typename T>
 MutableRepeatedFieldRef<T> Reflection::GetMutableRepeatedFieldRef(
     Message* message, const FieldDescriptor* field) const {
   return MutableRepeatedFieldRef<T>(message, field);
 }
 
 // RepeatedFieldRef definition for non-message types.
-template<typename T>
+template <typename T>
 class RepeatedFieldRef<
     T, typename std::enable_if<!std::is_base_of<Message, T>::value>::type> {
   typedef typename internal::RefTypeTraits<T>::iterator IteratorType;
   typedef typename internal::RefTypeTraits<T>::AccessorType AccessorType;
 
  public:
-  bool empty() const {
-    return accessor_->IsEmpty(data_);
-  }
-  int size() const {
-    return accessor_->Size(data_);
-  }
-  T Get(int index) const {
-    return accessor_->template Get<T>(data_, index);
-  }
+  bool empty() const { return accessor_->IsEmpty(data_); }
+  int size() const { return accessor_->Size(data_); }
+  T Get(int index) const { return accessor_->template Get<T>(data_, index); }
 
   typedef IteratorType iterator;
   typedef IteratorType const_iterator;
@@ -89,22 +83,16 @@
   typedef int size_type;
   typedef ptrdiff_t difference_type;
 
-  iterator begin() const {
-    return iterator(data_, accessor_, true);
-  }
-  iterator end() const {
-    return iterator(data_, accessor_, false);
-  }
+  iterator begin() const { return iterator(data_, accessor_, true); }
+  iterator end() const { return iterator(data_, accessor_, false); }
 
  private:
   friend class Reflection;
-  RepeatedFieldRef(
-      const Message& message,
-      const FieldDescriptor* field) {
+  RepeatedFieldRef(const Message& message, const FieldDescriptor* field) {
     const Reflection* reflection = message.GetReflection();
-    data_ = reflection->RepeatedFieldData(
-        const_cast<Message*>(&message), field,
-        internal::RefTypeTraits<T>::cpp_type, NULL);
+    data_ = reflection->RepeatedFieldData(const_cast<Message*>(&message), field,
+                                          internal::RefTypeTraits<T>::cpp_type,
+                                          NULL);
     accessor_ = reflection->RepeatedFieldAccessor(field);
   }
 
@@ -113,50 +101,38 @@
 };
 
 // MutableRepeatedFieldRef definition for non-message types.
-template<typename T>
+template <typename T>
 class MutableRepeatedFieldRef<
     T, typename std::enable_if<!std::is_base_of<Message, T>::value>::type> {
   typedef typename internal::RefTypeTraits<T>::AccessorType AccessorType;
 
  public:
-  bool empty() const {
-    return accessor_->IsEmpty(data_);
-  }
-  int size() const {
-    return accessor_->Size(data_);
-  }
-  T Get(int index) const {
-    return accessor_->template Get<T>(data_, index);
-  }
+  bool empty() const { return accessor_->IsEmpty(data_); }
+  int size() const { return accessor_->Size(data_); }
+  T Get(int index) const { return accessor_->template Get<T>(data_, index); }
 
   void Set(int index, const T& value) const {
     accessor_->template Set<T>(data_, index, value);
   }
-  void Add(const T& value) const {
-    accessor_->template Add<T>(data_, value);
-  }
-  void RemoveLast() const {
-    accessor_->RemoveLast(data_);
-  }
+  void Add(const T& value) const { accessor_->template Add<T>(data_, value); }
+  void RemoveLast() const { accessor_->RemoveLast(data_); }
   void SwapElements(int index1, int index2) const {
     accessor_->SwapElements(data_, index1, index2);
   }
-  void Clear() const {
-    accessor_->Clear(data_);
-  }
+  void Clear() const { accessor_->Clear(data_); }
 
   void Swap(const MutableRepeatedFieldRef& other) const {
     accessor_->Swap(data_, other.accessor_, other.data_);
   }
 
-  template<typename Container>
+  template <typename Container>
   void MergeFrom(const Container& container) const {
     typedef typename Container::const_iterator Iterator;
     for (Iterator it = container.begin(); it != container.end(); ++it) {
       Add(*it);
     }
   }
-  template<typename Container>
+  template <typename Container>
   void CopyFrom(const Container& container) const {
     Clear();
     MergeFrom(container);
@@ -164,9 +140,7 @@
 
  private:
   friend class Reflection;
-  MutableRepeatedFieldRef(
-      Message* message,
-      const FieldDescriptor* field) {
+  MutableRepeatedFieldRef(Message* message, const FieldDescriptor* field) {
     const Reflection* reflection = message->GetReflection();
     data_ = reflection->RepeatedFieldData(
         message, field, internal::RefTypeTraits<T>::cpp_type, NULL);
@@ -178,19 +152,15 @@
 };
 
 // RepeatedFieldRef definition for message types.
-template<typename T>
+template <typename T>
 class RepeatedFieldRef<
     T, typename std::enable_if<std::is_base_of<Message, T>::value>::type> {
   typedef typename internal::RefTypeTraits<T>::iterator IteratorType;
   typedef typename internal::RefTypeTraits<T>::AccessorType AccessorType;
 
  public:
-  bool empty() const {
-    return accessor_->IsEmpty(data_);
-  }
-  int size() const {
-    return accessor_->Size(data_);
-  }
+  bool empty() const { return accessor_->IsEmpty(data_); }
+  int size() const { return accessor_->Size(data_); }
   // This method returns a reference to the underlying message object if it
   // exists. If a message object doesn't exist (e.g., data stored in serialized
   // form), scratch_space will be filled with the data and a reference to it
@@ -205,9 +175,7 @@
   }
   // Create a new message of the same type as the messages stored in this
   // repeated field. Caller takes ownership of the returned object.
-  T* NewMessage() const {
-    return static_cast<T*>(default_instance_->New());
-  }
+  T* NewMessage() const { return static_cast<T*>(default_instance_->New()); }
 
   typedef IteratorType iterator;
   typedef IteratorType const_iterator;
@@ -227,9 +195,7 @@
 
  private:
   friend class Reflection;
-  RepeatedFieldRef(
-      const Message& message,
-      const FieldDescriptor* field) {
+  RepeatedFieldRef(const Message& message, const FieldDescriptor* field) {
     const Reflection* reflection = message.GetReflection();
     data_ = reflection->RepeatedFieldData(
         const_cast<Message*>(&message), field,
@@ -246,56 +212,44 @@
 };
 
 // MutableRepeatedFieldRef definition for message types.
-template<typename T>
+template <typename T>
 class MutableRepeatedFieldRef<
     T, typename std::enable_if<std::is_base_of<Message, T>::value>::type> {
   typedef typename internal::RefTypeTraits<T>::AccessorType AccessorType;
 
  public:
-  bool empty() const {
-    return accessor_->IsEmpty(data_);
-  }
-  int size() const {
-    return accessor_->Size(data_);
-  }
+  bool empty() const { return accessor_->IsEmpty(data_); }
+  int size() const { return accessor_->Size(data_); }
   // See comments for RepeatedFieldRef<Message>::Get()
   const T& Get(int index, T* scratch_space) const {
     return *static_cast<const T*>(accessor_->Get(data_, index, scratch_space));
   }
   // Create a new message of the same type as the messages stored in this
   // repeated field. Caller takes ownership of the returned object.
-  T* NewMessage() const {
-    return static_cast<T*>(default_instance_->New());
-  }
+  T* NewMessage() const { return static_cast<T*>(default_instance_->New()); }
 
   void Set(int index, const T& value) const {
     accessor_->Set(data_, index, &value);
   }
-  void Add(const T& value) const {
-    accessor_->Add(data_, &value);
-  }
-  void RemoveLast() const {
-    accessor_->RemoveLast(data_);
-  }
+  void Add(const T& value) const { accessor_->Add(data_, &value); }
+  void RemoveLast() const { accessor_->RemoveLast(data_); }
   void SwapElements(int index1, int index2) const {
     accessor_->SwapElements(data_, index1, index2);
   }
-  void Clear() const {
-    accessor_->Clear(data_);
-  }
+  void Clear() const { accessor_->Clear(data_); }
 
   void Swap(const MutableRepeatedFieldRef& other) const {
     accessor_->Swap(data_, other.accessor_, other.data_);
   }
 
-  template<typename Container>
+  template <typename Container>
   void MergeFrom(const Container& container) const {
     typedef typename Container::const_iterator Iterator;
     for (Iterator it = container.begin(); it != container.end(); ++it) {
       Add(*it);
     }
   }
-  template<typename Container>
+  template <typename Container>
   void CopyFrom(const Container& container) const {
     Clear();
     MergeFrom(container);
@@ -303,9 +257,7 @@
 
  private:
   friend class Reflection;
-  MutableRepeatedFieldRef(
-      Message* message,
-      const FieldDescriptor* field) {
+  MutableRepeatedFieldRef(Message* message, const FieldDescriptor* field) {
     const Reflection* reflection = message->GetReflection();
     data_ = reflection->RepeatedFieldData(
         message, field, internal::RefTypeTraits<T>::cpp_type,
@@ -360,8 +312,8 @@
   // exists, or fill the data into scratch_space and return scratch_space.
   // Callers of this method must ensure scratch_space is a valid pointer
   // to a mutable object of the correct type.
-  virtual const Value* Get(
-      const Field* data, int index, Value* scratch_space) const = 0;
+  virtual const Value* Get(const Field* data, int index,
+                           Value* scratch_space) const = 0;
 
   virtual void Clear(Field* data) const = 0;
   virtual void Set(Field* data, int index, const Value* value) const = 0;
@@ -394,16 +346,15 @@
 
   // Templated methods that make using this interface easier for non-message
   // types.
-  template<typename T>
+  template <typename T>
   T Get(const Field* data, int index) const {
     typedef typename RefTypeTraits<T>::AccessorValueType ActualType;
     ActualType scratch_space;
-    return static_cast<T>(
-        *reinterpret_cast<const ActualType*>(
-            Get(data, index, static_cast<Value*>(&scratch_space))));
+    return static_cast<T>(*reinterpret_cast<const ActualType*>(
+        Get(data, index, static_cast<Value*>(&scratch_space))));
   }
 
-  template<typename T, typename ValueType>
+  template <typename T, typename ValueType>
   void Set(Field* data, int index, const ValueType& value) const {
     typedef typename RefTypeTraits<T>::AccessorValueType ActualType;
     // In this RepeatedFieldAccessor interface we pass/return data using
@@ -417,7 +368,7 @@
     Set(data, index, static_cast<const Value*>(&tmp));
   }
 
-  template<typename T, typename ValueType>
+  template <typename T, typename ValueType>
   void Add(Field* data, const ValueType& value) const {
     typedef typename RefTypeTraits<T>::AccessorValueType ActualType;
     // In this RepeatedFieldAccessor interface we pass/return data using
@@ -440,7 +391,7 @@
 };
 
 // Implement (Mutable)RepeatedFieldRef::iterator
-template<typename T>
+template <typename T>
 class RepeatedFieldRefIterator
     : public std::iterator<std::forward_iterator_tag, T> {
   typedef typename RefTypeTraits<T>::AccessorValueType AccessorValueType;
@@ -459,17 +410,14 @@
         scratch_space_(begin ? new AccessorValueType : nullptr) {}
   // Constructor for message fields.
   RepeatedFieldRefIterator(const void* data,
-                           const RepeatedFieldAccessor* accessor,
-                           bool begin,
+                           const RepeatedFieldAccessor* accessor, bool begin,
                            AccessorValueType* scratch_space)
-      : data_(data), accessor_(accessor),
-        iterator_(begin ? accessor->BeginIterator(data) :
-                          accessor->EndIterator(data)),
-        scratch_space_(scratch_space) {
-  }
-  ~RepeatedFieldRefIterator() {
-    accessor_->DeleteIterator(data_, iterator_);
-  }
+      : data_(data),
+        accessor_(accessor),
+        iterator_(begin ? accessor->BeginIterator(data)
+                        : accessor->EndIterator(data)),
+        scratch_space_(scratch_space) {}
+  ~RepeatedFieldRefIterator() { accessor_->DeleteIterator(data_, iterator_); }
   RepeatedFieldRefIterator operator++(int) {
     RepeatedFieldRefIterator tmp(*this);
     iterator_ = accessor_->AdvanceIterator(data_, iterator_);
@@ -481,14 +429,12 @@
   }
   IteratorValueType operator*() const {
     return static_cast<IteratorValueType>(
-        *static_cast<const AccessorValueType*>(
-            accessor_->GetIteratorValue(
-                data_, iterator_, scratch_space_.get())));
+        *static_cast<const AccessorValueType*>(accessor_->GetIteratorValue(
+            data_, iterator_, scratch_space_.get())));
   }
   IteratorPointerType operator->() const {
     return static_cast<IteratorPointerType>(
-        accessor_->GetIteratorValue(
-            data_, iterator_, scratch_space_.get()));
+        accessor_->GetIteratorValue(data_, iterator_, scratch_space_.get()));
   }
   bool operator!=(const RepeatedFieldRefIterator& other) const {
     assert(data_ == other.data_);
@@ -500,9 +446,9 @@
   }
 
   RepeatedFieldRefIterator(const RepeatedFieldRefIterator& other)
-      : data_(other.data_), accessor_(other.accessor_),
-        iterator_(accessor_->CopyIterator(data_, other.iterator_)) {
-  }
+      : data_(other.data_),
+        accessor_(other.accessor_),
+        iterator_(accessor_->CopyIterator(data_, other.iterator_)) {}
   RepeatedFieldRefIterator& operator=(const RepeatedFieldRefIterator& other) {
     if (this != &other) {
       accessor_->DeleteIterator(data_, iterator_);
@@ -523,16 +469,17 @@
 // TypeTraits that maps the type parameter T of RepeatedFieldRef or
 // MutableRepeatedFieldRef to corresponding iterator type,
 // RepeatedFieldAccessor type, etc.
-template<typename T>
+template <typename T>
 struct PrimitiveTraits {
   static const bool is_primitive = false;
 };
-#define DEFINE_PRIMITIVE(TYPE, type) \
-    template<> struct PrimitiveTraits<type> { \
-      static const bool is_primitive = true; \
-      static const FieldDescriptor::CppType cpp_type = \
-          FieldDescriptor::CPPTYPE_ ## TYPE; \
-    };
+#define DEFINE_PRIMITIVE(TYPE, type)                 \
+  template <>                                        \
+  struct PrimitiveTraits<type> {                     \
+    static const bool is_primitive = true;           \
+    static const FieldDescriptor::CppType cpp_type = \
+        FieldDescriptor::CPPTYPE_##TYPE;             \
+  };
 DEFINE_PRIMITIVE(INT32, int32)
 DEFINE_PRIMITIVE(UINT32, uint32)
 DEFINE_PRIMITIVE(INT64, int64)
@@ -542,7 +489,7 @@
 DEFINE_PRIMITIVE(BOOL, bool)
 #undef DEFINE_PRIMITIVE
 
-template<typename T>
+template <typename T>
 struct RefTypeTraits<
     T, typename std::enable_if<PrimitiveTraits<T>::is_primitive>::type> {
   typedef RepeatedFieldRefIterator<T> iterator;
@@ -550,14 +497,11 @@
   typedef T AccessorValueType;
   typedef T IteratorValueType;
   typedef T* IteratorPointerType;
-  static const FieldDescriptor::CppType cpp_type =
-      PrimitiveTraits<T>::cpp_type;
-  static const Descriptor* GetMessageFieldDescriptor() {
-    return NULL;
-  }
+  static const FieldDescriptor::CppType cpp_type = PrimitiveTraits<T>::cpp_type;
+  static const Descriptor* GetMessageFieldDescriptor() { return NULL; }
 };
 
-template<typename T>
+template <typename T>
 struct RefTypeTraits<
     T, typename std::enable_if<is_proto_enum<T>::value>::type> {
   typedef RepeatedFieldRefIterator<T> iterator;
@@ -568,9 +512,7 @@
   typedef int32* IteratorPointerType;
   static const FieldDescriptor::CppType cpp_type =
       FieldDescriptor::CPPTYPE_ENUM;
-  static const Descriptor* GetMessageFieldDescriptor() {
-    return NULL;
-  }
+  static const Descriptor* GetMessageFieldDescriptor() { return NULL; }
 };
 
 template <typename T>
@@ -583,25 +525,21 @@
   typedef const std::string* IteratorPointerType;
   static const FieldDescriptor::CppType cpp_type =
       FieldDescriptor::CPPTYPE_STRING;
-  static const Descriptor* GetMessageFieldDescriptor() {
-    return NULL;
-  }
+  static const Descriptor* GetMessageFieldDescriptor() { return NULL; }
 };
 
-template<typename T>
+template <typename T>
 struct MessageDescriptorGetter {
   static const Descriptor* get() {
     return T::default_instance().GetDescriptor();
   }
 };
-template<>
+template <>
 struct MessageDescriptorGetter<Message> {
-  static const Descriptor* get() {
-    return NULL;
-  }
+  static const Descriptor* get() { return NULL; }
 };
 
-template<typename T>
+template <typename T>
 struct RefTypeTraits<
     T, typename std::enable_if<std::is_base_of<Message, T>::value>::type> {
   typedef RepeatedFieldRefIterator<T> iterator;
diff --git a/src/google/protobuf/reflection_internal.h b/src/google/protobuf/reflection_internal.h
index b4b1d41..40c070f 100644
--- a/src/google/protobuf/reflection_internal.h
+++ b/src/google/protobuf/reflection_internal.h
@@ -82,7 +82,7 @@
 
 // Base class for RepeatedFieldAccessor implementations that manipulates
 // RepeatedField<T>.
-template<typename T>
+template <typename T>
 class RepeatedFieldWrapper : public RandomAccessRepeatedFieldAccessor {
  public:
   RepeatedFieldWrapper() {}
@@ -137,7 +137,7 @@
 
 // Base class for RepeatedFieldAccessor implementations that manipulates
 // RepeatedPtrField<T>.
-template<typename T>
+template <typename T>
 class RepeatedPtrFieldWrapper : public RandomAccessRepeatedFieldAccessor {
  public:
   bool IsEmpty(const Field* data) const override {
diff --git a/src/google/protobuf/reflection_ops.cc b/src/google/protobuf/reflection_ops.cc
index f8f9dc3..3ced141 100644
--- a/src/google/protobuf/reflection_ops.cc
+++ b/src/google/protobuf/reflection_ops.cc
@@ -74,9 +74,9 @@
 
   const Descriptor* descriptor = from.GetDescriptor();
   GOOGLE_CHECK_EQ(to->GetDescriptor(), descriptor)
-    << "Tried to merge messages of different types "
-    << "(merge " << descriptor->full_name()
-    << " to " << to->GetDescriptor()->full_name() << ")";
+      << "Tried to merge messages of different types "
+      << "(merge " << descriptor->full_name() << " to "
+      << to->GetDescriptor()->full_name() << ")";
 
   const Reflection* from_reflection = GetReflectionOrDie(from);
   const Reflection* to_reflection = GetReflectionOrDie(*to);
@@ -99,8 +99,7 @@
       if (is_from_generated == is_to_generated && field->is_map()) {
         const MapFieldBase* from_field =
             from_reflection->GetMapData(from, field);
-        MapFieldBase* to_field =
-            to_reflection->MutableMapData(to, field);
+        MapFieldBase* to_field = to_reflection->MutableMapData(to, field);
         if (to_field->IsMapValid() && from_field->IsMapValid()) {
           to_field->MergeFrom(*from_field);
           continue;
@@ -109,58 +108,58 @@
       int count = from_reflection->FieldSize(from, field);
       for (int j = 0; j < count; j++) {
         switch (field->cpp_type()) {
-#define HANDLE_TYPE(CPPTYPE, METHOD)                                     \
-          case FieldDescriptor::CPPTYPE_##CPPTYPE:                       \
-            to_reflection->Add##METHOD(to, field,                        \
-              from_reflection->GetRepeated##METHOD(from, field, j));     \
-            break;
+#define HANDLE_TYPE(CPPTYPE, METHOD)                                      \
+  case FieldDescriptor::CPPTYPE_##CPPTYPE:                                \
+    to_reflection->Add##METHOD(                                           \
+        to, field, from_reflection->GetRepeated##METHOD(from, field, j)); \
+    break;
 
-          HANDLE_TYPE(INT32 , Int32 );
-          HANDLE_TYPE(INT64 , Int64 );
+          HANDLE_TYPE(INT32, Int32);
+          HANDLE_TYPE(INT64, Int64);
           HANDLE_TYPE(UINT32, UInt32);
           HANDLE_TYPE(UINT64, UInt64);
-          HANDLE_TYPE(FLOAT , Float );
+          HANDLE_TYPE(FLOAT, Float);
           HANDLE_TYPE(DOUBLE, Double);
-          HANDLE_TYPE(BOOL  , Bool  );
+          HANDLE_TYPE(BOOL, Bool);
           HANDLE_TYPE(STRING, String);
-          HANDLE_TYPE(ENUM  , Enum  );
+          HANDLE_TYPE(ENUM, Enum);
 #undef HANDLE_TYPE
 
           case FieldDescriptor::CPPTYPE_MESSAGE:
             to_reflection->AddMessage(to, field)->MergeFrom(
-              from_reflection->GetRepeatedMessage(from, field, j));
+                from_reflection->GetRepeatedMessage(from, field, j));
             break;
         }
       }
     } else {
       switch (field->cpp_type()) {
-#define HANDLE_TYPE(CPPTYPE, METHOD)                                        \
-        case FieldDescriptor::CPPTYPE_##CPPTYPE:                            \
-          to_reflection->Set##METHOD(to, field,                             \
-            from_reflection->Get##METHOD(from, field));                     \
-          break;
+#define HANDLE_TYPE(CPPTYPE, METHOD)                                       \
+  case FieldDescriptor::CPPTYPE_##CPPTYPE:                                 \
+    to_reflection->Set##METHOD(to, field,                                  \
+                               from_reflection->Get##METHOD(from, field)); \
+    break;
 
-        HANDLE_TYPE(INT32 , Int32 );
-        HANDLE_TYPE(INT64 , Int64 );
+        HANDLE_TYPE(INT32, Int32);
+        HANDLE_TYPE(INT64, Int64);
         HANDLE_TYPE(UINT32, UInt32);
         HANDLE_TYPE(UINT64, UInt64);
-        HANDLE_TYPE(FLOAT , Float );
+        HANDLE_TYPE(FLOAT, Float);
         HANDLE_TYPE(DOUBLE, Double);
-        HANDLE_TYPE(BOOL  , Bool  );
+        HANDLE_TYPE(BOOL, Bool);
         HANDLE_TYPE(STRING, String);
-        HANDLE_TYPE(ENUM  , Enum  );
+        HANDLE_TYPE(ENUM, Enum);
 #undef HANDLE_TYPE
 
         case FieldDescriptor::CPPTYPE_MESSAGE:
           to_reflection->MutableMessage(to, field)->MergeFrom(
-            from_reflection->GetMessage(from, field));
+              from_reflection->GetMessage(from, field));
           break;
       }
     }
   }
 
   to_reflection->MutableUnknownFields(to)->MergeFrom(
-    from_reflection->GetUnknownFields(from));
+      from_reflection->GetUnknownFields(from));
 }
 
 void ReflectionOps::Clear(Message* message) {
@@ -221,7 +220,7 @@
 
         for (int j = 0; j < size; j++) {
           if (!reflection->GetRepeatedMessage(message, field, j)
-                          .IsInitialized()) {
+                   .IsInitialized()) {
             return false;
           }
         }
@@ -257,7 +256,8 @@
               MapIterator end(message, field);
               for (map_field->MapBegin(&iter), map_field->MapEnd(&end);
                    iter != end; ++iter) {
-                iter.MutableValueRef()->MutableMessageValue()
+                iter.MutableValueRef()
+                    ->MutableMessageValue()
                     ->DiscardUnknownFields();
               }
               continue;
@@ -269,7 +269,7 @@
         int size = reflection->FieldSize(*message, field);
         for (int j = 0; j < size; j++) {
           reflection->MutableRepeatedMessage(message, field, j)
-                    ->DiscardUnknownFields();
+              ->DiscardUnknownFields();
         }
       } else {
         reflection->MutableMessage(message, field)->DiscardUnknownFields();
@@ -324,16 +324,14 @@
 
         for (int j = 0; j < size; j++) {
           const Message& sub_message =
-            reflection->GetRepeatedMessage(message, field, j);
+              reflection->GetRepeatedMessage(message, field, j);
           FindInitializationErrors(sub_message,
-                                   SubMessagePrefix(prefix, field, j),
-                                   errors);
+                                   SubMessagePrefix(prefix, field, j), errors);
         }
       } else {
         const Message& sub_message = reflection->GetMessage(message, field);
         FindInitializationErrors(sub_message,
-                                 SubMessagePrefix(prefix, field, -1),
-                                 errors);
+                                 SubMessagePrefix(prefix, field, -1), errors);
       }
     }
   }
diff --git a/src/google/protobuf/reflection_ops_unittest.cc b/src/google/protobuf/reflection_ops_unittest.cc
index 0f46ff1..bd14193 100644
--- a/src/google/protobuf/reflection_ops_unittest.cc
+++ b/src/google/protobuf/reflection_ops_unittest.cc
@@ -33,9 +33,9 @@
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
 #include <google/protobuf/reflection_ops.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/unittest.pb.h>
 #include <google/protobuf/test_util.h>
+#include <google/protobuf/unittest.pb.h>
+#include <google/protobuf/descriptor.h>
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
@@ -128,18 +128,21 @@
   TestUtil::SetAllExtensions(&message);
 
   // This field will test merging into an empty spot.
-  message2.SetExtension(unittest::optional_int32_extension,
-    message.GetExtension(unittest::optional_int32_extension));
+  message2.SetExtension(
+      unittest::optional_int32_extension,
+      message.GetExtension(unittest::optional_int32_extension));
   message.ClearExtension(unittest::optional_int32_extension);
 
   // This tests overwriting.
-  message2.SetExtension(unittest::optional_string_extension,
-    message.GetExtension(unittest::optional_string_extension));
+  message2.SetExtension(
+      unittest::optional_string_extension,
+      message.GetExtension(unittest::optional_string_extension));
   message.SetExtension(unittest::optional_string_extension, "something else");
 
   // This tests concatenating.
-  message2.AddExtension(unittest::repeated_int32_extension,
-    message.GetExtension(unittest::repeated_int32_extension, 1));
+  message2.AddExtension(
+      unittest::repeated_int32_extension,
+      message.GetExtension(unittest::repeated_int32_extension, 1));
   int32 i = message.GetExtension(unittest::repeated_int32_extension, 0);
   message.ClearExtension(unittest::repeated_int32_extension);
   message.AddExtension(unittest::repeated_int32_extension, i);
@@ -192,9 +195,7 @@
 
   unittest::TestAllTypes message;
 
-  EXPECT_DEATH(
-    ReflectionOps::Merge(message, &message),
-    "&from");
+  EXPECT_DEATH(ReflectionOps::Merge(message, &message), "&from");
 }
 
 #endif  // PROTOBUF_HAS_DEATH_TEST
@@ -235,9 +236,9 @@
             &message.GetExtension(unittest::optionalgroup_extension));
   EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(),
             &message.GetExtension(unittest::optional_nested_message_extension));
-  EXPECT_NE(&unittest::ForeignMessage::default_instance(),
-            &message.GetExtension(
-              unittest::optional_foreign_message_extension));
+  EXPECT_NE(
+      &unittest::ForeignMessage::default_instance(),
+      &message.GetExtension(unittest::optional_foreign_message_extension));
   EXPECT_NE(&unittest_import::ImportMessage::default_instance(),
             &message.GetExtension(unittest::optional_import_message_extension));
 }
@@ -274,30 +275,29 @@
   TestUtil::SetAllFields(&message);
 
   // Set some unknown fields in message.
-  message.mutable_unknown_fields()
-        ->AddVarint(123456, 654321);
+  message.mutable_unknown_fields()->AddVarint(123456, 654321);
   message.mutable_optional_nested_message()
-        ->mutable_unknown_fields()
-        ->AddVarint(123456, 654321);
+      ->mutable_unknown_fields()
+      ->AddVarint(123456, 654321);
   message.mutable_repeated_nested_message(0)
-        ->mutable_unknown_fields()
-        ->AddVarint(123456, 654321);
+      ->mutable_unknown_fields()
+      ->AddVarint(123456, 654321);
 
   EXPECT_EQ(1, message.unknown_fields().field_count());
-  EXPECT_EQ(1, message.optional_nested_message()
-                      .unknown_fields().field_count());
-  EXPECT_EQ(1, message.repeated_nested_message(0)
-                      .unknown_fields().field_count());
+  EXPECT_EQ(1,
+            message.optional_nested_message().unknown_fields().field_count());
+  EXPECT_EQ(1,
+            message.repeated_nested_message(0).unknown_fields().field_count());
 
   // Discard them.
   ReflectionOps::DiscardUnknownFields(&message);
   TestUtil::ExpectAllFieldsSet(message);
 
   EXPECT_EQ(0, message.unknown_fields().field_count());
-  EXPECT_EQ(0, message.optional_nested_message()
-                      .unknown_fields().field_count());
-  EXPECT_EQ(0, message.repeated_nested_message(0)
-                      .unknown_fields().field_count());
+  EXPECT_EQ(0,
+            message.optional_nested_message().unknown_fields().field_count());
+  EXPECT_EQ(0,
+            message.repeated_nested_message(0).unknown_fields().field_count());
 }
 
 TEST(ReflectionOpsTest, DiscardUnknownExtensions) {
@@ -305,34 +305,35 @@
   TestUtil::SetAllExtensions(&message);
 
   // Set some unknown fields.
-  message.mutable_unknown_fields()
-        ->AddVarint(123456, 654321);
+  message.mutable_unknown_fields()->AddVarint(123456, 654321);
   message.MutableExtension(unittest::optional_nested_message_extension)
-        ->mutable_unknown_fields()
-        ->AddVarint(123456, 654321);
+      ->mutable_unknown_fields()
+      ->AddVarint(123456, 654321);
   message.MutableExtension(unittest::repeated_nested_message_extension, 0)
-        ->mutable_unknown_fields()
-        ->AddVarint(123456, 654321);
+      ->mutable_unknown_fields()
+      ->AddVarint(123456, 654321);
 
   EXPECT_EQ(1, message.unknown_fields().field_count());
+  EXPECT_EQ(1, message.GetExtension(unittest::optional_nested_message_extension)
+                   .unknown_fields()
+                   .field_count());
   EXPECT_EQ(1,
-    message.GetExtension(unittest::optional_nested_message_extension)
-           .unknown_fields().field_count());
-  EXPECT_EQ(1,
-    message.GetExtension(unittest::repeated_nested_message_extension, 0)
-           .unknown_fields().field_count());
+            message.GetExtension(unittest::repeated_nested_message_extension, 0)
+                .unknown_fields()
+                .field_count());
 
   // Discard them.
   ReflectionOps::DiscardUnknownFields(&message);
   TestUtil::ExpectAllExtensionsSet(message);
 
   EXPECT_EQ(0, message.unknown_fields().field_count());
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension)
+                   .unknown_fields()
+                   .field_count());
   EXPECT_EQ(0,
-    message.GetExtension(unittest::optional_nested_message_extension)
-           .unknown_fields().field_count());
-  EXPECT_EQ(0,
-    message.GetExtension(unittest::repeated_nested_message_extension, 0)
-           .unknown_fields().field_count());
+            message.GetExtension(unittest::repeated_nested_message_extension, 0)
+                .unknown_fields()
+                .field_count());
 }
 
 TEST(ReflectionOpsTest, IsInitialized) {
@@ -435,16 +436,17 @@
   message.mutable_optional_message();
   message.add_repeated_message();
   message.add_repeated_message();
-  EXPECT_EQ("optional_message.a,"
-            "optional_message.b,"
-            "optional_message.c,"
-            "repeated_message[0].a,"
-            "repeated_message[0].b,"
-            "repeated_message[0].c,"
-            "repeated_message[1].a,"
-            "repeated_message[1].b,"
-            "repeated_message[1].c",
-            FindInitializationErrors(message));
+  EXPECT_EQ(
+      "optional_message.a,"
+      "optional_message.b,"
+      "optional_message.c,"
+      "repeated_message[0].a,"
+      "repeated_message[0].b,"
+      "repeated_message[0].c,"
+      "repeated_message[1].a,"
+      "repeated_message[1].b,"
+      "repeated_message[1].c",
+      FindInitializationErrors(message));
 }
 
 TEST(ReflectionOpsTest, FindExtensionInitializationErrors) {
@@ -452,23 +454,23 @@
   message.MutableExtension(unittest::TestRequired::single);
   message.AddExtension(unittest::TestRequired::multi);
   message.AddExtension(unittest::TestRequired::multi);
-  EXPECT_EQ("(protobuf_unittest.TestRequired.single).a,"
-            "(protobuf_unittest.TestRequired.single).b,"
-            "(protobuf_unittest.TestRequired.single).c,"
-            "(protobuf_unittest.TestRequired.multi)[0].a,"
-            "(protobuf_unittest.TestRequired.multi)[0].b,"
-            "(protobuf_unittest.TestRequired.multi)[0].c,"
-            "(protobuf_unittest.TestRequired.multi)[1].a,"
-            "(protobuf_unittest.TestRequired.multi)[1].b,"
-            "(protobuf_unittest.TestRequired.multi)[1].c",
-            FindInitializationErrors(message));
+  EXPECT_EQ(
+      "(protobuf_unittest.TestRequired.single).a,"
+      "(protobuf_unittest.TestRequired.single).b,"
+      "(protobuf_unittest.TestRequired.single).c,"
+      "(protobuf_unittest.TestRequired.multi)[0].a,"
+      "(protobuf_unittest.TestRequired.multi)[0].b,"
+      "(protobuf_unittest.TestRequired.multi)[0].c,"
+      "(protobuf_unittest.TestRequired.multi)[1].a,"
+      "(protobuf_unittest.TestRequired.multi)[1].b,"
+      "(protobuf_unittest.TestRequired.multi)[1].c",
+      FindInitializationErrors(message));
 }
 
 TEST(ReflectionOpsTest, FindOneofInitializationErrors) {
   unittest::TestRequiredOneof message;
   message.mutable_foo_message();
-  EXPECT_EQ("foo_message.required_double",
-            FindInitializationErrors(message));
+  EXPECT_EQ("foo_message.required_double", FindInitializationErrors(message));
 }
 
 }  // namespace
diff --git a/src/google/protobuf/repeated_field.cc b/src/google/protobuf/repeated_field.cc
index 44b0457..e5dbe02 100644
--- a/src/google/protobuf/repeated_field.cc
+++ b/src/google/protobuf/repeated_field.cc
@@ -34,9 +34,9 @@
 
 #include <algorithm>
 
-#include <google/protobuf/repeated_field.h>
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
+#include <google/protobuf/repeated_field.h>
 
 #include <google/protobuf/port_def.inc>
 
@@ -56,9 +56,8 @@
   Arena* arena = GetArenaNoVirtual();
   new_size = std::max(kMinRepeatedFieldAllocationSize,
                       std::max(total_size_ * 2, new_size));
-  GOOGLE_CHECK_LE(new_size,
-           (std::numeric_limits<size_t>::max() - kRepHeaderSize) /
-           sizeof(old_rep->elements[0]))
+  GOOGLE_CHECK_LE(new_size, (std::numeric_limits<size_t>::max() - kRepHeaderSize) /
+                         sizeof(old_rep->elements[0]))
       << "Requested size is too large to fit into size_t.";
   size_t bytes = kRepHeaderSize + sizeof(old_rep->elements[0]) * new_size;
   if (arena == NULL) {
diff --git a/src/google/protobuf/repeated_field.h b/src/google/protobuf/repeated_field.h
index 2552e23..4c631f0 100644
--- a/src/google/protobuf/repeated_field.h
+++ b/src/google/protobuf/repeated_field.h
@@ -111,7 +111,6 @@
 }
 }  // namespace internal
 
-
 // RepeatedField is used to represent repeated fields of a primitive type (in
 // other words, everything except strings and nested Messages).  Most users will
 // not ever use a RepeatedField directly; they will use the get-by-index,
@@ -220,15 +219,11 @@
   // Reverse iterator support
   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
   typedef std::reverse_iterator<iterator> reverse_iterator;
-  reverse_iterator rbegin() {
-    return reverse_iterator(end());
-  }
+  reverse_iterator rbegin() { return reverse_iterator(end()); }
   const_reverse_iterator rbegin() const {
     return const_reverse_iterator(end());
   }
-  reverse_iterator rend() {
-    return reverse_iterator(begin());
-  }
+  reverse_iterator rend() { return reverse_iterator(begin()); }
   const_reverse_iterator rend() const {
     return const_reverse_iterator(begin());
   }
@@ -350,13 +345,15 @@
   const Element* unsafe_data() const;
 };
 
-template<typename Element>
+template <typename Element>
 const size_t RepeatedField<Element>::kRepHeaderSize =
     reinterpret_cast<size_t>(&reinterpret_cast<Rep*>(16)->elements[0]) - 16;
 
 namespace internal {
-template <typename It> class RepeatedPtrIterator;
-template <typename It, typename VoidPtr> class RepeatedPtrOverPtrsIterator;
+template <typename It>
+class RepeatedPtrIterator;
+template <typename It, typename VoidPtr>
+class RepeatedPtrOverPtrsIterator;
 }  // namespace internal
 
 namespace internal {
@@ -393,22 +390,24 @@
   // We mangle these names a bit to avoid compatibility issues in 'unclean'
   // include environments that may have, e.g., "#define test ..." (yes, this
   // exists).
-  template<typename U, typename RetType, RetType (U::*)(const U& arg)>
-      struct CheckType;
-  template<typename U> static HasMerge Check(
-      CheckType<U, void, &U::MergeFrom>*);
-  template<typename U> static HasMerge Check(
-      CheckType<U, bool, &U::MergeFrom>*);
-  template<typename U> static HasNoMerge Check(...);
+  template <typename U, typename RetType, RetType (U::*)(const U& arg)>
+  struct CheckType;
+  template <typename U>
+  static HasMerge Check(CheckType<U, void, &U::MergeFrom>*);
+  template <typename U>
+  static HasMerge Check(CheckType<U, bool, &U::MergeFrom>*);
+  template <typename U>
+  static HasNoMerge Check(...);
 
   // Resolves to either std::true_type or std::false_type.
   typedef std::integral_constant<bool,
-               (sizeof(Check<T>(0)) == sizeof(HasMerge))> type;
+                                 (sizeof(Check<T>(0)) == sizeof(HasMerge))>
+      type;
 };
 
 template <typename T, typename = void>
-struct TypeImplementsMergeBehavior :
-    TypeImplementsMergeBehaviorProbeForMergeFrom<T> {};
+struct TypeImplementsMergeBehavior
+    : TypeImplementsMergeBehaviorProbeForMergeFrom<T> {};
 
 
 template <>
@@ -529,7 +528,7 @@
   template <typename TypeHandler>
   typename TypeHandler::Type* AddFromCleared();
 
-  template<typename TypeHandler>
+  template <typename TypeHandler>
   void AddAllocated(typename TypeHandler::Type* value) {
     typename TypeImplementsMergeBehavior<typename TypeHandler::Type>::type t;
     AddAllocatedInternal<TypeHandler>(value, t);
@@ -573,12 +572,9 @@
   typename TypeHandler::Type* ReleaseLastInternal(std::false_type);
 
   template <typename TypeHandler>
-  PROTOBUF_NOINLINE void SwapFallback(
-      RepeatedPtrFieldBase* other);
+  PROTOBUF_NOINLINE void SwapFallback(RepeatedPtrFieldBase* other);
 
-  inline Arena* GetArenaNoVirtual() const {
-    return arena_;
-  }
+  inline Arena* GetArenaNoVirtual() const { return arena_; }
 
  private:
   static const int kInitialSize = 0;
@@ -594,11 +590,11 @@
   // Placing all fields directly in the RepeatedPtrFieldBase instance costs
   // significant performance for memory-sensitive workloads.
   Arena* arena_;
-  int    current_size_;
-  int    total_size_;
+  int current_size_;
+  int total_size_;
   struct Rep {
-    int    allocated_size;
-    void*  elements[1];
+    int allocated_size;
+    void* elements[1];
   };
   static const size_t kRepHeaderSize = sizeof(Rep) - sizeof(void*);
   // Contains arena ptr and the elements array. We also keep the invariant that
@@ -616,13 +612,14 @@
 
   // Non-templated inner function to avoid code duplication. Takes a function
   // pointer to the type-specific (templated) inner allocate/merge loop.
-  void MergeFromInternal(
-      const RepeatedPtrFieldBase& other,
-      void (RepeatedPtrFieldBase::*inner_loop)(void**, void**, int, int));
+  void MergeFromInternal(const RepeatedPtrFieldBase& other,
+                         void (RepeatedPtrFieldBase::*inner_loop)(void**,
+                                                                  void**, int,
+                                                                  int));
 
-  template<typename TypeHandler>
-  void MergeFromInnerLoop(
-      void** our_elems, void** other_elems, int length, int already_allocated);
+  template <typename TypeHandler>
+  void MergeFromInnerLoop(void** our_elems, void** other_elems, int length,
+                          int already_allocated);
 
   // Internal helper: extend array space if necessary to contain |extend_amount|
   // more elements, and return a pointer to the element immediately following
@@ -716,7 +713,7 @@
 inline Arena* GenericTypeHandler<MessageLite>::GetArena(MessageLite* value) {
   return value->GetArena();
 }
-template<>
+template <>
 inline void* GenericTypeHandler<MessageLite>::GetMaybeArenaPointer(
     MessageLite* value) {
   return value->GetMaybeArenaPointer();
@@ -880,15 +877,11 @@
   // Reverse iterator support
   typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
   typedef std::reverse_iterator<iterator> reverse_iterator;
-  reverse_iterator rbegin() {
-    return reverse_iterator(end());
-  }
+  reverse_iterator rbegin() { return reverse_iterator(end()); }
   const_reverse_iterator rbegin() const {
     return const_reverse_iterator(end());
   }
-  reverse_iterator rend() {
-    return reverse_iterator(begin());
-  }
+  reverse_iterator rend() { return reverse_iterator(begin()); }
   const_reverse_iterator rend() const {
     return const_reverse_iterator(begin());
   }
@@ -1058,23 +1051,15 @@
 
 template <typename Element>
 inline RepeatedField<Element>::RepeatedField()
-  : current_size_(0),
-    total_size_(0),
-    ptr_(NULL) {
-}
+    : current_size_(0), total_size_(0), ptr_(NULL) {}
 
 template <typename Element>
 inline RepeatedField<Element>::RepeatedField(Arena* arena)
-  : current_size_(0),
-    total_size_(0),
-    ptr_(arena) {
-}
+    : current_size_(0), total_size_(0), ptr_(arena) {}
 
 template <typename Element>
 inline RepeatedField<Element>::RepeatedField(const RepeatedField& other)
-  : current_size_(0),
-    total_size_(0),
-    ptr_(NULL) {
+    : current_size_(0), total_size_(0), ptr_(NULL) {
   if (other.current_size_ != 0) {
     Reserve(other.size());
     AddNAlreadyReserved(other.size());
@@ -1085,9 +1070,7 @@
 template <typename Element>
 template <typename Iter>
 RepeatedField<Element>::RepeatedField(Iter begin, const Iter& end)
-  : current_size_(0),
-    total_size_(0),
-    ptr_(NULL) {
+    : current_size_(0), total_size_(0), ptr_(NULL) {
   int reserve = internal::CalculateReserve(begin, end);
   if (reserve != -1) {
     if (reserve == 0) {
@@ -1118,10 +1101,9 @@
 }
 
 template <typename Element>
-inline RepeatedField<Element>&
-RepeatedField<Element>::operator=(const RepeatedField& other) {
-  if (this != &other)
-    CopyFrom(other);
+inline RepeatedField<Element>& RepeatedField<Element>::operator=(
+    const RepeatedField& other) {
+  if (this != &other) CopyFrom(other);
   return *this;
 }
 
@@ -1129,7 +1111,8 @@
 inline RepeatedField<Element>::RepeatedField(RepeatedField&& other) noexcept
     : RepeatedField() {
   // We don't just call Swap(&other) here because it would perform 3 copies if
-  // the two fields are on different arenas.
+  // other is on an arena. This field can't be on an arena because arena
+  // construction always uses the Arena* accepting constructor.
   if (other.GetArenaNoVirtual()) {
     CopyFrom(other);
   } else {
@@ -1167,19 +1150,19 @@
   return total_size_;
 }
 
-template<typename Element>
+template <typename Element>
 inline void RepeatedField<Element>::AddAlreadyReserved(const Element& value) {
   GOOGLE_DCHECK_LT(current_size_, total_size_);
   elements()[current_size_++] = value;
 }
 
-template<typename Element>
+template <typename Element>
 inline Element* RepeatedField<Element>::AddAlreadyReserved() {
   GOOGLE_DCHECK_LT(current_size_, total_size_);
   return &elements()[current_size_++];
 }
 
-template<typename Element>
+template <typename Element>
 inline Element* RepeatedField<Element>::AddNAlreadyReserved(int n) {
   GOOGLE_DCHECK_GE(total_size_ - current_size_, n)
       << total_size_ << ", " << current_size_;
@@ -1194,7 +1177,7 @@
   return ret;
 }
 
-template<typename Element>
+template <typename Element>
 inline void RepeatedField<Element>::Resize(int new_size, const Element& value) {
   GOOGLE_DCHECK_GE(new_size, 0);
   if (new_size > current_size_) {
@@ -1258,16 +1241,15 @@
 }
 
 template <typename Element>
-void RepeatedField<Element>::ExtractSubrange(
-    int start, int num, Element* elements) {
+void RepeatedField<Element>::ExtractSubrange(int start, int num,
+                                             Element* elements) {
   GOOGLE_DCHECK_GE(start, 0);
   GOOGLE_DCHECK_GE(num, 0);
   GOOGLE_DCHECK_LE(start + num, this->current_size_);
 
   // Save the values of the removed elements if requested.
   if (elements != NULL) {
-    for (int i = 0; i < num; ++i)
-      elements[i] = this->Get(i + start);
+    for (int i = 0; i < num; ++i) elements[i] = this->Get(i + start);
   }
 
   // Slide remaining elements down to fill the gap.
@@ -1383,8 +1365,7 @@
   return total_size_ > 0 ? elements() : NULL;
 }
 template <typename Element>
-inline typename RepeatedField<Element>::iterator
-RepeatedField<Element>::end() {
+inline typename RepeatedField<Element>::iterator RepeatedField<Element>::end() {
   return total_size_ > 0 ? elements() + current_size_ : NULL;
 }
 template <typename Element>
@@ -1417,7 +1398,8 @@
       static_cast<size_t>(new_size),
       (std::numeric_limits<size_t>::max() - kRepHeaderSize) / sizeof(Element))
       << "Requested size is too large to fit into size_t.";
-  size_t bytes = kRepHeaderSize + sizeof(Element) * static_cast<size_t>(new_size);
+  size_t bytes =
+      kRepHeaderSize + sizeof(Element) * static_cast<size_t>(new_size);
   if (arena == NULL) {
     new_rep = static_cast<Rep*>(::operator new(bytes));
   } else {
@@ -1459,22 +1441,23 @@
 }
 
 template <typename Element>
-inline void RepeatedField<Element>::MoveArray(
-  Element* to, Element* from, int array_size) {
+inline void RepeatedField<Element>::MoveArray(Element* to, Element* from,
+                                              int array_size) {
   CopyArray(to, from, array_size);
 }
 
 template <typename Element>
-inline void RepeatedField<Element>::CopyArray(
-  Element* to, const Element* from, int array_size) {
+inline void RepeatedField<Element>::CopyArray(Element* to, const Element* from,
+                                              int array_size) {
   internal::ElementCopier<Element>()(to, from, array_size);
 }
 
 namespace internal {
 
 template <typename Element, bool HasTrivialCopy>
-void ElementCopier<Element, HasTrivialCopy>::operator()(
-  Element* to, const Element* from, int array_size) {
+void ElementCopier<Element, HasTrivialCopy>::operator()(Element* to,
+                                                        const Element* from,
+                                                        int array_size) {
   std::copy(from, from + array_size, to);
 }
 
@@ -1493,11 +1476,7 @@
 namespace internal {
 
 inline RepeatedPtrFieldBase::RepeatedPtrFieldBase()
-  : arena_(NULL),
-    current_size_(0),
-    total_size_(0),
-    rep_(NULL) {
-}
+    : arena_(NULL), current_size_(0), total_size_(0), rep_(NULL) {}
 
 inline RepeatedPtrFieldBase::RepeatedPtrFieldBase(Arena* arena)
     : arena_(arena), current_size_(0), total_size_(0), rep_(NULL) {}
@@ -1545,17 +1524,13 @@
   temp.Destroy<TypeHandler>();  // Frees rep_ if `other` had no arena.
 }
 
-inline bool RepeatedPtrFieldBase::empty() const {
-  return current_size_ == 0;
-}
+inline bool RepeatedPtrFieldBase::empty() const { return current_size_ == 0; }
 
-inline int RepeatedPtrFieldBase::size() const {
-  return current_size_;
-}
+inline int RepeatedPtrFieldBase::size() const { return current_size_; }
 
 template <typename TypeHandler>
-inline const typename TypeHandler::WeakType&
-RepeatedPtrFieldBase::Get(int index) const {
+inline const typename TypeHandler::WeakType& RepeatedPtrFieldBase::Get(
+    int index) const {
   GOOGLE_DCHECK_GE(index, 0);
   GOOGLE_DCHECK_LT(index, current_size_);
   return *cast<TypeHandler>(rep_->elements[index]);
@@ -1577,8 +1552,7 @@
 }
 
 template <typename TypeHandler>
-inline typename TypeHandler::Type*
-RepeatedPtrFieldBase::Mutable(int index) {
+inline typename TypeHandler::Type* RepeatedPtrFieldBase::Mutable(int index) {
   GOOGLE_DCHECK_GE(index, 0);
   GOOGLE_DCHECK_LT(index, current_size_);
   return cast<TypeHandler>(rep_->elements[index]);
@@ -1653,8 +1627,8 @@
 inline void RepeatedPtrFieldBase::MergeFrom(const RepeatedPtrFieldBase& other) {
   GOOGLE_DCHECK_NE(&other, this);
   if (other.current_size_ == 0) return;
-  MergeFromInternal(
-      other, &RepeatedPtrFieldBase::MergeFromInnerLoop<TypeHandler>);
+  MergeFromInternal(other,
+                    &RepeatedPtrFieldBase::MergeFromInnerLoop<TypeHandler>);
 }
 
 inline void RepeatedPtrFieldBase::MergeFromInternal(
@@ -1665,8 +1639,8 @@
   void** other_elements = other.rep_->elements;
   void** new_elements = InternalExtend(other_size);
   int allocated_elems = rep_->allocated_size - current_size_;
-  (this->*inner_loop)(new_elements, other_elements,
-                      other_size, allocated_elems);
+  (this->*inner_loop)(new_elements, other_elements, other_size,
+                      allocated_elems);
   current_size_ += other_size;
   if (rep_->allocated_size < current_size_) {
     rep_->allocated_size = current_size_;
@@ -1674,9 +1648,10 @@
 }
 
 // Merges other_elems to our_elems.
-template<typename TypeHandler>
-void RepeatedPtrFieldBase::MergeFromInnerLoop(
-    void** our_elems, void** other_elems, int length, int already_allocated) {
+template <typename TypeHandler>
+void RepeatedPtrFieldBase::MergeFromInnerLoop(void** our_elems,
+                                              void** other_elems, int length,
+                                              int already_allocated) {
   // Split into two loops, over ranges [0, allocated) and [allocated, length),
   // to avoid a branch within the loop.
   for (int i = 0; i < already_allocated && i < length; i++) {
@@ -1706,9 +1681,7 @@
   RepeatedPtrFieldBase::MergeFrom<TypeHandler>(other);
 }
 
-inline int RepeatedPtrFieldBase::Capacity() const {
-  return total_size_;
-}
+inline int RepeatedPtrFieldBase::Capacity() const { return total_size_; }
 
 inline void* const* RepeatedPtrFieldBase::raw_data() const {
   return rep_ ? rep_->elements : NULL;
@@ -1726,8 +1699,8 @@
 }
 
 template <typename TypeHandler>
-inline const typename TypeHandler::Type* const*
-RepeatedPtrFieldBase::data() const {
+inline const typename TypeHandler::Type* const* RepeatedPtrFieldBase::data()
+    const {
   // TODO(kenton):  Breaks C++ aliasing rules.  We should probably remove this
   //   method entirely.
   return reinterpret_cast<const typename TypeHandler::Type* const*>(raw_data());
@@ -1743,8 +1716,8 @@
   size_t allocated_bytes = static_cast<size_t>(total_size_) * sizeof(void*);
   if (rep_ != NULL) {
     for (int i = 0; i < rep_->allocated_size; ++i) {
-      allocated_bytes += TypeHandler::SpaceUsedLong(
-          *cast<TypeHandler>(rep_->elements[i]));
+      allocated_bytes +=
+          TypeHandler::SpaceUsedLong(*cast<TypeHandler>(rep_->elements[i]));
     }
     allocated_bytes += kRepHeaderSize;
   }
@@ -1763,13 +1736,11 @@
 // AddAllocated version that implements arena-safe copying behavior.
 template <typename TypeHandler>
 void RepeatedPtrFieldBase::AddAllocatedInternal(
-    typename TypeHandler::Type* value,
-    std::true_type) {
-  Arena* element_arena = reinterpret_cast<Arena*>(
-      TypeHandler::GetMaybeArenaPointer(value));
+    typename TypeHandler::Type* value, std::true_type) {
+  Arena* element_arena =
+      reinterpret_cast<Arena*>(TypeHandler::GetMaybeArenaPointer(value));
   Arena* arena = GetArenaNoVirtual();
-  if (arena == element_arena && rep_ &&
-      rep_->allocated_size < total_size_) {
+  if (arena == element_arena && rep_ && rep_->allocated_size < total_size_) {
     // Fast path: underlying arena representation (tagged pointer) is equal to
     // our arena pointer, and we can add to array without resizing it (at least
     // one slot that is not allocated).
@@ -1783,13 +1754,13 @@
     current_size_ = current_size_ + 1;
     rep_->allocated_size = rep_->allocated_size + 1;
   } else {
-    AddAllocatedSlowWithCopy<TypeHandler>(
-        value, TypeHandler::GetArena(value), arena);
+    AddAllocatedSlowWithCopy<TypeHandler>(value, TypeHandler::GetArena(value),
+                                          arena);
   }
 }
 
 // Slowpath handles all cases, copying if necessary.
-template<typename TypeHandler>
+template <typename TypeHandler>
 void RepeatedPtrFieldBase::AddAllocatedSlowWithCopy(
     // Pass value_arena and my_arena to avoid duplicate virtual call (value) or
     // load (mine).
@@ -1813,9 +1784,8 @@
 // AddAllocated version that does not implement arena-safe copying behavior.
 template <typename TypeHandler>
 void RepeatedPtrFieldBase::AddAllocatedInternal(
-    typename TypeHandler::Type* value,
-    std::false_type) {
-  if (rep_ &&  rep_->allocated_size < total_size_) {
+    typename TypeHandler::Type* value, std::false_type) {
+  if (rep_ && rep_->allocated_size < total_size_) {
     // Fast path: underlying arena representation (tagged pointer) is equal to
     // our arena pointer, and we can add to array without resizing it (at least
     // one slot that is not allocated).
@@ -1846,8 +1816,8 @@
     // cleared objects awaiting reuse.  We don't want to grow the array in this
     // case because otherwise a loop calling AddAllocated() followed by Clear()
     // would leak memory.
-    TypeHandler::Delete(
-        cast<TypeHandler>(rep_->elements[current_size_]), arena_);
+    TypeHandler::Delete(cast<TypeHandler>(rep_->elements[current_size_]),
+                        arena_);
   } else if (current_size_ < rep_->allocated_size) {
     // We have some cleared objects.  We don't care about their order, so we
     // can just move the first one to the end to make space.
@@ -1863,8 +1833,8 @@
 
 // ReleaseLast() for types that implement merge/copy behavior.
 template <typename TypeHandler>
-inline typename TypeHandler::Type*
-RepeatedPtrFieldBase::ReleaseLastInternal(std::true_type) {
+inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseLastInternal(
+    std::true_type) {
   // First, release an element.
   typename TypeHandler::Type* result = UnsafeArenaReleaseLast<TypeHandler>();
   // Now perform a copy if we're on an arena.
@@ -1884,8 +1854,8 @@
 // an arena, since the user really should implement the copy operation in this
 // case.
 template <typename TypeHandler>
-inline typename TypeHandler::Type*
-RepeatedPtrFieldBase::ReleaseLastInternal(std::false_type) {
+inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseLastInternal(
+    std::false_type) {
   GOOGLE_DCHECK(GetArenaNoVirtual() == NULL)
       << "ReleaseLast() called on a RepeatedPtrField that is on an arena, "
       << "with a type that does not implement MergeFrom. This is unsafe; "
@@ -1895,7 +1865,7 @@
 
 template <typename TypeHandler>
 inline typename TypeHandler::Type*
-  RepeatedPtrFieldBase::UnsafeArenaReleaseLast() {
+RepeatedPtrFieldBase::UnsafeArenaReleaseLast() {
   GOOGLE_DCHECK_GT(current_size_, 0);
   typename TypeHandler::Type* result =
       cast<TypeHandler>(rep_->elements[--current_size_]);
@@ -1942,16 +1912,14 @@
 
 template <typename Element>
 class RepeatedPtrField<Element>::TypeHandler
-    : public internal::GenericTypeHandler<Element> {
-};
+    : public internal::GenericTypeHandler<Element> {};
 
 template <>
 class RepeatedPtrField<std::string>::TypeHandler
     : public internal::StringTypeHandler {};
 
 template <typename Element>
-inline RepeatedPtrField<Element>::RepeatedPtrField()
-  : RepeatedPtrFieldBase() {}
+inline RepeatedPtrField<Element>::RepeatedPtrField() : RepeatedPtrFieldBase() {}
 
 template <typename Element>
 inline RepeatedPtrField<Element>::RepeatedPtrField(Arena* arena)
@@ -1960,14 +1928,14 @@
 template <typename Element>
 inline RepeatedPtrField<Element>::RepeatedPtrField(
     const RepeatedPtrField& other)
-  : RepeatedPtrFieldBase() {
+    : RepeatedPtrFieldBase() {
   MergeFrom(other);
 }
 
 template <typename Element>
 template <typename Iter>
-inline RepeatedPtrField<Element>::RepeatedPtrField(
-    Iter begin, const Iter& end) {
+inline RepeatedPtrField<Element>::RepeatedPtrField(Iter begin,
+                                                   const Iter& end) {
   int reserve = internal::CalculateReserve(begin, end);
   if (reserve != -1) {
     Reserve(reserve);
@@ -1985,8 +1953,7 @@
 template <typename Element>
 inline RepeatedPtrField<Element>& RepeatedPtrField<Element>::operator=(
     const RepeatedPtrField& other) {
-  if (this != &other)
-    CopyFrom(other);
+  if (this != &other) CopyFrom(other);
   return *this;
 }
 
@@ -1995,7 +1962,8 @@
     RepeatedPtrField&& other) noexcept
     : RepeatedPtrField() {
   // We don't just call Swap(&other) here because it would perform 3 copies if
-  // the two fields are on different arenas.
+  // other is on an arena. This field can't be on an arena because arena
+  // construction always uses the Arena* accepting constructor.
   if (other.GetArenaNoVirtual()) {
     CopyFrom(other);
   } else {
@@ -2076,8 +2044,8 @@
 }
 
 template <typename Element>
-inline void RepeatedPtrField<Element>::ExtractSubrange(
-    int start, int num, Element** elements) {
+inline void RepeatedPtrField<Element>::ExtractSubrange(int start, int num,
+                                                       Element** elements) {
   typename internal::TypeImplementsMergeBehavior<
       typename TypeHandler::Type>::type t;
   ExtractSubrangeInternal(start, num, elements, t);
@@ -2099,8 +2067,8 @@
         // If we're on an arena, we perform a copy for each element so that the
         // returned elements are heap-allocated.
         for (int i = 0; i < num; ++i) {
-          Element* element = RepeatedPtrFieldBase::
-              Mutable<TypeHandler>(i + start);
+          Element* element =
+              RepeatedPtrFieldBase::Mutable<TypeHandler>(i + start);
           typename TypeHandler::Type* new_value =
               TypeHandler::NewFromPrototype(element, NULL);
           TypeHandler::Merge(*element, new_value);
@@ -2118,7 +2086,7 @@
 
 // ExtractSubrange() implementation for types that do not implement merge/copy
 // behavior.
-template<typename Element>
+template <typename Element>
 inline void RepeatedPtrField<Element>::ExtractSubrangeInternal(
     int start, int num, Element** elements, std::false_type) {
   // This case is identical to UnsafeArenaExtractSubrange(). However, since
@@ -2161,8 +2129,7 @@
 }
 
 template <typename Element>
-inline void RepeatedPtrField<Element>::CopyFrom(
-    const RepeatedPtrField& other) {
+inline void RepeatedPtrField<Element>::CopyFrom(const RepeatedPtrField& other) {
   RepeatedPtrFieldBase::CopyFrom<TypeHandler>(other);
 }
 
@@ -2193,16 +2160,14 @@
 
 template <typename Element>
 inline void RepeatedPtrField<Element>::Swap(RepeatedPtrField* other) {
-  if (this == other)
-    return;
+  if (this == other) return;
   RepeatedPtrFieldBase::Swap<TypeHandler>(other);
 }
 
 template <typename Element>
 inline void RepeatedPtrField<Element>::UnsafeArenaSwap(
     RepeatedPtrField* other) {
-  if (this == other)
-      return;
+  if (this == other) return;
   RepeatedPtrFieldBase::InternalSwap(other);
 }
 
@@ -2281,31 +2246,22 @@
 //
 // This code based on net/proto/proto-array-internal.h by Jeffrey Yasskin
 // (jyasskin@google.com).
-template<typename Element>
-class RepeatedPtrIterator
-    : public std::iterator<
-          std::random_access_iterator_tag, Element> {
+template <typename Element>
+class RepeatedPtrIterator {
  public:
-  typedef RepeatedPtrIterator<Element> iterator;
-  typedef std::iterator<
-          std::random_access_iterator_tag, Element> superclass;
-
-  // Shadow the value_type in std::iterator<> because const_iterator::value_type
-  // needs to be T, not const T.
-  typedef typename std::remove_const<Element>::type value_type;
-
-  // Let the compiler know that these are type names, so we don't have to
-  // write "typename" in front of them everywhere.
-  typedef typename superclass::reference reference;
-  typedef typename superclass::pointer pointer;
-  typedef typename superclass::difference_type difference_type;
+  using iterator = RepeatedPtrIterator<Element>;
+  using iterator_category = std::random_access_iterator_tag;
+  using value_type = typename std::remove_const<Element>::type;
+  using difference_type = std::ptrdiff_t;
+  using pointer = Element*;
+  using reference = Element&;
 
   RepeatedPtrIterator() : it_(NULL) {}
   explicit RepeatedPtrIterator(void* const* it) : it_(it) {}
 
   // Allow "upcasting" from RepeatedPtrIterator<T**> to
   // RepeatedPtrIterator<const T*const*>.
-  template<typename OtherElement>
+  template <typename OtherElement>
   RepeatedPtrIterator(const RepeatedPtrIterator<OtherElement>& other)
       : it_(other.it_) {
     // Force a compiler error if the other type is not convertible to ours.
@@ -2316,13 +2272,19 @@
 
   // dereferenceable
   reference operator*() const { return *reinterpret_cast<Element*>(*it_); }
-  pointer   operator->() const { return &(operator*()); }
+  pointer operator->() const { return &(operator*()); }
 
   // {inc,dec}rementable
-  iterator& operator++() { ++it_; return *this; }
-  iterator  operator++(int) { return iterator(it_++); }
-  iterator& operator--() { --it_; return *this; }
-  iterator  operator--(int) { return iterator(it_--); }
+  iterator& operator++() {
+    ++it_;
+    return *this;
+  }
+  iterator operator++(int) { return iterator(it_++); }
+  iterator& operator--() {
+    --it_;
+    return *this;
+  }
+  iterator operator--(int) { return iterator(it_--); }
 
   // equality_comparable
   bool operator==(const iterator& x) const { return it_ == x.it_; }
@@ -2363,7 +2325,7 @@
   difference_type operator-(const iterator& x) const { return it_ - x.it_; }
 
  private:
-  template<typename OtherElement>
+  template <typename OtherElement>
   friend class RepeatedPtrIterator;
 
   // The internal iterator.
@@ -2378,34 +2340,33 @@
 // referenced by the iterator.  It should either be "void *" for a mutable
 // iterator, or "const void* const" for a constant iterator.
 template <typename Element, typename VoidPtr>
-class RepeatedPtrOverPtrsIterator
-    : public std::iterator<std::random_access_iterator_tag, Element> {
+class RepeatedPtrOverPtrsIterator {
  public:
-  typedef RepeatedPtrOverPtrsIterator<Element, VoidPtr> iterator;
-  typedef std::iterator<std::random_access_iterator_tag, Element> superclass;
-
-  // Shadow the value_type in std::iterator<> because const_iterator::value_type
-  // needs to be T, not const T.
-  typedef typename std::remove_const<Element>::type value_type;
-
-  // Let the compiler know that these are type names, so we don't have to
-  // write "typename" in front of them everywhere.
-  typedef typename superclass::reference reference;
-  typedef typename superclass::pointer pointer;
-  typedef typename superclass::difference_type difference_type;
+  using iterator = RepeatedPtrOverPtrsIterator<Element, VoidPtr>;
+  using iterator_category = std::random_access_iterator_tag;
+  using value_type = typename std::remove_const<Element>::type;
+  using difference_type = std::ptrdiff_t;
+  using pointer = Element*;
+  using reference = Element&;
 
   RepeatedPtrOverPtrsIterator() : it_(NULL) {}
   explicit RepeatedPtrOverPtrsIterator(VoidPtr* it) : it_(it) {}
 
   // dereferenceable
   reference operator*() const { return *reinterpret_cast<Element*>(it_); }
-  pointer   operator->() const { return &(operator*()); }
+  pointer operator->() const { return &(operator*()); }
 
   // {inc,dec}rementable
-  iterator& operator++() { ++it_; return *this; }
-  iterator  operator++(int) { return iterator(it_++); }
-  iterator& operator--() { --it_; return *this; }
-  iterator  operator--(int) { return iterator(it_--); }
+  iterator& operator++() {
+    ++it_;
+    return *this;
+  }
+  iterator operator++(int) { return iterator(it_++); }
+  iterator& operator--() {
+    --it_;
+    return *this;
+  }
+  iterator operator--(int) { return iterator(it_--); }
 
   // equality_comparable
   bool operator==(const iterator& x) const { return it_ == x.it_; }
@@ -2446,7 +2407,7 @@
   difference_type operator-(const iterator& x) const { return it_ - x.it_; }
 
  private:
-  template<typename OtherElement>
+  template <typename OtherElement>
   friend class RepeatedPtrIterator;
 
   // The internal iterator.
@@ -2528,23 +2489,19 @@
 
 namespace internal {
 // A back inserter for RepeatedField objects.
-template<typename T> class RepeatedFieldBackInsertIterator
+template <typename T>
+class RepeatedFieldBackInsertIterator
     : public std::iterator<std::output_iterator_tag, T> {
  public:
   explicit RepeatedFieldBackInsertIterator(
       RepeatedField<T>* const mutable_field)
-      : field_(mutable_field) {
-  }
+      : field_(mutable_field) {}
   RepeatedFieldBackInsertIterator<T>& operator=(const T& value) {
     field_->Add(value);
     return *this;
   }
-  RepeatedFieldBackInsertIterator<T>& operator*() {
-    return *this;
-  }
-  RepeatedFieldBackInsertIterator<T>& operator++() {
-    return *this;
-  }
+  RepeatedFieldBackInsertIterator<T>& operator*() { return *this; }
+  RepeatedFieldBackInsertIterator<T>& operator++() { return *this; }
   RepeatedFieldBackInsertIterator<T>& operator++(int /* unused */) {
     return *this;
   }
@@ -2554,13 +2511,12 @@
 };
 
 // A back inserter for RepeatedPtrField objects.
-template<typename T> class RepeatedPtrFieldBackInsertIterator
+template <typename T>
+class RepeatedPtrFieldBackInsertIterator
     : public std::iterator<std::output_iterator_tag, T> {
  public:
-  RepeatedPtrFieldBackInsertIterator(
-      RepeatedPtrField<T>* const mutable_field)
-      : field_(mutable_field) {
-  }
+  RepeatedPtrFieldBackInsertIterator(RepeatedPtrField<T>* const mutable_field)
+      : field_(mutable_field) {}
   RepeatedPtrFieldBackInsertIterator<T>& operator=(const T& value) {
     *field_->Add() = value;
     return *this;
@@ -2574,12 +2530,8 @@
     *field_->Add() = std::move(value);
     return *this;
   }
-  RepeatedPtrFieldBackInsertIterator<T>& operator*() {
-    return *this;
-  }
-  RepeatedPtrFieldBackInsertIterator<T>& operator++() {
-    return *this;
-  }
+  RepeatedPtrFieldBackInsertIterator<T>& operator*() { return *this; }
+  RepeatedPtrFieldBackInsertIterator<T>& operator++() { return *this; }
   RepeatedPtrFieldBackInsertIterator<T>& operator++(int /* unused */) {
     return *this;
   }
@@ -2590,26 +2542,21 @@
 
 // A back inserter for RepeatedPtrFields that inserts by transferring ownership
 // of a pointer.
-template<typename T> class AllocatedRepeatedPtrFieldBackInsertIterator
+template <typename T>
+class AllocatedRepeatedPtrFieldBackInsertIterator
     : public std::iterator<std::output_iterator_tag, T> {
  public:
   explicit AllocatedRepeatedPtrFieldBackInsertIterator(
       RepeatedPtrField<T>* const mutable_field)
-      : field_(mutable_field) {
-  }
+      : field_(mutable_field) {}
   AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator=(
       T* const ptr_to_value) {
     field_->AddAllocated(ptr_to_value);
     return *this;
   }
-  AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator*() {
-    return *this;
-  }
-  AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator++() {
-    return *this;
-  }
-  AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator++(
-      int /* unused */) {
+  AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator*() { return *this; }
+  AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator++() { return *this; }
+  AllocatedRepeatedPtrFieldBackInsertIterator<T>& operator++(int /* unused */) {
     return *this;
   }
 
@@ -2619,7 +2566,7 @@
 
 // Almost identical to AllocatedRepeatedPtrFieldBackInsertIterator. This one
 // uses the UnsafeArenaAddAllocated instead.
-template<typename T>
+template <typename T>
 class UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator
     : public std::iterator<std::output_iterator_tag, T> {
  public:
@@ -2627,7 +2574,7 @@
       RepeatedPtrField<T>* const mutable_field)
       : field_(mutable_field) {}
   UnsafeArenaAllocatedRepeatedPtrFieldBackInsertIterator<T>& operator=(
-    T const* const ptr_to_value) {
+      T const* const ptr_to_value) {
     field_->UnsafeArenaAddAllocated(const_cast<T*>(ptr_to_value));
     return *this;
   }
@@ -2650,30 +2597,34 @@
 
 // Provides a back insert iterator for RepeatedField instances,
 // similar to std::back_inserter().
-template<typename T> internal::RepeatedFieldBackInsertIterator<T>
-RepeatedFieldBackInserter(RepeatedField<T>* const mutable_field) {
+template <typename T>
+internal::RepeatedFieldBackInsertIterator<T> RepeatedFieldBackInserter(
+    RepeatedField<T>* const mutable_field) {
   return internal::RepeatedFieldBackInsertIterator<T>(mutable_field);
 }
 
 // Provides a back insert iterator for RepeatedPtrField instances,
 // similar to std::back_inserter().
-template<typename T> internal::RepeatedPtrFieldBackInsertIterator<T>
-RepeatedPtrFieldBackInserter(RepeatedPtrField<T>* const mutable_field) {
+template <typename T>
+internal::RepeatedPtrFieldBackInsertIterator<T> RepeatedPtrFieldBackInserter(
+    RepeatedPtrField<T>* const mutable_field) {
   return internal::RepeatedPtrFieldBackInsertIterator<T>(mutable_field);
 }
 
 // Special back insert iterator for RepeatedPtrField instances, just in
 // case someone wants to write generic template code that can access both
 // RepeatedFields and RepeatedPtrFields using a common name.
-template<typename T> internal::RepeatedPtrFieldBackInsertIterator<T>
-RepeatedFieldBackInserter(RepeatedPtrField<T>* const mutable_field) {
+template <typename T>
+internal::RepeatedPtrFieldBackInsertIterator<T> RepeatedFieldBackInserter(
+    RepeatedPtrField<T>* const mutable_field) {
   return internal::RepeatedPtrFieldBackInsertIterator<T>(mutable_field);
 }
 
 // Provides a back insert iterator for RepeatedPtrField instances
 // similar to std::back_inserter() which transfers the ownership while
 // copying elements.
-template<typename T> internal::AllocatedRepeatedPtrFieldBackInsertIterator<T>
+template <typename T>
+internal::AllocatedRepeatedPtrFieldBackInsertIterator<T>
 AllocatedRepeatedPtrFieldBackInserter(
     RepeatedPtrField<T>* const mutable_field) {
   return internal::AllocatedRepeatedPtrFieldBackInsertIterator<T>(
diff --git a/src/google/protobuf/repeated_field_reflection_unittest.cc b/src/google/protobuf/repeated_field_reflection_unittest.cc
index 6ec428e..0499102 100644
--- a/src/google/protobuf/repeated_field_reflection_unittest.cc
+++ b/src/google/protobuf/repeated_field_reflection_unittest.cc
@@ -35,9 +35,9 @@
 
 #include <google/protobuf/stubs/casts.h>
 #include <google/protobuf/stubs/stringprintf.h>
-#include <google/protobuf/dynamic_message.h>
-#include <google/protobuf/unittest.pb.h>
 #include <google/protobuf/test_util.h>
+#include <google/protobuf/unittest.pb.h>
+#include <google/protobuf/dynamic_message.h>
 #include <google/protobuf/reflection.h>
 #include <gtest/gtest.h>
 
@@ -45,14 +45,12 @@
 namespace protobuf {
 
 using unittest::ForeignMessage;
-using unittest::TestAllTypes;
 using unittest::TestAllExtensions;
+using unittest::TestAllTypes;
 
 namespace {
 
-static int Func(int i, int j) {
-  return i * j;
-}
+static int Func(int i, int j) { return i * j; }
 
 static std::string StrFunc(int i, int j) {
   std::string str;
@@ -98,11 +96,10 @@
   const RepeatedPtrField<std::string>& rpf_string =
       refl->GetRepeatedPtrField<std::string>(message, fd_repeated_string);
   const RepeatedPtrField<ForeignMessage>& rpf_foreign_message =
-      refl->GetRepeatedPtrField<ForeignMessage>(
-          message, fd_repeated_foreign_message);
+      refl->GetRepeatedPtrField<ForeignMessage>(message,
+                                                fd_repeated_foreign_message);
   const RepeatedPtrField<Message>& rpf_message =
-      refl->GetRepeatedPtrField<Message>(
-          message, fd_repeated_foreign_message);
+      refl->GetRepeatedPtrField<Message>(message, fd_repeated_foreign_message);
 
   // Get mutable RepeatedPtrField objects for all fields of interest.
   RepeatedPtrField<std::string>* mrpf_string =
@@ -111,8 +108,8 @@
       refl->MutableRepeatedPtrField<ForeignMessage>(
           &message, fd_repeated_foreign_message);
   RepeatedPtrField<Message>* mrpf_message =
-      refl->MutableRepeatedPtrField<Message>(
-          &message, fd_repeated_foreign_message);
+      refl->MutableRepeatedPtrField<Message>(&message,
+                                             fd_repeated_foreign_message);
 
   // Make sure we can do gets and sets through the Repeated[Ptr]Field objects.
   for (int i = 0; i < 10; ++i) {
@@ -149,12 +146,13 @@
   // Make sure types are checked correctly at runtime.
   const FieldDescriptor* fd_optional_int32 =
       desc->FindFieldByName("optional_int32");
-  EXPECT_DEATH(refl->GetRepeatedField<int32>(
-      message, fd_optional_int32), "requires a repeated field");
-  EXPECT_DEATH(refl->GetRepeatedField<double>(
-      message, fd_repeated_int32), "not the right type");
+  EXPECT_DEATH(refl->GetRepeatedField<int32>(message, fd_optional_int32),
+               "requires a repeated field");
+  EXPECT_DEATH(refl->GetRepeatedField<double>(message, fd_repeated_int32),
+               "not the right type");
   EXPECT_DEATH(refl->GetRepeatedPtrField<TestAllTypes>(
-      message, fd_repeated_foreign_message), "wrong submessage type");
+                   message, fd_repeated_foreign_message),
+               "wrong submessage type");
 #endif  // PROTOBUF_HAS_DEATH_TEST
 }
 
@@ -165,8 +163,8 @@
   const Descriptor* desc = extended_message.GetDescriptor();
 
   for (int i = 0; i < 10; ++i) {
-    extended_message.AddExtension(
-        unittest::repeated_int64_extension, Func(i, 1));
+    extended_message.AddExtension(unittest::repeated_int64_extension,
+                                  Func(i, 1));
   }
 
   const FieldDescriptor* fd_repeated_int64_extension =
@@ -177,15 +175,14 @@
       refl->GetRepeatedField<int64>(extended_message,
                                     fd_repeated_int64_extension);
 
-  RepeatedField<int64>* mrf_int64_extension =
-      refl->MutableRepeatedField<int64>(&extended_message,
-                                        fd_repeated_int64_extension);
+  RepeatedField<int64>* mrf_int64_extension = refl->MutableRepeatedField<int64>(
+      &extended_message, fd_repeated_int64_extension);
 
   for (int i = 0; i < 10; ++i) {
     EXPECT_EQ(Func(i, 1), rf_int64_extension.Get(i));
     mrf_int64_extension->Set(i, Func(i, -1));
-    EXPECT_EQ(Func(i, -1),
-        extended_message.GetExtension(unittest::repeated_int64_extension, i));
+    EXPECT_EQ(Func(i, -1), extended_message.GetExtension(
+                               unittest::repeated_int64_extension, i));
   }
 }
 
@@ -194,8 +191,8 @@
     const Ref& handle, const MessageType& message,
     ValueType (MessageType::*GetFunc)(int) const) {
   int index = 0;
-  for (typename Ref::const_iterator it = handle.begin();
-       it != handle.end(); ++it) {
+  for (typename Ref::const_iterator it = handle.begin(); it != handle.end();
+       ++it) {
     EXPECT_EQ((message.*GetFunc)(index), *it);
     ++index;
   }
@@ -248,11 +245,10 @@
   const RepeatedFieldRef<std::string> rf_string =
       refl->GetRepeatedFieldRef<std::string>(message, fd_repeated_string);
   const RepeatedFieldRef<ForeignMessage> rf_foreign_message =
-      refl->GetRepeatedFieldRef<ForeignMessage>(
-          message, fd_repeated_foreign_message);
+      refl->GetRepeatedFieldRef<ForeignMessage>(message,
+                                                fd_repeated_foreign_message);
   const RepeatedFieldRef<Message> rf_message =
-      refl->GetRepeatedFieldRef<Message>(
-          message, fd_repeated_foreign_message);
+      refl->GetRepeatedFieldRef<Message>(message, fd_repeated_foreign_message);
 
   // Get MutableRepeatedFieldRef objects for all fields of interest.
   const MutableRepeatedFieldRef<int32> mrf_int32 =
@@ -266,8 +262,8 @@
       refl->GetMutableRepeatedFieldRef<ForeignMessage>(
           &message, fd_repeated_foreign_message);
   const MutableRepeatedFieldRef<Message> mrf_message =
-      refl->GetMutableRepeatedFieldRef<Message>(
-          &message, fd_repeated_foreign_message);
+      refl->GetMutableRepeatedFieldRef<Message>(&message,
+                                                fd_repeated_foreign_message);
 
   EXPECT_EQ(message.repeated_int32_size(), rf_int32.size());
   EXPECT_EQ(message.repeated_int32_size(), mrf_int32.size());
@@ -275,8 +271,7 @@
   EXPECT_EQ(message.repeated_double_size(), mrf_double.size());
   EXPECT_EQ(message.repeated_string_size(), rf_string.size());
   EXPECT_EQ(message.repeated_string_size(), mrf_string.size());
-  EXPECT_EQ(message.repeated_foreign_message_size(),
-            rf_foreign_message.size());
+  EXPECT_EQ(message.repeated_foreign_message_size(), rf_foreign_message.size());
   EXPECT_EQ(message.repeated_foreign_message_size(),
             mrf_foreign_message.size());
   EXPECT_EQ(message.repeated_foreign_message_size(), rf_message.size());
@@ -301,16 +296,19 @@
     EXPECT_EQ(rf_string.Get(i), StrFunc(i, 5));
     ForeignMessage scratch_space;
     EXPECT_EQ(rf_foreign_message.Get(i, &scratch_space).c(), Func(i, 6));
-    EXPECT_EQ(down_cast<const ForeignMessage&>(
-        rf_message.Get(i, &scratch_space)).c(), Func(i, 6));
+    EXPECT_EQ(
+        down_cast<const ForeignMessage&>(rf_message.Get(i, &scratch_space)).c(),
+        Func(i, 6));
 
     // Check gets through mutable objects.
     EXPECT_EQ(mrf_int32.Get(i), Func(i, 1));
     EXPECT_EQ(mrf_double.Get(i), Func(i, 2));
     EXPECT_EQ(mrf_string.Get(i), StrFunc(i, 5));
     EXPECT_EQ(mrf_foreign_message.Get(i, &scratch_space).c(), Func(i, 6));
-    EXPECT_EQ(down_cast<const ForeignMessage&>(
-        mrf_message.Get(i, &scratch_space)).c(), Func(i, 6));
+    EXPECT_EQ(
+        down_cast<const ForeignMessage&>(mrf_message.Get(i, &scratch_space))
+            .c(),
+        Func(i, 6));
 
     // Check sets through mutable objects.
     mrf_int32.Set(i, Func(i, -1));
@@ -431,12 +429,13 @@
   // Make sure types are checked correctly at runtime.
   const FieldDescriptor* fd_optional_int32 =
       desc->FindFieldByName("optional_int32");
-  EXPECT_DEATH(refl->GetRepeatedFieldRef<int32>(
-      message, fd_optional_int32), "");
-  EXPECT_DEATH(refl->GetRepeatedFieldRef<double>(
-      message, fd_repeated_int32), "");
+  EXPECT_DEATH(refl->GetRepeatedFieldRef<int32>(message, fd_optional_int32),
+               "");
+  EXPECT_DEATH(refl->GetRepeatedFieldRef<double>(message, fd_repeated_int32),
+               "");
   EXPECT_DEATH(refl->GetRepeatedFieldRef<TestAllTypes>(
-      message, fd_repeated_foreign_message), "");
+                   message, fd_repeated_foreign_message),
+               "");
 
 #endif  // PROTOBUF_HAS_DEATH_TEST
 }
@@ -455,16 +454,14 @@
   const RepeatedFieldRef<TestAllTypes::NestedEnum> enum_ref =
       refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
           message, fd_repeated_nested_enum);
-  const MutableRepeatedFieldRef<TestAllTypes::NestedEnum>
-  mutable_enum_ref =
+  const MutableRepeatedFieldRef<TestAllTypes::NestedEnum> mutable_enum_ref =
       refl->GetMutableRepeatedFieldRef<TestAllTypes::NestedEnum>(
           &message, fd_repeated_nested_enum);
   const RepeatedFieldRef<int32> int32_ref =
-      refl->GetRepeatedFieldRef<int32>(
-          message, fd_repeated_nested_enum);
+      refl->GetRepeatedFieldRef<int32>(message, fd_repeated_nested_enum);
   const MutableRepeatedFieldRef<int32> mutable_int32_ref =
-      refl->GetMutableRepeatedFieldRef<int32>(
-          &message, fd_repeated_nested_enum);
+      refl->GetMutableRepeatedFieldRef<int32>(&message,
+                                              fd_repeated_nested_enum);
 
   EXPECT_EQ(message.repeated_nested_enum_size(), enum_ref.size());
   EXPECT_EQ(message.repeated_nested_enum_size(), mutable_enum_ref.size());
@@ -539,8 +536,8 @@
   const Descriptor* desc = extended_message.GetDescriptor();
 
   for (int i = 0; i < 10; ++i) {
-    extended_message.AddExtension(
-        unittest::repeated_int64_extension, Func(i, 1));
+    extended_message.AddExtension(unittest::repeated_int64_extension,
+                                  Func(i, 1));
   }
 
   const FieldDescriptor* fd_repeated_int64_extension =
@@ -549,17 +546,17 @@
 
   const RepeatedFieldRef<int64> rf_int64_extension =
       refl->GetRepeatedFieldRef<int64>(extended_message,
-                                          fd_repeated_int64_extension);
+                                       fd_repeated_int64_extension);
 
   const MutableRepeatedFieldRef<int64> mrf_int64_extension =
       refl->GetMutableRepeatedFieldRef<int64>(&extended_message,
-                                                 fd_repeated_int64_extension);
+                                              fd_repeated_int64_extension);
 
   for (int i = 0; i < 10; ++i) {
     EXPECT_EQ(Func(i, 1), rf_int64_extension.Get(i));
     mrf_int64_extension.Set(i, Func(i, -1));
-    EXPECT_EQ(Func(i, -1),
-        extended_message.GetExtension(unittest::repeated_int64_extension, i));
+    EXPECT_EQ(Func(i, -1), extended_message.GetExtension(
+                               unittest::repeated_int64_extension, i));
   }
 }
 
@@ -610,24 +607,20 @@
   const MutableRepeatedFieldRef<ForeignMessage> mrf_foreign_message =
       refl->GetMutableRepeatedFieldRef<ForeignMessage>(
           &m0, fd_repeated_foreign_message);
-  const MutableRepeatedFieldRef<TestAllTypes::NestedEnum>
-  mrf_nested_enum =
+  const MutableRepeatedFieldRef<TestAllTypes::NestedEnum> mrf_nested_enum =
       refl->GetMutableRepeatedFieldRef<TestAllTypes::NestedEnum>(
           &m0, fd_repeated_nested_enum);
 
   // Test MutableRepeatedRef::CopyFrom
-  mrf_int32.CopyFrom(
-      refl->GetRepeatedFieldRef<int32>(m1, fd_repeated_int32));
+  mrf_int32.CopyFrom(refl->GetRepeatedFieldRef<int32>(m1, fd_repeated_int32));
   mrf_double.CopyFrom(
       refl->GetRepeatedFieldRef<double>(m1, fd_repeated_double));
   mrf_string.CopyFrom(
       refl->GetRepeatedFieldRef<std::string>(m1, fd_repeated_string));
-  mrf_foreign_message.CopyFrom(
-      refl->GetRepeatedFieldRef<ForeignMessage>(
-          m1, fd_repeated_foreign_message));
-  mrf_nested_enum.CopyFrom(
-      refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
-          m1, fd_repeated_nested_enum));
+  mrf_foreign_message.CopyFrom(refl->GetRepeatedFieldRef<ForeignMessage>(
+      m1, fd_repeated_foreign_message));
+  mrf_nested_enum.CopyFrom(refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
+      m1, fd_repeated_nested_enum));
   for (int i = 0; i < 10; ++i) {
     EXPECT_EQ(Func(i, 11), m0.repeated_int32(i));
     EXPECT_EQ(Func(i, 12), m0.repeated_double(i));
@@ -637,18 +630,15 @@
   }
 
   // Test MutableRepeatedRef::MergeFrom
-  mrf_int32.MergeFrom(
-      refl->GetRepeatedFieldRef<int32>(m2, fd_repeated_int32));
+  mrf_int32.MergeFrom(refl->GetRepeatedFieldRef<int32>(m2, fd_repeated_int32));
   mrf_double.MergeFrom(
       refl->GetRepeatedFieldRef<double>(m2, fd_repeated_double));
   mrf_string.MergeFrom(
       refl->GetRepeatedFieldRef<std::string>(m2, fd_repeated_string));
-  mrf_foreign_message.MergeFrom(
-      refl->GetRepeatedFieldRef<ForeignMessage>(
-          m2, fd_repeated_foreign_message));
-  mrf_nested_enum.MergeFrom(
-      refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
-          m2, fd_repeated_nested_enum));
+  mrf_foreign_message.MergeFrom(refl->GetRepeatedFieldRef<ForeignMessage>(
+      m2, fd_repeated_foreign_message));
+  mrf_nested_enum.MergeFrom(refl->GetRepeatedFieldRef<TestAllTypes::NestedEnum>(
+      m2, fd_repeated_nested_enum));
   for (int i = 0; i < 10; ++i) {
     EXPECT_EQ(Func(i, 21), m0.repeated_int32(i + 10));
     EXPECT_EQ(Func(i, 22), m0.repeated_double(i + 10));
@@ -665,9 +655,8 @@
       refl->GetMutableRepeatedFieldRef<double>(&m2, fd_repeated_double));
   mrf_string.Swap(
       refl->GetMutableRepeatedFieldRef<std::string>(&m2, fd_repeated_string));
-  mrf_foreign_message.Swap(
-      refl->GetMutableRepeatedFieldRef<ForeignMessage>(
-          &m2, fd_repeated_foreign_message));
+  mrf_foreign_message.Swap(refl->GetMutableRepeatedFieldRef<ForeignMessage>(
+      &m2, fd_repeated_foreign_message));
   mrf_nested_enum.Swap(
       refl->GetMutableRepeatedFieldRef<TestAllTypes::NestedEnum>(
           &m2, fd_repeated_nested_enum));
@@ -710,12 +699,12 @@
   const Reflection* refl = dynamic_message->GetReflection();
 
   MutableRepeatedFieldRef<int32> rf_int32 =
-      refl->GetMutableRepeatedFieldRef<int32>(
-          dynamic_message.get(), fd_repeated_int32);
+      refl->GetMutableRepeatedFieldRef<int32>(dynamic_message.get(),
+                                              fd_repeated_int32);
   rf_int32.Add(1234);
   EXPECT_EQ(1, refl->FieldSize(*dynamic_message, fd_repeated_int32));
-  EXPECT_EQ(1234, refl->GetRepeatedInt32(*dynamic_message,
-                                         fd_repeated_int32, 0));
+  EXPECT_EQ(1234,
+            refl->GetRepeatedInt32(*dynamic_message, fd_repeated_int32, 0));
 }
 
 }  // namespace
diff --git a/src/google/protobuf/repeated_field_unittest.cc b/src/google/protobuf/repeated_field_unittest.cc
index 25ee24c..610cb91 100644
--- a/src/google/protobuf/repeated_field_unittest.cc
+++ b/src/google/protobuf/repeated_field_unittest.cc
@@ -629,27 +629,23 @@
       for (int start = 0; start < sz - num; ++start) {
         // Create RepeatedField with sz elements having values 0 through sz-1.
         RepeatedField<int32> field;
-        for (int i = 0; i < sz; ++i)
-          field.Add(i);
+        for (int i = 0; i < sz; ++i) field.Add(i);
         EXPECT_EQ(field.size(), sz);
 
         // Create a catcher array and call ExtractSubrange.
         int32 catcher[10];
-        for (int i = 0; i < 10; ++i)
-          catcher[i] = -1;
+        for (int i = 0; i < 10; ++i) catcher[i] = -1;
         field.ExtractSubrange(start, num, catcher);
 
         // Does the resulting array have the right size?
         EXPECT_EQ(field.size(), sz - num);
 
         // Were the removed elements extracted into the catcher array?
-        for (int i = 0; i < num; ++i)
-          EXPECT_EQ(catcher[i], start + i);
+        for (int i = 0; i < num; ++i) EXPECT_EQ(catcher[i], start + i);
         EXPECT_EQ(catcher[num], -1);
 
         // Does the resulting array contain the right values?
-        for (int i = 0; i < start; ++i)
-          EXPECT_EQ(field.Get(i), i);
+        for (int i = 0; i < start; ++i) EXPECT_EQ(field.Get(i), i);
         for (int i = start; i < field.size(); ++i)
           EXPECT_EQ(field.Get(i), i + num);
       }
@@ -1279,15 +1275,13 @@
             field.AddAllocated(subject[i]);
           }
           EXPECT_EQ(field.size(), sz + extra);
-          for (int i = 0; i < extra; ++i)
-            field.RemoveLast();
+          for (int i = 0; i < extra; ++i) field.RemoveLast();
           EXPECT_EQ(field.size(), sz);
           EXPECT_EQ(field.ClearedCount(), extra);
 
           // Create a catcher array and call ExtractSubrange.
           std::string* catcher[10];
-          for (int i = 0; i < 10; ++i)
-            catcher[i] = NULL;
+          for (int i = 0; i < 10; ++i) catcher[i] = NULL;
           field.ExtractSubrange(start, num, catcher);
 
           // Does the resulting array have the right size?
@@ -1306,8 +1300,7 @@
 
           // Reinstate the cleared elements.
           EXPECT_EQ(field.ClearedCount(), extra);
-          for (int i = 0; i < extra; ++i)
-            field.Add();
+          for (int i = 0; i < extra; ++i) field.Add();
           EXPECT_EQ(field.ClearedCount(), 0);
           EXPECT_EQ(field.size(), sz - num + extra);
 
@@ -1315,15 +1308,13 @@
           for (int i = sz; i < sz + extra; ++i) {
             int count = 0;
             for (int j = sz; j < sz + extra; ++j) {
-              if (field.Mutable(j - num) == subject[i])
-                count += 1;
+              if (field.Mutable(j - num) == subject[i]) count += 1;
             }
             EXPECT_EQ(count, 1);
           }
 
           // Release the caught elements.
-          for (int i = 0; i < num; ++i)
-            delete catcher[i];
+          for (int i = 0; i < num; ++i) delete catcher[i];
         }
       }
     }
@@ -1719,7 +1710,6 @@
   EXPECT_EQ("y", proto_array_.Get(9));
 }
 
-
 // -----------------------------------------------------------------------------
 // Unit-tests for the insert iterators
 // google::protobuf::RepeatedFieldBackInserter,
@@ -1785,8 +1775,7 @@
 };
 
 TEST_F(RepeatedFieldInsertionIteratorsTest, Fibonacci) {
-  EXPECT_TRUE(std::equal(fibonacci.begin(),
-                         fibonacci.end(),
+  EXPECT_TRUE(std::equal(fibonacci.begin(), fibonacci.end(),
                          protobuffer.repeated_int32().begin()));
   EXPECT_TRUE(std::equal(protobuffer.repeated_int32().begin(),
                          protobuffer.repeated_int32().end(),
@@ -1794,12 +1783,10 @@
 }
 
 TEST_F(RepeatedFieldInsertionIteratorsTest, Halves) {
-  EXPECT_TRUE(std::equal(halves.begin(),
-                         halves.end(),
+  EXPECT_TRUE(std::equal(halves.begin(), halves.end(),
                          protobuffer.repeated_double().begin()));
   EXPECT_TRUE(std::equal(protobuffer.repeated_double().begin(),
-                         protobuffer.repeated_double().end(),
-                         halves.begin()));
+                         protobuffer.repeated_double().end(), halves.begin()));
 }
 
 TEST_F(RepeatedFieldInsertionIteratorsTest, Words) {
@@ -1817,8 +1804,9 @@
   words.push_back("six");
   words.push_back("pence");
   protobuffer.mutable_repeated_string()->Clear();
-  std::copy(words.begin(), words.end(), RepeatedPtrFieldBackInserter(
-      protobuffer.mutable_repeated_string()));
+  std::copy(
+      words.begin(), words.end(),
+      RepeatedPtrFieldBackInserter(protobuffer.mutable_repeated_string()));
   ASSERT_EQ(words.size(), protobuffer.repeated_string_size());
   for (int i = 0; i < words.size(); ++i)
     EXPECT_EQ(words.at(i), protobuffer.repeated_string(i));
@@ -1864,8 +1852,9 @@
     *new_data = "name-" + StrCat(i);
   }
   TestAllTypes testproto;
-  std::copy(data.begin(), data.end(), AllocatedRepeatedPtrFieldBackInserter(
-                                          testproto.mutable_repeated_string()));
+  std::copy(data.begin(), data.end(),
+            AllocatedRepeatedPtrFieldBackInserter(
+                testproto.mutable_repeated_string()));
   EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString());
 }
 
diff --git a/src/google/protobuf/service.cc b/src/google/protobuf/service.cc
index a6616b4..5394568 100644
--- a/src/google/protobuf/service.cc
+++ b/src/google/protobuf/service.cc
@@ -43,4 +43,3 @@
 
 }  // namespace protobuf
 }  // namespace google
-
diff --git a/src/google/protobuf/service.h b/src/google/protobuf/service.h
index a9339eb..d6b4ab8 100644
--- a/src/google/protobuf/service.h
+++ b/src/google/protobuf/service.h
@@ -119,10 +119,10 @@
 class RpcChannel;
 
 // Defined in other files.
-class Descriptor;            // descriptor.h
-class ServiceDescriptor;     // descriptor.h
-class MethodDescriptor;      // descriptor.h
-class Message;               // message.h
+class Descriptor;         // descriptor.h
+class ServiceDescriptor;  // descriptor.h
+class MethodDescriptor;   // descriptor.h
+class Message;            // message.h
 
 // Abstract base interface for protocol-buffer-based RPC services.  Services
 // themselves are abstract interfaces (implemented either by servers or as
@@ -137,10 +137,7 @@
   // When constructing a stub, you may pass STUB_OWNS_CHANNEL as the second
   // parameter to the constructor to tell it to delete its RpcChannel when
   // destroyed.
-  enum ChannelOwnership {
-    STUB_OWNS_CHANNEL,
-    STUB_DOESNT_OWN_CHANNEL
-  };
+  enum ChannelOwnership { STUB_OWNS_CHANNEL, STUB_DOESNT_OWN_CHANNEL };
 
   // Get the ServiceDescriptor describing this service and its methods.
   virtual const ServiceDescriptor* GetDescriptor() = 0;
@@ -171,10 +168,8 @@
   //   RpcController can be queried to determine if an error occurred and
   //   possibly to get more information about the error.
   virtual void CallMethod(const MethodDescriptor* method,
-                          RpcController* controller,
-                          const Message* request,
-                          Message* response,
-                          Closure* done) = 0;
+                          RpcController* controller, const Message* request,
+                          Message* response, Closure* done) = 0;
 
   // CallMethod() requires that the request and response passed in are of a
   // particular subclass of Message.  GetRequestPrototype() and
@@ -190,9 +185,9 @@
   //   request->ParseFromString(input);
   //   service->CallMethod(method, *request, response, callback);
   virtual const Message& GetRequestPrototype(
-    const MethodDescriptor* method) const = 0;
+      const MethodDescriptor* method) const = 0;
   virtual const Message& GetResponsePrototype(
-    const MethodDescriptor* method) const = 0;
+      const MethodDescriptor* method) const = 0;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Service);
@@ -283,10 +278,8 @@
   // need not be of any specific class as long as their descriptors are
   // method->input_type() and method->output_type().
   virtual void CallMethod(const MethodDescriptor* method,
-                          RpcController* controller,
-                          const Message* request,
-                          Message* response,
-                          Closure* done) = 0;
+                          RpcController* controller, const Message* request,
+                          Message* response, Closure* done) = 0;
 
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcChannel);
diff --git a/src/google/protobuf/source_context.pb.cc b/src/google/protobuf/source_context.pb.cc
index 477091b..1f66be5 100644
--- a/src/google/protobuf/source_context.pb.cc
+++ b/src/google/protobuf/source_context.pb.cc
@@ -36,10 +36,6 @@
 PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_SourceContext_google_2fprotobuf_2fsource_5fcontext_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsSourceContext_google_2fprotobuf_2fsource_5fcontext_2eproto}, {}};
 
-void InitDefaults_google_2fprotobuf_2fsource_5fcontext_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_SourceContext_google_2fprotobuf_2fsource_5fcontext_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2fsource_5fcontext_2eproto[1];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fsource_5fcontext_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fsource_5fcontext_2eproto = nullptr;
@@ -76,8 +72,7 @@
   "pesb\006proto3"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2fsource_5fcontext_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2fsource_5fcontext_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2fsource_5fcontext_2eproto,
   "google/protobuf/source_context.proto", &assign_descriptors_table_google_2fprotobuf_2fsource_5fcontext_2eproto, 251,
 };
 
@@ -85,6 +80,7 @@
   static constexpr ::PROTOBUF_NAMESPACE_ID::internal::InitFunc deps[1] =
   {
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_SourceContext_google_2fprotobuf_2fsource_5fcontext_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2fsource_5fcontext_2eproto, deps, 0);
 }
 
@@ -156,31 +152,37 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* SourceContext::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // string file_name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_file_name(), ptr, ctx, "google.protobuf.SourceContext.file_name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool SourceContext::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/struct.pb.cc b/src/google/protobuf/struct.pb.cc
index aed2db9..a34cac3 100644
--- a/src/google/protobuf/struct.pb.cc
+++ b/src/google/protobuf/struct.pb.cc
@@ -72,10 +72,6 @@
 PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_ListValue_google_2fprotobuf_2fstruct_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsListValue_google_2fprotobuf_2fstruct_2eproto}, {}};
 
-void InitDefaults_google_2fprotobuf_2fstruct_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_ListValue_google_2fprotobuf_2fstruct_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2fstruct_2eproto[4];
 static const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* file_level_enum_descriptors_google_2fprotobuf_2fstruct_2eproto[1];
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fstruct_2eproto = nullptr;
@@ -155,8 +151,7 @@
   "3"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fstruct_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2fstruct_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2fstruct_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2fstruct_2eproto,
   "google/protobuf/struct.proto", &assign_descriptors_table_google_2fprotobuf_2fstruct_2eproto, 641,
 };
 
@@ -164,6 +159,7 @@
   static constexpr ::PROTOBUF_NAMESPACE_ID::internal::InitFunc deps[1] =
   {
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_ListValue_google_2fprotobuf_2fstruct_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2fstruct_2eproto, deps, 0);
 }
 
@@ -276,35 +272,43 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Struct::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // map<string, .google.protobuf.Value> fields = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(&fields_, ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 10 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 10) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Struct::MergePartialFromCodedStream(
@@ -776,17 +780,18 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Value::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // .google.protobuf.NullValue null_value = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         set_null_value(static_cast<PROTOBUF_NAMESPACE_ID::NullValue>(val));
         break;
       }
@@ -801,43 +806,48 @@
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_string_value(), ptr, ctx, "google.protobuf.Value.string_value");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // bool bool_value = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 32) goto handle_unusual;
         set_bool_value(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // .google.protobuf.Struct struct_value = 5;
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 42) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_struct_value(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // .google.protobuf.ListValue list_value = 6;
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 50) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_list_value(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Value::MergePartialFromCodedStream(
@@ -1293,35 +1303,43 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* ListValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // repeated .google.protobuf.Value values = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_values(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 10 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 10) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool ListValue::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/struct.pb.h b/src/google/protobuf/struct.pb.h
index c4979a7..ca8c534 100644
--- a/src/google/protobuf/struct.pb.h
+++ b/src/google/protobuf/struct.pb.h
@@ -79,7 +79,7 @@
 PROTOBUF_NAMESPACE_CLOSE
 PROTOBUF_NAMESPACE_OPEN
 
-enum NullValue {
+enum NullValue : int {
   NULL_VALUE = 0,
   NullValue_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(),
   NullValue_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max()
@@ -90,9 +90,13 @@
 constexpr int NullValue_ARRAYSIZE = NullValue_MAX + 1;
 
 PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* NullValue_descriptor();
-inline const std::string& NullValue_Name(NullValue value) {
+template<typename T>
+inline const std::string& NullValue_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, NullValue>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function NullValue_Name.");
   return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    NullValue_descriptor(), value);
+    NullValue_descriptor(), enum_t_value);
 }
 inline bool NullValue_Parse(
     const std::string& name, NullValue* value) {
@@ -116,10 +120,10 @@
   Struct_FieldsEntry_DoNotUse(::PROTOBUF_NAMESPACE_ID::Arena* arena);
   void MergeFrom(const Struct_FieldsEntry_DoNotUse& other);
   static const Struct_FieldsEntry_DoNotUse* internal_default_instance() { return reinterpret_cast<const Struct_FieldsEntry_DoNotUse*>(&_Struct_FieldsEntry_DoNotUse_default_instance_); }
-  bool ValidateKey() const {
-    return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(key().data(), key().size(), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "google.protobuf.Struct.FieldsEntry.key");
+  static bool ValidateKey(std::string* s) {
+    return ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(s->data(), s->size(), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::PARSE, "google.protobuf.Struct.FieldsEntry.key");
  }
-  bool ValidateValue() const { return true; }
+  static bool ValidateValue(void*) { return true; }
   void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& other) final;
   ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const;
 };
diff --git a/src/google/protobuf/struct.proto b/src/google/protobuf/struct.proto
index 7d7808e..ed990e3 100644
--- a/src/google/protobuf/struct.proto
+++ b/src/google/protobuf/struct.proto
@@ -40,7 +40,6 @@
 option java_multiple_files = true;
 option objc_class_prefix = "GPB";
 
-
 // `Struct` represents a structured data value, consisting of fields
 // which map to dynamically typed values. In some languages, `Struct`
 // might be supported by a native representation. For example, in
diff --git a/src/google/protobuf/test_util.inc b/src/google/protobuf/test_util.inc
index ab80b69..7c1bfc1 100644
--- a/src/google/protobuf/test_util.inc
+++ b/src/google/protobuf/test_util.inc
@@ -41,7 +41,6 @@
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/descriptor.h>
 #include <google/protobuf/message.h>
-#include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 
 namespace google {
diff --git a/src/google/protobuf/test_util_lite.cc b/src/google/protobuf/test_util_lite.cc
index 81728df..a83d109 100644
--- a/src/google/protobuf/test_util_lite.cc
+++ b/src/google/protobuf/test_util_lite.cc
@@ -42,112 +42,112 @@
 namespace protobuf {
 
 void TestUtilLite::SetAllFields(unittest::TestAllTypesLite* message) {
-  message->set_optional_int32   (101);
-  message->set_optional_int64   (102);
-  message->set_optional_uint32  (103);
-  message->set_optional_uint64  (104);
-  message->set_optional_sint32  (105);
-  message->set_optional_sint64  (106);
-  message->set_optional_fixed32 (107);
-  message->set_optional_fixed64 (108);
+  message->set_optional_int32(101);
+  message->set_optional_int64(102);
+  message->set_optional_uint32(103);
+  message->set_optional_uint64(104);
+  message->set_optional_sint32(105);
+  message->set_optional_sint64(106);
+  message->set_optional_fixed32(107);
+  message->set_optional_fixed64(108);
   message->set_optional_sfixed32(109);
   message->set_optional_sfixed64(110);
-  message->set_optional_float   (111);
-  message->set_optional_double  (112);
-  message->set_optional_bool    (true);
-  message->set_optional_string  ("115");
-  message->set_optional_bytes   ("116");
+  message->set_optional_float(111);
+  message->set_optional_double(112);
+  message->set_optional_bool(true);
+  message->set_optional_string("115");
+  message->set_optional_bytes("116");
 
-  message->mutable_optionalgroup                 ()->set_a(117);
-  message->mutable_optional_nested_message       ()->set_bb(118);
-  message->mutable_optional_foreign_message      ()->set_c(119);
-  message->mutable_optional_import_message       ()->set_d(120);
+  message->mutable_optionalgroup()->set_a(117);
+  message->mutable_optional_nested_message()->set_bb(118);
+  message->mutable_optional_foreign_message()->set_c(119);
+  message->mutable_optional_import_message()->set_d(120);
   message->mutable_optional_public_import_message()->set_e(126);
-  message->mutable_optional_lazy_message         ()->set_bb(127);
+  message->mutable_optional_lazy_message()->set_bb(127);
 
-  message->set_optional_nested_enum (unittest::TestAllTypesLite::BAZ );
-  message->set_optional_foreign_enum(unittest::FOREIGN_LITE_BAZ      );
-  message->set_optional_import_enum (unittest_import::IMPORT_LITE_BAZ);
+  message->set_optional_nested_enum(unittest::TestAllTypesLite::BAZ);
+  message->set_optional_foreign_enum(unittest::FOREIGN_LITE_BAZ);
+  message->set_optional_import_enum(unittest_import::IMPORT_LITE_BAZ);
 
 
   // -----------------------------------------------------------------
 
-  message->add_repeated_int32   (201);
-  message->add_repeated_int64   (202);
-  message->add_repeated_uint32  (203);
-  message->add_repeated_uint64  (204);
-  message->add_repeated_sint32  (205);
-  message->add_repeated_sint64  (206);
-  message->add_repeated_fixed32 (207);
-  message->add_repeated_fixed64 (208);
+  message->add_repeated_int32(201);
+  message->add_repeated_int64(202);
+  message->add_repeated_uint32(203);
+  message->add_repeated_uint64(204);
+  message->add_repeated_sint32(205);
+  message->add_repeated_sint64(206);
+  message->add_repeated_fixed32(207);
+  message->add_repeated_fixed64(208);
   message->add_repeated_sfixed32(209);
   message->add_repeated_sfixed64(210);
-  message->add_repeated_float   (211);
-  message->add_repeated_double  (212);
-  message->add_repeated_bool    (true);
-  message->add_repeated_string  ("215");
-  message->add_repeated_bytes   ("216");
+  message->add_repeated_float(211);
+  message->add_repeated_double(212);
+  message->add_repeated_bool(true);
+  message->add_repeated_string("215");
+  message->add_repeated_bytes("216");
 
-  message->add_repeatedgroup           ()->set_a(217);
-  message->add_repeated_nested_message ()->set_bb(218);
+  message->add_repeatedgroup()->set_a(217);
+  message->add_repeated_nested_message()->set_bb(218);
   message->add_repeated_foreign_message()->set_c(219);
-  message->add_repeated_import_message ()->set_d(220);
-  message->add_repeated_lazy_message   ()->set_bb(227);
+  message->add_repeated_import_message()->set_d(220);
+  message->add_repeated_lazy_message()->set_bb(227);
 
-  message->add_repeated_nested_enum (unittest::TestAllTypesLite::BAR );
-  message->add_repeated_foreign_enum(unittest::FOREIGN_LITE_BAR      );
-  message->add_repeated_import_enum (unittest_import::IMPORT_LITE_BAR);
+  message->add_repeated_nested_enum(unittest::TestAllTypesLite::BAR);
+  message->add_repeated_foreign_enum(unittest::FOREIGN_LITE_BAR);
+  message->add_repeated_import_enum(unittest_import::IMPORT_LITE_BAR);
 
 
   // Add a second one of each field.
-  message->add_repeated_int32   (301);
-  message->add_repeated_int64   (302);
-  message->add_repeated_uint32  (303);
-  message->add_repeated_uint64  (304);
-  message->add_repeated_sint32  (305);
-  message->add_repeated_sint64  (306);
-  message->add_repeated_fixed32 (307);
-  message->add_repeated_fixed64 (308);
+  message->add_repeated_int32(301);
+  message->add_repeated_int64(302);
+  message->add_repeated_uint32(303);
+  message->add_repeated_uint64(304);
+  message->add_repeated_sint32(305);
+  message->add_repeated_sint64(306);
+  message->add_repeated_fixed32(307);
+  message->add_repeated_fixed64(308);
   message->add_repeated_sfixed32(309);
   message->add_repeated_sfixed64(310);
-  message->add_repeated_float   (311);
-  message->add_repeated_double  (312);
-  message->add_repeated_bool    (false);
-  message->add_repeated_string  ("315");
-  message->add_repeated_bytes   ("316");
+  message->add_repeated_float(311);
+  message->add_repeated_double(312);
+  message->add_repeated_bool(false);
+  message->add_repeated_string("315");
+  message->add_repeated_bytes("316");
 
-  message->add_repeatedgroup           ()->set_a(317);
-  message->add_repeated_nested_message ()->set_bb(318);
+  message->add_repeatedgroup()->set_a(317);
+  message->add_repeated_nested_message()->set_bb(318);
   message->add_repeated_foreign_message()->set_c(319);
-  message->add_repeated_import_message ()->set_d(320);
-  message->add_repeated_lazy_message   ()->set_bb(327);
+  message->add_repeated_import_message()->set_d(320);
+  message->add_repeated_lazy_message()->set_bb(327);
 
-  message->add_repeated_nested_enum (unittest::TestAllTypesLite::BAZ );
-  message->add_repeated_foreign_enum(unittest::FOREIGN_LITE_BAZ      );
-  message->add_repeated_import_enum (unittest_import::IMPORT_LITE_BAZ);
+  message->add_repeated_nested_enum(unittest::TestAllTypesLite::BAZ);
+  message->add_repeated_foreign_enum(unittest::FOREIGN_LITE_BAZ);
+  message->add_repeated_import_enum(unittest_import::IMPORT_LITE_BAZ);
 
 
   // -----------------------------------------------------------------
 
-  message->set_default_int32   (401);
-  message->set_default_int64   (402);
-  message->set_default_uint32  (403);
-  message->set_default_uint64  (404);
-  message->set_default_sint32  (405);
-  message->set_default_sint64  (406);
-  message->set_default_fixed32 (407);
-  message->set_default_fixed64 (408);
+  message->set_default_int32(401);
+  message->set_default_int64(402);
+  message->set_default_uint32(403);
+  message->set_default_uint64(404);
+  message->set_default_sint32(405);
+  message->set_default_sint64(406);
+  message->set_default_fixed32(407);
+  message->set_default_fixed64(408);
   message->set_default_sfixed32(409);
   message->set_default_sfixed64(410);
-  message->set_default_float   (411);
-  message->set_default_double  (412);
-  message->set_default_bool    (false);
-  message->set_default_string  ("415");
-  message->set_default_bytes   ("416");
+  message->set_default_float(411);
+  message->set_default_double(412);
+  message->set_default_bool(false);
+  message->set_default_string("415");
+  message->set_default_bytes("416");
 
-  message->set_default_nested_enum (unittest::TestAllTypesLite::FOO );
-  message->set_default_foreign_enum(unittest::FOREIGN_LITE_FOO      );
-  message->set_default_import_enum (unittest_import::IMPORT_LITE_FOO);
+  message->set_default_nested_enum(unittest::TestAllTypesLite::FOO);
+  message->set_default_foreign_enum(unittest::FOREIGN_LITE_FOO);
+  message->set_default_import_enum(unittest_import::IMPORT_LITE_FOO);
 
 
   message->set_oneof_uint32(601);
@@ -159,31 +159,31 @@
 // -------------------------------------------------------------------
 
 void TestUtilLite::ModifyRepeatedFields(unittest::TestAllTypesLite* message) {
-  message->set_repeated_int32   (1, 501);
-  message->set_repeated_int64   (1, 502);
-  message->set_repeated_uint32  (1, 503);
-  message->set_repeated_uint64  (1, 504);
-  message->set_repeated_sint32  (1, 505);
-  message->set_repeated_sint64  (1, 506);
-  message->set_repeated_fixed32 (1, 507);
-  message->set_repeated_fixed64 (1, 508);
+  message->set_repeated_int32(1, 501);
+  message->set_repeated_int64(1, 502);
+  message->set_repeated_uint32(1, 503);
+  message->set_repeated_uint64(1, 504);
+  message->set_repeated_sint32(1, 505);
+  message->set_repeated_sint64(1, 506);
+  message->set_repeated_fixed32(1, 507);
+  message->set_repeated_fixed64(1, 508);
   message->set_repeated_sfixed32(1, 509);
   message->set_repeated_sfixed64(1, 510);
-  message->set_repeated_float   (1, 511);
-  message->set_repeated_double  (1, 512);
-  message->set_repeated_bool    (1, true);
-  message->set_repeated_string  (1, "515");
-  message->set_repeated_bytes   (1, "516");
+  message->set_repeated_float(1, 511);
+  message->set_repeated_double(1, 512);
+  message->set_repeated_bool(1, true);
+  message->set_repeated_string(1, "515");
+  message->set_repeated_bytes(1, "516");
 
-  message->mutable_repeatedgroup           (1)->set_a(517);
-  message->mutable_repeated_nested_message (1)->set_bb(518);
+  message->mutable_repeatedgroup(1)->set_a(517);
+  message->mutable_repeated_nested_message(1)->set_bb(518);
   message->mutable_repeated_foreign_message(1)->set_c(519);
-  message->mutable_repeated_import_message (1)->set_d(520);
-  message->mutable_repeated_lazy_message   (1)->set_bb(527);
+  message->mutable_repeated_import_message(1)->set_d(520);
+  message->mutable_repeated_lazy_message(1)->set_bb(527);
 
-  message->set_repeated_nested_enum (1, unittest::TestAllTypesLite::FOO );
-  message->set_repeated_foreign_enum(1, unittest::FOREIGN_LITE_FOO      );
-  message->set_repeated_import_enum (1, unittest_import::IMPORT_LITE_FOO);
+  message->set_repeated_nested_enum(1, unittest::TestAllTypesLite::FOO);
+  message->set_repeated_foreign_enum(1, unittest::FOREIGN_LITE_FOO);
+  message->set_repeated_import_enum(1, unittest_import::IMPORT_LITE_FOO);
 
 }
 
@@ -191,199 +191,199 @@
 
 void TestUtilLite::ExpectAllFieldsSet(
     const unittest::TestAllTypesLite& message) {
-  EXPECT_TRUE(message.has_optional_int32   ());
-  EXPECT_TRUE(message.has_optional_int64   ());
-  EXPECT_TRUE(message.has_optional_uint32  ());
-  EXPECT_TRUE(message.has_optional_uint64  ());
-  EXPECT_TRUE(message.has_optional_sint32  ());
-  EXPECT_TRUE(message.has_optional_sint64  ());
-  EXPECT_TRUE(message.has_optional_fixed32 ());
-  EXPECT_TRUE(message.has_optional_fixed64 ());
+  EXPECT_TRUE(message.has_optional_int32());
+  EXPECT_TRUE(message.has_optional_int64());
+  EXPECT_TRUE(message.has_optional_uint32());
+  EXPECT_TRUE(message.has_optional_uint64());
+  EXPECT_TRUE(message.has_optional_sint32());
+  EXPECT_TRUE(message.has_optional_sint64());
+  EXPECT_TRUE(message.has_optional_fixed32());
+  EXPECT_TRUE(message.has_optional_fixed64());
   EXPECT_TRUE(message.has_optional_sfixed32());
   EXPECT_TRUE(message.has_optional_sfixed64());
-  EXPECT_TRUE(message.has_optional_float   ());
-  EXPECT_TRUE(message.has_optional_double  ());
-  EXPECT_TRUE(message.has_optional_bool    ());
-  EXPECT_TRUE(message.has_optional_string  ());
-  EXPECT_TRUE(message.has_optional_bytes   ());
+  EXPECT_TRUE(message.has_optional_float());
+  EXPECT_TRUE(message.has_optional_double());
+  EXPECT_TRUE(message.has_optional_bool());
+  EXPECT_TRUE(message.has_optional_string());
+  EXPECT_TRUE(message.has_optional_bytes());
 
-  EXPECT_TRUE(message.has_optionalgroup                 ());
-  EXPECT_TRUE(message.has_optional_nested_message       ());
-  EXPECT_TRUE(message.has_optional_foreign_message      ());
-  EXPECT_TRUE(message.has_optional_import_message       ());
+  EXPECT_TRUE(message.has_optionalgroup());
+  EXPECT_TRUE(message.has_optional_nested_message());
+  EXPECT_TRUE(message.has_optional_foreign_message());
+  EXPECT_TRUE(message.has_optional_import_message());
   EXPECT_TRUE(message.has_optional_public_import_message());
-  EXPECT_TRUE(message.has_optional_lazy_message         ());
+  EXPECT_TRUE(message.has_optional_lazy_message());
 
-  EXPECT_TRUE(message.optionalgroup                 ().has_a());
-  EXPECT_TRUE(message.optional_nested_message       ().has_bb());
-  EXPECT_TRUE(message.optional_foreign_message      ().has_c());
-  EXPECT_TRUE(message.optional_import_message       ().has_d());
+  EXPECT_TRUE(message.optionalgroup().has_a());
+  EXPECT_TRUE(message.optional_nested_message().has_bb());
+  EXPECT_TRUE(message.optional_foreign_message().has_c());
+  EXPECT_TRUE(message.optional_import_message().has_d());
   EXPECT_TRUE(message.optional_public_import_message().has_e());
-  EXPECT_TRUE(message.optional_lazy_message         ().has_bb());
+  EXPECT_TRUE(message.optional_lazy_message().has_bb());
 
-  EXPECT_TRUE(message.has_optional_nested_enum ());
+  EXPECT_TRUE(message.has_optional_nested_enum());
   EXPECT_TRUE(message.has_optional_foreign_enum());
-  EXPECT_TRUE(message.has_optional_import_enum ());
+  EXPECT_TRUE(message.has_optional_import_enum());
 
 
-  EXPECT_EQ(101  , message.optional_int32   ());
-  EXPECT_EQ(102  , message.optional_int64   ());
-  EXPECT_EQ(103  , message.optional_uint32  ());
-  EXPECT_EQ(104  , message.optional_uint64  ());
-  EXPECT_EQ(105  , message.optional_sint32  ());
-  EXPECT_EQ(106  , message.optional_sint64  ());
-  EXPECT_EQ(107  , message.optional_fixed32 ());
-  EXPECT_EQ(108  , message.optional_fixed64 ());
-  EXPECT_EQ(109  , message.optional_sfixed32());
-  EXPECT_EQ(110  , message.optional_sfixed64());
-  EXPECT_EQ(111  , message.optional_float   ());
-  EXPECT_EQ(112  , message.optional_double  ());
-  EXPECT_EQ(true , message.optional_bool    ());
-  EXPECT_EQ("115", message.optional_string  ());
-  EXPECT_EQ("116", message.optional_bytes   ());
+  EXPECT_EQ(101, message.optional_int32());
+  EXPECT_EQ(102, message.optional_int64());
+  EXPECT_EQ(103, message.optional_uint32());
+  EXPECT_EQ(104, message.optional_uint64());
+  EXPECT_EQ(105, message.optional_sint32());
+  EXPECT_EQ(106, message.optional_sint64());
+  EXPECT_EQ(107, message.optional_fixed32());
+  EXPECT_EQ(108, message.optional_fixed64());
+  EXPECT_EQ(109, message.optional_sfixed32());
+  EXPECT_EQ(110, message.optional_sfixed64());
+  EXPECT_EQ(111, message.optional_float());
+  EXPECT_EQ(112, message.optional_double());
+  EXPECT_EQ(true, message.optional_bool());
+  EXPECT_EQ("115", message.optional_string());
+  EXPECT_EQ("116", message.optional_bytes());
 
-  EXPECT_EQ(117, message.optionalgroup                 ().a());
-  EXPECT_EQ(118, message.optional_nested_message       ().bb());
-  EXPECT_EQ(119, message.optional_foreign_message      ().c());
-  EXPECT_EQ(120, message.optional_import_message       ().d());
+  EXPECT_EQ(117, message.optionalgroup().a());
+  EXPECT_EQ(118, message.optional_nested_message().bb());
+  EXPECT_EQ(119, message.optional_foreign_message().c());
+  EXPECT_EQ(120, message.optional_import_message().d());
   EXPECT_EQ(126, message.optional_public_import_message().e());
-  EXPECT_EQ(127, message.optional_lazy_message         ().bb());
+  EXPECT_EQ(127, message.optional_lazy_message().bb());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.optional_nested_enum ());
-  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ      , message.optional_foreign_enum());
-  EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.optional_import_enum ());
+  EXPECT_EQ(unittest::TestAllTypesLite::BAZ, message.optional_nested_enum());
+  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ, message.optional_foreign_enum());
+  EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.optional_import_enum());
 
 
   // -----------------------------------------------------------------
 
-  ASSERT_EQ(2, message.repeated_int32_size   ());
-  ASSERT_EQ(2, message.repeated_int64_size   ());
-  ASSERT_EQ(2, message.repeated_uint32_size  ());
-  ASSERT_EQ(2, message.repeated_uint64_size  ());
-  ASSERT_EQ(2, message.repeated_sint32_size  ());
-  ASSERT_EQ(2, message.repeated_sint64_size  ());
-  ASSERT_EQ(2, message.repeated_fixed32_size ());
-  ASSERT_EQ(2, message.repeated_fixed64_size ());
+  ASSERT_EQ(2, message.repeated_int32_size());
+  ASSERT_EQ(2, message.repeated_int64_size());
+  ASSERT_EQ(2, message.repeated_uint32_size());
+  ASSERT_EQ(2, message.repeated_uint64_size());
+  ASSERT_EQ(2, message.repeated_sint32_size());
+  ASSERT_EQ(2, message.repeated_sint64_size());
+  ASSERT_EQ(2, message.repeated_fixed32_size());
+  ASSERT_EQ(2, message.repeated_fixed64_size());
   ASSERT_EQ(2, message.repeated_sfixed32_size());
   ASSERT_EQ(2, message.repeated_sfixed64_size());
-  ASSERT_EQ(2, message.repeated_float_size   ());
-  ASSERT_EQ(2, message.repeated_double_size  ());
-  ASSERT_EQ(2, message.repeated_bool_size    ());
-  ASSERT_EQ(2, message.repeated_string_size  ());
-  ASSERT_EQ(2, message.repeated_bytes_size   ());
+  ASSERT_EQ(2, message.repeated_float_size());
+  ASSERT_EQ(2, message.repeated_double_size());
+  ASSERT_EQ(2, message.repeated_bool_size());
+  ASSERT_EQ(2, message.repeated_string_size());
+  ASSERT_EQ(2, message.repeated_bytes_size());
 
-  ASSERT_EQ(2, message.repeatedgroup_size           ());
-  ASSERT_EQ(2, message.repeated_nested_message_size ());
+  ASSERT_EQ(2, message.repeatedgroup_size());
+  ASSERT_EQ(2, message.repeated_nested_message_size());
   ASSERT_EQ(2, message.repeated_foreign_message_size());
-  ASSERT_EQ(2, message.repeated_import_message_size ());
-  ASSERT_EQ(2, message.repeated_lazy_message_size   ());
-  ASSERT_EQ(2, message.repeated_nested_enum_size    ());
-  ASSERT_EQ(2, message.repeated_foreign_enum_size   ());
-  ASSERT_EQ(2, message.repeated_import_enum_size    ());
+  ASSERT_EQ(2, message.repeated_import_message_size());
+  ASSERT_EQ(2, message.repeated_lazy_message_size());
+  ASSERT_EQ(2, message.repeated_nested_enum_size());
+  ASSERT_EQ(2, message.repeated_foreign_enum_size());
+  ASSERT_EQ(2, message.repeated_import_enum_size());
 
 
-  EXPECT_EQ(201  , message.repeated_int32   (0));
-  EXPECT_EQ(202  , message.repeated_int64   (0));
-  EXPECT_EQ(203  , message.repeated_uint32  (0));
-  EXPECT_EQ(204  , message.repeated_uint64  (0));
-  EXPECT_EQ(205  , message.repeated_sint32  (0));
-  EXPECT_EQ(206  , message.repeated_sint64  (0));
-  EXPECT_EQ(207  , message.repeated_fixed32 (0));
-  EXPECT_EQ(208  , message.repeated_fixed64 (0));
-  EXPECT_EQ(209  , message.repeated_sfixed32(0));
-  EXPECT_EQ(210  , message.repeated_sfixed64(0));
-  EXPECT_EQ(211  , message.repeated_float   (0));
-  EXPECT_EQ(212  , message.repeated_double  (0));
-  EXPECT_EQ(true , message.repeated_bool    (0));
-  EXPECT_EQ("215", message.repeated_string  (0));
-  EXPECT_EQ("216", message.repeated_bytes   (0));
+  EXPECT_EQ(201, message.repeated_int32(0));
+  EXPECT_EQ(202, message.repeated_int64(0));
+  EXPECT_EQ(203, message.repeated_uint32(0));
+  EXPECT_EQ(204, message.repeated_uint64(0));
+  EXPECT_EQ(205, message.repeated_sint32(0));
+  EXPECT_EQ(206, message.repeated_sint64(0));
+  EXPECT_EQ(207, message.repeated_fixed32(0));
+  EXPECT_EQ(208, message.repeated_fixed64(0));
+  EXPECT_EQ(209, message.repeated_sfixed32(0));
+  EXPECT_EQ(210, message.repeated_sfixed64(0));
+  EXPECT_EQ(211, message.repeated_float(0));
+  EXPECT_EQ(212, message.repeated_double(0));
+  EXPECT_EQ(true, message.repeated_bool(0));
+  EXPECT_EQ("215", message.repeated_string(0));
+  EXPECT_EQ("216", message.repeated_bytes(0));
 
-  EXPECT_EQ(217, message.repeatedgroup           (0).a());
-  EXPECT_EQ(218, message.repeated_nested_message (0).bb());
+  EXPECT_EQ(217, message.repeatedgroup(0).a());
+  EXPECT_EQ(218, message.repeated_nested_message(0).bb());
   EXPECT_EQ(219, message.repeated_foreign_message(0).c());
-  EXPECT_EQ(220, message.repeated_import_message (0).d());
-  EXPECT_EQ(227, message.repeated_lazy_message   (0).bb());
+  EXPECT_EQ(220, message.repeated_import_message(0).d());
+  EXPECT_EQ(227, message.repeated_lazy_message(0).bb());
 
 
-  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.repeated_nested_enum (0));
-  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.repeated_foreign_enum(0));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.repeated_import_enum (0));
+  EXPECT_EQ(unittest::TestAllTypesLite::BAR, message.repeated_nested_enum(0));
+  EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.repeated_foreign_enum(0));
+  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.repeated_import_enum(0));
 
-  EXPECT_EQ(301  , message.repeated_int32   (1));
-  EXPECT_EQ(302  , message.repeated_int64   (1));
-  EXPECT_EQ(303  , message.repeated_uint32  (1));
-  EXPECT_EQ(304  , message.repeated_uint64  (1));
-  EXPECT_EQ(305  , message.repeated_sint32  (1));
-  EXPECT_EQ(306  , message.repeated_sint64  (1));
-  EXPECT_EQ(307  , message.repeated_fixed32 (1));
-  EXPECT_EQ(308  , message.repeated_fixed64 (1));
-  EXPECT_EQ(309  , message.repeated_sfixed32(1));
-  EXPECT_EQ(310  , message.repeated_sfixed64(1));
-  EXPECT_EQ(311  , message.repeated_float   (1));
-  EXPECT_EQ(312  , message.repeated_double  (1));
-  EXPECT_EQ(false, message.repeated_bool    (1));
-  EXPECT_EQ("315", message.repeated_string  (1));
-  EXPECT_EQ("316", message.repeated_bytes   (1));
+  EXPECT_EQ(301, message.repeated_int32(1));
+  EXPECT_EQ(302, message.repeated_int64(1));
+  EXPECT_EQ(303, message.repeated_uint32(1));
+  EXPECT_EQ(304, message.repeated_uint64(1));
+  EXPECT_EQ(305, message.repeated_sint32(1));
+  EXPECT_EQ(306, message.repeated_sint64(1));
+  EXPECT_EQ(307, message.repeated_fixed32(1));
+  EXPECT_EQ(308, message.repeated_fixed64(1));
+  EXPECT_EQ(309, message.repeated_sfixed32(1));
+  EXPECT_EQ(310, message.repeated_sfixed64(1));
+  EXPECT_EQ(311, message.repeated_float(1));
+  EXPECT_EQ(312, message.repeated_double(1));
+  EXPECT_EQ(false, message.repeated_bool(1));
+  EXPECT_EQ("315", message.repeated_string(1));
+  EXPECT_EQ("316", message.repeated_bytes(1));
 
-  EXPECT_EQ(317, message.repeatedgroup           (1).a());
-  EXPECT_EQ(318, message.repeated_nested_message (1).bb());
+  EXPECT_EQ(317, message.repeatedgroup(1).a());
+  EXPECT_EQ(318, message.repeated_nested_message(1).bb());
   EXPECT_EQ(319, message.repeated_foreign_message(1).c());
-  EXPECT_EQ(320, message.repeated_import_message (1).d());
-  EXPECT_EQ(327, message.repeated_lazy_message   (1).bb());
+  EXPECT_EQ(320, message.repeated_import_message(1).d());
+  EXPECT_EQ(327, message.repeated_lazy_message(1).bb());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.repeated_nested_enum (1));
-  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ      , message.repeated_foreign_enum(1));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.repeated_import_enum (1));
+  EXPECT_EQ(unittest::TestAllTypesLite::BAZ, message.repeated_nested_enum(1));
+  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ, message.repeated_foreign_enum(1));
+  EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.repeated_import_enum(1));
 
 
   // -----------------------------------------------------------------
 
-  EXPECT_TRUE(message.has_default_int32   ());
-  EXPECT_TRUE(message.has_default_int64   ());
-  EXPECT_TRUE(message.has_default_uint32  ());
-  EXPECT_TRUE(message.has_default_uint64  ());
-  EXPECT_TRUE(message.has_default_sint32  ());
-  EXPECT_TRUE(message.has_default_sint64  ());
-  EXPECT_TRUE(message.has_default_fixed32 ());
-  EXPECT_TRUE(message.has_default_fixed64 ());
+  EXPECT_TRUE(message.has_default_int32());
+  EXPECT_TRUE(message.has_default_int64());
+  EXPECT_TRUE(message.has_default_uint32());
+  EXPECT_TRUE(message.has_default_uint64());
+  EXPECT_TRUE(message.has_default_sint32());
+  EXPECT_TRUE(message.has_default_sint64());
+  EXPECT_TRUE(message.has_default_fixed32());
+  EXPECT_TRUE(message.has_default_fixed64());
   EXPECT_TRUE(message.has_default_sfixed32());
   EXPECT_TRUE(message.has_default_sfixed64());
-  EXPECT_TRUE(message.has_default_float   ());
-  EXPECT_TRUE(message.has_default_double  ());
-  EXPECT_TRUE(message.has_default_bool    ());
-  EXPECT_TRUE(message.has_default_string  ());
-  EXPECT_TRUE(message.has_default_bytes   ());
+  EXPECT_TRUE(message.has_default_float());
+  EXPECT_TRUE(message.has_default_double());
+  EXPECT_TRUE(message.has_default_bool());
+  EXPECT_TRUE(message.has_default_string());
+  EXPECT_TRUE(message.has_default_bytes());
 
-  EXPECT_TRUE(message.has_default_nested_enum ());
+  EXPECT_TRUE(message.has_default_nested_enum());
   EXPECT_TRUE(message.has_default_foreign_enum());
-  EXPECT_TRUE(message.has_default_import_enum ());
+  EXPECT_TRUE(message.has_default_import_enum());
 
 
-  EXPECT_EQ(401  , message.default_int32   ());
-  EXPECT_EQ(402  , message.default_int64   ());
-  EXPECT_EQ(403  , message.default_uint32  ());
-  EXPECT_EQ(404  , message.default_uint64  ());
-  EXPECT_EQ(405  , message.default_sint32  ());
-  EXPECT_EQ(406  , message.default_sint64  ());
-  EXPECT_EQ(407  , message.default_fixed32 ());
-  EXPECT_EQ(408  , message.default_fixed64 ());
-  EXPECT_EQ(409  , message.default_sfixed32());
-  EXPECT_EQ(410  , message.default_sfixed64());
-  EXPECT_EQ(411  , message.default_float   ());
-  EXPECT_EQ(412  , message.default_double  ());
-  EXPECT_EQ(false, message.default_bool    ());
-  EXPECT_EQ("415", message.default_string  ());
-  EXPECT_EQ("416", message.default_bytes   ());
+  EXPECT_EQ(401, message.default_int32());
+  EXPECT_EQ(402, message.default_int64());
+  EXPECT_EQ(403, message.default_uint32());
+  EXPECT_EQ(404, message.default_uint64());
+  EXPECT_EQ(405, message.default_sint32());
+  EXPECT_EQ(406, message.default_sint64());
+  EXPECT_EQ(407, message.default_fixed32());
+  EXPECT_EQ(408, message.default_fixed64());
+  EXPECT_EQ(409, message.default_sfixed32());
+  EXPECT_EQ(410, message.default_sfixed64());
+  EXPECT_EQ(411, message.default_float());
+  EXPECT_EQ(412, message.default_double());
+  EXPECT_EQ(false, message.default_bool());
+  EXPECT_EQ("415", message.default_string());
+  EXPECT_EQ("416", message.default_bytes());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.default_nested_enum ());
-  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.default_foreign_enum());
-  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.default_import_enum ());
+  EXPECT_EQ(unittest::TestAllTypesLite::FOO, message.default_nested_enum());
+  EXPECT_EQ(unittest::FOREIGN_LITE_FOO, message.default_foreign_enum());
+  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.default_import_enum());
 
 
-  EXPECT_FALSE(message.has_oneof_uint32        ());
+  EXPECT_FALSE(message.has_oneof_uint32());
   EXPECT_FALSE(message.has_oneof_nested_message());
-  EXPECT_FALSE(message.has_oneof_string        ());
-  EXPECT_TRUE(message.has_oneof_bytes          ());
+  EXPECT_FALSE(message.has_oneof_string());
+  EXPECT_TRUE(message.has_oneof_bytes());
 
   EXPECT_EQ("604", message.oneof_bytes());
 }
@@ -392,145 +392,145 @@
 
 void TestUtilLite::ExpectClear(const unittest::TestAllTypesLite& message) {
   // has_blah() should initially be false for all optional fields.
-  EXPECT_FALSE(message.has_optional_int32   ());
-  EXPECT_FALSE(message.has_optional_int64   ());
-  EXPECT_FALSE(message.has_optional_uint32  ());
-  EXPECT_FALSE(message.has_optional_uint64  ());
-  EXPECT_FALSE(message.has_optional_sint32  ());
-  EXPECT_FALSE(message.has_optional_sint64  ());
-  EXPECT_FALSE(message.has_optional_fixed32 ());
-  EXPECT_FALSE(message.has_optional_fixed64 ());
+  EXPECT_FALSE(message.has_optional_int32());
+  EXPECT_FALSE(message.has_optional_int64());
+  EXPECT_FALSE(message.has_optional_uint32());
+  EXPECT_FALSE(message.has_optional_uint64());
+  EXPECT_FALSE(message.has_optional_sint32());
+  EXPECT_FALSE(message.has_optional_sint64());
+  EXPECT_FALSE(message.has_optional_fixed32());
+  EXPECT_FALSE(message.has_optional_fixed64());
   EXPECT_FALSE(message.has_optional_sfixed32());
   EXPECT_FALSE(message.has_optional_sfixed64());
-  EXPECT_FALSE(message.has_optional_float   ());
-  EXPECT_FALSE(message.has_optional_double  ());
-  EXPECT_FALSE(message.has_optional_bool    ());
-  EXPECT_FALSE(message.has_optional_string  ());
-  EXPECT_FALSE(message.has_optional_bytes   ());
+  EXPECT_FALSE(message.has_optional_float());
+  EXPECT_FALSE(message.has_optional_double());
+  EXPECT_FALSE(message.has_optional_bool());
+  EXPECT_FALSE(message.has_optional_string());
+  EXPECT_FALSE(message.has_optional_bytes());
 
-  EXPECT_FALSE(message.has_optionalgroup                 ());
-  EXPECT_FALSE(message.has_optional_nested_message       ());
-  EXPECT_FALSE(message.has_optional_foreign_message      ());
-  EXPECT_FALSE(message.has_optional_import_message       ());
+  EXPECT_FALSE(message.has_optionalgroup());
+  EXPECT_FALSE(message.has_optional_nested_message());
+  EXPECT_FALSE(message.has_optional_foreign_message());
+  EXPECT_FALSE(message.has_optional_import_message());
   EXPECT_FALSE(message.has_optional_public_import_message());
-  EXPECT_FALSE(message.has_optional_lazy_message         ());
+  EXPECT_FALSE(message.has_optional_lazy_message());
 
-  EXPECT_FALSE(message.has_optional_nested_enum ());
+  EXPECT_FALSE(message.has_optional_nested_enum());
   EXPECT_FALSE(message.has_optional_foreign_enum());
-  EXPECT_FALSE(message.has_optional_import_enum ());
+  EXPECT_FALSE(message.has_optional_import_enum());
 
 
   // Optional fields without defaults are set to zero or something like it.
-  EXPECT_EQ(0    , message.optional_int32   ());
-  EXPECT_EQ(0    , message.optional_int64   ());
-  EXPECT_EQ(0    , message.optional_uint32  ());
-  EXPECT_EQ(0    , message.optional_uint64  ());
-  EXPECT_EQ(0    , message.optional_sint32  ());
-  EXPECT_EQ(0    , message.optional_sint64  ());
-  EXPECT_EQ(0    , message.optional_fixed32 ());
-  EXPECT_EQ(0    , message.optional_fixed64 ());
-  EXPECT_EQ(0    , message.optional_sfixed32());
-  EXPECT_EQ(0    , message.optional_sfixed64());
-  EXPECT_EQ(0    , message.optional_float   ());
-  EXPECT_EQ(0    , message.optional_double  ());
-  EXPECT_EQ(false, message.optional_bool    ());
-  EXPECT_EQ(""   , message.optional_string  ());
-  EXPECT_EQ(""   , message.optional_bytes   ());
+  EXPECT_EQ(0, message.optional_int32());
+  EXPECT_EQ(0, message.optional_int64());
+  EXPECT_EQ(0, message.optional_uint32());
+  EXPECT_EQ(0, message.optional_uint64());
+  EXPECT_EQ(0, message.optional_sint32());
+  EXPECT_EQ(0, message.optional_sint64());
+  EXPECT_EQ(0, message.optional_fixed32());
+  EXPECT_EQ(0, message.optional_fixed64());
+  EXPECT_EQ(0, message.optional_sfixed32());
+  EXPECT_EQ(0, message.optional_sfixed64());
+  EXPECT_EQ(0, message.optional_float());
+  EXPECT_EQ(0, message.optional_double());
+  EXPECT_EQ(false, message.optional_bool());
+  EXPECT_EQ("", message.optional_string());
+  EXPECT_EQ("", message.optional_bytes());
 
   // Embedded messages should also be clear.
-  EXPECT_FALSE(message.optionalgroup                 ().has_a());
-  EXPECT_FALSE(message.optional_nested_message       ().has_bb());
-  EXPECT_FALSE(message.optional_foreign_message      ().has_c());
-  EXPECT_FALSE(message.optional_import_message       ().has_d());
+  EXPECT_FALSE(message.optionalgroup().has_a());
+  EXPECT_FALSE(message.optional_nested_message().has_bb());
+  EXPECT_FALSE(message.optional_foreign_message().has_c());
+  EXPECT_FALSE(message.optional_import_message().has_d());
   EXPECT_FALSE(message.optional_public_import_message().has_e());
-  EXPECT_FALSE(message.optional_lazy_message         ().has_bb());
+  EXPECT_FALSE(message.optional_lazy_message().has_bb());
 
-  EXPECT_EQ(0, message.optionalgroup           ().a());
-  EXPECT_EQ(0, message.optional_nested_message ().bb());
+  EXPECT_EQ(0, message.optionalgroup().a());
+  EXPECT_EQ(0, message.optional_nested_message().bb());
   EXPECT_EQ(0, message.optional_foreign_message().c());
-  EXPECT_EQ(0, message.optional_import_message ().d());
+  EXPECT_EQ(0, message.optional_import_message().d());
 
   // Enums without defaults are set to the first value in the enum.
-  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.optional_nested_enum ());
-  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.optional_foreign_enum());
-  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.optional_import_enum ());
+  EXPECT_EQ(unittest::TestAllTypesLite::FOO, message.optional_nested_enum());
+  EXPECT_EQ(unittest::FOREIGN_LITE_FOO, message.optional_foreign_enum());
+  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.optional_import_enum());
 
 
   // Repeated fields are empty.
-  EXPECT_EQ(0, message.repeated_int32_size   ());
-  EXPECT_EQ(0, message.repeated_int64_size   ());
-  EXPECT_EQ(0, message.repeated_uint32_size  ());
-  EXPECT_EQ(0, message.repeated_uint64_size  ());
-  EXPECT_EQ(0, message.repeated_sint32_size  ());
-  EXPECT_EQ(0, message.repeated_sint64_size  ());
-  EXPECT_EQ(0, message.repeated_fixed32_size ());
-  EXPECT_EQ(0, message.repeated_fixed64_size ());
+  EXPECT_EQ(0, message.repeated_int32_size());
+  EXPECT_EQ(0, message.repeated_int64_size());
+  EXPECT_EQ(0, message.repeated_uint32_size());
+  EXPECT_EQ(0, message.repeated_uint64_size());
+  EXPECT_EQ(0, message.repeated_sint32_size());
+  EXPECT_EQ(0, message.repeated_sint64_size());
+  EXPECT_EQ(0, message.repeated_fixed32_size());
+  EXPECT_EQ(0, message.repeated_fixed64_size());
   EXPECT_EQ(0, message.repeated_sfixed32_size());
   EXPECT_EQ(0, message.repeated_sfixed64_size());
-  EXPECT_EQ(0, message.repeated_float_size   ());
-  EXPECT_EQ(0, message.repeated_double_size  ());
-  EXPECT_EQ(0, message.repeated_bool_size    ());
-  EXPECT_EQ(0, message.repeated_string_size  ());
-  EXPECT_EQ(0, message.repeated_bytes_size   ());
+  EXPECT_EQ(0, message.repeated_float_size());
+  EXPECT_EQ(0, message.repeated_double_size());
+  EXPECT_EQ(0, message.repeated_bool_size());
+  EXPECT_EQ(0, message.repeated_string_size());
+  EXPECT_EQ(0, message.repeated_bytes_size());
 
-  EXPECT_EQ(0, message.repeatedgroup_size           ());
-  EXPECT_EQ(0, message.repeated_nested_message_size ());
+  EXPECT_EQ(0, message.repeatedgroup_size());
+  EXPECT_EQ(0, message.repeated_nested_message_size());
   EXPECT_EQ(0, message.repeated_foreign_message_size());
-  EXPECT_EQ(0, message.repeated_import_message_size ());
-  EXPECT_EQ(0, message.repeated_lazy_message_size   ());
-  EXPECT_EQ(0, message.repeated_nested_enum_size    ());
-  EXPECT_EQ(0, message.repeated_foreign_enum_size   ());
-  EXPECT_EQ(0, message.repeated_import_enum_size    ());
+  EXPECT_EQ(0, message.repeated_import_message_size());
+  EXPECT_EQ(0, message.repeated_lazy_message_size());
+  EXPECT_EQ(0, message.repeated_nested_enum_size());
+  EXPECT_EQ(0, message.repeated_foreign_enum_size());
+  EXPECT_EQ(0, message.repeated_import_enum_size());
 
 
   // has_blah() should also be false for all default fields.
-  EXPECT_FALSE(message.has_default_int32   ());
-  EXPECT_FALSE(message.has_default_int64   ());
-  EXPECT_FALSE(message.has_default_uint32  ());
-  EXPECT_FALSE(message.has_default_uint64  ());
-  EXPECT_FALSE(message.has_default_sint32  ());
-  EXPECT_FALSE(message.has_default_sint64  ());
-  EXPECT_FALSE(message.has_default_fixed32 ());
-  EXPECT_FALSE(message.has_default_fixed64 ());
+  EXPECT_FALSE(message.has_default_int32());
+  EXPECT_FALSE(message.has_default_int64());
+  EXPECT_FALSE(message.has_default_uint32());
+  EXPECT_FALSE(message.has_default_uint64());
+  EXPECT_FALSE(message.has_default_sint32());
+  EXPECT_FALSE(message.has_default_sint64());
+  EXPECT_FALSE(message.has_default_fixed32());
+  EXPECT_FALSE(message.has_default_fixed64());
   EXPECT_FALSE(message.has_default_sfixed32());
   EXPECT_FALSE(message.has_default_sfixed64());
-  EXPECT_FALSE(message.has_default_float   ());
-  EXPECT_FALSE(message.has_default_double  ());
-  EXPECT_FALSE(message.has_default_bool    ());
-  EXPECT_FALSE(message.has_default_string  ());
-  EXPECT_FALSE(message.has_default_bytes   ());
+  EXPECT_FALSE(message.has_default_float());
+  EXPECT_FALSE(message.has_default_double());
+  EXPECT_FALSE(message.has_default_bool());
+  EXPECT_FALSE(message.has_default_string());
+  EXPECT_FALSE(message.has_default_bytes());
 
-  EXPECT_FALSE(message.has_default_nested_enum ());
+  EXPECT_FALSE(message.has_default_nested_enum());
   EXPECT_FALSE(message.has_default_foreign_enum());
-  EXPECT_FALSE(message.has_default_import_enum ());
+  EXPECT_FALSE(message.has_default_import_enum());
 
 
   // Fields with defaults have their default values (duh).
-  EXPECT_EQ( 41    , message.default_int32   ());
-  EXPECT_EQ( 42    , message.default_int64   ());
-  EXPECT_EQ( 43    , message.default_uint32  ());
-  EXPECT_EQ( 44    , message.default_uint64  ());
-  EXPECT_EQ(-45    , message.default_sint32  ());
-  EXPECT_EQ( 46    , message.default_sint64  ());
-  EXPECT_EQ( 47    , message.default_fixed32 ());
-  EXPECT_EQ( 48    , message.default_fixed64 ());
-  EXPECT_EQ( 49    , message.default_sfixed32());
-  EXPECT_EQ(-50    , message.default_sfixed64());
-  EXPECT_EQ( 51.5  , message.default_float   ());
-  EXPECT_EQ( 52e3  , message.default_double  ());
-  EXPECT_EQ(true   , message.default_bool    ());
-  EXPECT_EQ("hello", message.default_string  ());
-  EXPECT_EQ("world", message.default_bytes   ());
+  EXPECT_EQ(41, message.default_int32());
+  EXPECT_EQ(42, message.default_int64());
+  EXPECT_EQ(43, message.default_uint32());
+  EXPECT_EQ(44, message.default_uint64());
+  EXPECT_EQ(-45, message.default_sint32());
+  EXPECT_EQ(46, message.default_sint64());
+  EXPECT_EQ(47, message.default_fixed32());
+  EXPECT_EQ(48, message.default_fixed64());
+  EXPECT_EQ(49, message.default_sfixed32());
+  EXPECT_EQ(-50, message.default_sfixed64());
+  EXPECT_EQ(51.5, message.default_float());
+  EXPECT_EQ(52e3, message.default_double());
+  EXPECT_EQ(true, message.default_bool());
+  EXPECT_EQ("hello", message.default_string());
+  EXPECT_EQ("world", message.default_bytes());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.default_nested_enum ());
-  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.default_foreign_enum());
-  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.default_import_enum ());
+  EXPECT_EQ(unittest::TestAllTypesLite::BAR, message.default_nested_enum());
+  EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.default_foreign_enum());
+  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.default_import_enum());
 
 
-  EXPECT_FALSE(message.has_oneof_uint32        ());
+  EXPECT_FALSE(message.has_oneof_uint32());
   EXPECT_FALSE(message.has_oneof_nested_message());
-  EXPECT_FALSE(message.has_oneof_string        ());
-  EXPECT_FALSE(message.has_oneof_bytes         ());
+  EXPECT_FALSE(message.has_oneof_string());
+  EXPECT_FALSE(message.has_oneof_bytes());
 }
 
 // -------------------------------------------------------------------
@@ -540,188 +540,188 @@
   // ModifyRepeatedFields only sets the second repeated element of each
   // field.  In addition to verifying this, we also verify that the first
   // element and size were *not* modified.
-  ASSERT_EQ(2, message.repeated_int32_size   ());
-  ASSERT_EQ(2, message.repeated_int64_size   ());
-  ASSERT_EQ(2, message.repeated_uint32_size  ());
-  ASSERT_EQ(2, message.repeated_uint64_size  ());
-  ASSERT_EQ(2, message.repeated_sint32_size  ());
-  ASSERT_EQ(2, message.repeated_sint64_size  ());
-  ASSERT_EQ(2, message.repeated_fixed32_size ());
-  ASSERT_EQ(2, message.repeated_fixed64_size ());
+  ASSERT_EQ(2, message.repeated_int32_size());
+  ASSERT_EQ(2, message.repeated_int64_size());
+  ASSERT_EQ(2, message.repeated_uint32_size());
+  ASSERT_EQ(2, message.repeated_uint64_size());
+  ASSERT_EQ(2, message.repeated_sint32_size());
+  ASSERT_EQ(2, message.repeated_sint64_size());
+  ASSERT_EQ(2, message.repeated_fixed32_size());
+  ASSERT_EQ(2, message.repeated_fixed64_size());
   ASSERT_EQ(2, message.repeated_sfixed32_size());
   ASSERT_EQ(2, message.repeated_sfixed64_size());
-  ASSERT_EQ(2, message.repeated_float_size   ());
-  ASSERT_EQ(2, message.repeated_double_size  ());
-  ASSERT_EQ(2, message.repeated_bool_size    ());
-  ASSERT_EQ(2, message.repeated_string_size  ());
-  ASSERT_EQ(2, message.repeated_bytes_size   ());
+  ASSERT_EQ(2, message.repeated_float_size());
+  ASSERT_EQ(2, message.repeated_double_size());
+  ASSERT_EQ(2, message.repeated_bool_size());
+  ASSERT_EQ(2, message.repeated_string_size());
+  ASSERT_EQ(2, message.repeated_bytes_size());
 
-  ASSERT_EQ(2, message.repeatedgroup_size           ());
-  ASSERT_EQ(2, message.repeated_nested_message_size ());
+  ASSERT_EQ(2, message.repeatedgroup_size());
+  ASSERT_EQ(2, message.repeated_nested_message_size());
   ASSERT_EQ(2, message.repeated_foreign_message_size());
-  ASSERT_EQ(2, message.repeated_import_message_size ());
-  ASSERT_EQ(2, message.repeated_lazy_message_size   ());
-  ASSERT_EQ(2, message.repeated_nested_enum_size    ());
-  ASSERT_EQ(2, message.repeated_foreign_enum_size   ());
-  ASSERT_EQ(2, message.repeated_import_enum_size    ());
+  ASSERT_EQ(2, message.repeated_import_message_size());
+  ASSERT_EQ(2, message.repeated_lazy_message_size());
+  ASSERT_EQ(2, message.repeated_nested_enum_size());
+  ASSERT_EQ(2, message.repeated_foreign_enum_size());
+  ASSERT_EQ(2, message.repeated_import_enum_size());
 
 
-  EXPECT_EQ(201  , message.repeated_int32   (0));
-  EXPECT_EQ(202  , message.repeated_int64   (0));
-  EXPECT_EQ(203  , message.repeated_uint32  (0));
-  EXPECT_EQ(204  , message.repeated_uint64  (0));
-  EXPECT_EQ(205  , message.repeated_sint32  (0));
-  EXPECT_EQ(206  , message.repeated_sint64  (0));
-  EXPECT_EQ(207  , message.repeated_fixed32 (0));
-  EXPECT_EQ(208  , message.repeated_fixed64 (0));
-  EXPECT_EQ(209  , message.repeated_sfixed32(0));
-  EXPECT_EQ(210  , message.repeated_sfixed64(0));
-  EXPECT_EQ(211  , message.repeated_float   (0));
-  EXPECT_EQ(212  , message.repeated_double  (0));
-  EXPECT_EQ(true , message.repeated_bool    (0));
-  EXPECT_EQ("215", message.repeated_string  (0));
-  EXPECT_EQ("216", message.repeated_bytes   (0));
+  EXPECT_EQ(201, message.repeated_int32(0));
+  EXPECT_EQ(202, message.repeated_int64(0));
+  EXPECT_EQ(203, message.repeated_uint32(0));
+  EXPECT_EQ(204, message.repeated_uint64(0));
+  EXPECT_EQ(205, message.repeated_sint32(0));
+  EXPECT_EQ(206, message.repeated_sint64(0));
+  EXPECT_EQ(207, message.repeated_fixed32(0));
+  EXPECT_EQ(208, message.repeated_fixed64(0));
+  EXPECT_EQ(209, message.repeated_sfixed32(0));
+  EXPECT_EQ(210, message.repeated_sfixed64(0));
+  EXPECT_EQ(211, message.repeated_float(0));
+  EXPECT_EQ(212, message.repeated_double(0));
+  EXPECT_EQ(true, message.repeated_bool(0));
+  EXPECT_EQ("215", message.repeated_string(0));
+  EXPECT_EQ("216", message.repeated_bytes(0));
 
-  EXPECT_EQ(217, message.repeatedgroup           (0).a());
-  EXPECT_EQ(218, message.repeated_nested_message (0).bb());
+  EXPECT_EQ(217, message.repeatedgroup(0).a());
+  EXPECT_EQ(218, message.repeated_nested_message(0).bb());
   EXPECT_EQ(219, message.repeated_foreign_message(0).c());
-  EXPECT_EQ(220, message.repeated_import_message (0).d());
-  EXPECT_EQ(227, message.repeated_lazy_message   (0).bb());
+  EXPECT_EQ(220, message.repeated_import_message(0).d());
+  EXPECT_EQ(227, message.repeated_lazy_message(0).bb());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.repeated_nested_enum (0));
-  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.repeated_foreign_enum(0));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.repeated_import_enum (0));
+  EXPECT_EQ(unittest::TestAllTypesLite::BAR, message.repeated_nested_enum(0));
+  EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.repeated_foreign_enum(0));
+  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.repeated_import_enum(0));
 
 
   // Actually verify the second (modified) elements now.
-  EXPECT_EQ(501  , message.repeated_int32   (1));
-  EXPECT_EQ(502  , message.repeated_int64   (1));
-  EXPECT_EQ(503  , message.repeated_uint32  (1));
-  EXPECT_EQ(504  , message.repeated_uint64  (1));
-  EXPECT_EQ(505  , message.repeated_sint32  (1));
-  EXPECT_EQ(506  , message.repeated_sint64  (1));
-  EXPECT_EQ(507  , message.repeated_fixed32 (1));
-  EXPECT_EQ(508  , message.repeated_fixed64 (1));
-  EXPECT_EQ(509  , message.repeated_sfixed32(1));
-  EXPECT_EQ(510  , message.repeated_sfixed64(1));
-  EXPECT_EQ(511  , message.repeated_float   (1));
-  EXPECT_EQ(512  , message.repeated_double  (1));
-  EXPECT_EQ(true , message.repeated_bool    (1));
-  EXPECT_EQ("515", message.repeated_string  (1));
-  EXPECT_EQ("516", message.repeated_bytes   (1));
+  EXPECT_EQ(501, message.repeated_int32(1));
+  EXPECT_EQ(502, message.repeated_int64(1));
+  EXPECT_EQ(503, message.repeated_uint32(1));
+  EXPECT_EQ(504, message.repeated_uint64(1));
+  EXPECT_EQ(505, message.repeated_sint32(1));
+  EXPECT_EQ(506, message.repeated_sint64(1));
+  EXPECT_EQ(507, message.repeated_fixed32(1));
+  EXPECT_EQ(508, message.repeated_fixed64(1));
+  EXPECT_EQ(509, message.repeated_sfixed32(1));
+  EXPECT_EQ(510, message.repeated_sfixed64(1));
+  EXPECT_EQ(511, message.repeated_float(1));
+  EXPECT_EQ(512, message.repeated_double(1));
+  EXPECT_EQ(true, message.repeated_bool(1));
+  EXPECT_EQ("515", message.repeated_string(1));
+  EXPECT_EQ("516", message.repeated_bytes(1));
 
-  EXPECT_EQ(517, message.repeatedgroup           (1).a());
-  EXPECT_EQ(518, message.repeated_nested_message (1).bb());
+  EXPECT_EQ(517, message.repeatedgroup(1).a());
+  EXPECT_EQ(518, message.repeated_nested_message(1).bb());
   EXPECT_EQ(519, message.repeated_foreign_message(1).c());
-  EXPECT_EQ(520, message.repeated_import_message (1).d());
-  EXPECT_EQ(527, message.repeated_lazy_message   (1).bb());
+  EXPECT_EQ(520, message.repeated_import_message(1).d());
+  EXPECT_EQ(527, message.repeated_lazy_message(1).bb());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.repeated_nested_enum (1));
-  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.repeated_foreign_enum(1));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.repeated_import_enum (1));
+  EXPECT_EQ(unittest::TestAllTypesLite::FOO, message.repeated_nested_enum(1));
+  EXPECT_EQ(unittest::FOREIGN_LITE_FOO, message.repeated_foreign_enum(1));
+  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.repeated_import_enum(1));
 
 }
 
 // -------------------------------------------------------------------
 
 void TestUtilLite::SetPackedFields(unittest::TestPackedTypesLite* message) {
-  message->add_packed_int32   (601);
-  message->add_packed_int64   (602);
-  message->add_packed_uint32  (603);
-  message->add_packed_uint64  (604);
-  message->add_packed_sint32  (605);
-  message->add_packed_sint64  (606);
-  message->add_packed_fixed32 (607);
-  message->add_packed_fixed64 (608);
+  message->add_packed_int32(601);
+  message->add_packed_int64(602);
+  message->add_packed_uint32(603);
+  message->add_packed_uint64(604);
+  message->add_packed_sint32(605);
+  message->add_packed_sint64(606);
+  message->add_packed_fixed32(607);
+  message->add_packed_fixed64(608);
   message->add_packed_sfixed32(609);
   message->add_packed_sfixed64(610);
-  message->add_packed_float   (611);
-  message->add_packed_double  (612);
-  message->add_packed_bool    (true);
-  message->add_packed_enum    (unittest::FOREIGN_LITE_BAR);
+  message->add_packed_float(611);
+  message->add_packed_double(612);
+  message->add_packed_bool(true);
+  message->add_packed_enum(unittest::FOREIGN_LITE_BAR);
   // add a second one of each field
-  message->add_packed_int32   (701);
-  message->add_packed_int64   (702);
-  message->add_packed_uint32  (703);
-  message->add_packed_uint64  (704);
-  message->add_packed_sint32  (705);
-  message->add_packed_sint64  (706);
-  message->add_packed_fixed32 (707);
-  message->add_packed_fixed64 (708);
+  message->add_packed_int32(701);
+  message->add_packed_int64(702);
+  message->add_packed_uint32(703);
+  message->add_packed_uint64(704);
+  message->add_packed_sint32(705);
+  message->add_packed_sint64(706);
+  message->add_packed_fixed32(707);
+  message->add_packed_fixed64(708);
   message->add_packed_sfixed32(709);
   message->add_packed_sfixed64(710);
-  message->add_packed_float   (711);
-  message->add_packed_double  (712);
-  message->add_packed_bool    (false);
-  message->add_packed_enum    (unittest::FOREIGN_LITE_BAZ);
+  message->add_packed_float(711);
+  message->add_packed_double(712);
+  message->add_packed_bool(false);
+  message->add_packed_enum(unittest::FOREIGN_LITE_BAZ);
 }
 
 // -------------------------------------------------------------------
 
 void TestUtilLite::ModifyPackedFields(unittest::TestPackedTypesLite* message) {
-  message->set_packed_int32   (1, 801);
-  message->set_packed_int64   (1, 802);
-  message->set_packed_uint32  (1, 803);
-  message->set_packed_uint64  (1, 804);
-  message->set_packed_sint32  (1, 805);
-  message->set_packed_sint64  (1, 806);
-  message->set_packed_fixed32 (1, 807);
-  message->set_packed_fixed64 (1, 808);
+  message->set_packed_int32(1, 801);
+  message->set_packed_int64(1, 802);
+  message->set_packed_uint32(1, 803);
+  message->set_packed_uint64(1, 804);
+  message->set_packed_sint32(1, 805);
+  message->set_packed_sint64(1, 806);
+  message->set_packed_fixed32(1, 807);
+  message->set_packed_fixed64(1, 808);
   message->set_packed_sfixed32(1, 809);
   message->set_packed_sfixed64(1, 810);
-  message->set_packed_float   (1, 811);
-  message->set_packed_double  (1, 812);
-  message->set_packed_bool    (1, true);
-  message->set_packed_enum    (1, unittest::FOREIGN_LITE_FOO);
+  message->set_packed_float(1, 811);
+  message->set_packed_double(1, 812);
+  message->set_packed_bool(1, true);
+  message->set_packed_enum(1, unittest::FOREIGN_LITE_FOO);
 }
 
 // -------------------------------------------------------------------
 
 void TestUtilLite::ExpectPackedFieldsSet(
     const unittest::TestPackedTypesLite& message) {
-  ASSERT_EQ(2, message.packed_int32_size   ());
-  ASSERT_EQ(2, message.packed_int64_size   ());
-  ASSERT_EQ(2, message.packed_uint32_size  ());
-  ASSERT_EQ(2, message.packed_uint64_size  ());
-  ASSERT_EQ(2, message.packed_sint32_size  ());
-  ASSERT_EQ(2, message.packed_sint64_size  ());
-  ASSERT_EQ(2, message.packed_fixed32_size ());
-  ASSERT_EQ(2, message.packed_fixed64_size ());
+  ASSERT_EQ(2, message.packed_int32_size());
+  ASSERT_EQ(2, message.packed_int64_size());
+  ASSERT_EQ(2, message.packed_uint32_size());
+  ASSERT_EQ(2, message.packed_uint64_size());
+  ASSERT_EQ(2, message.packed_sint32_size());
+  ASSERT_EQ(2, message.packed_sint64_size());
+  ASSERT_EQ(2, message.packed_fixed32_size());
+  ASSERT_EQ(2, message.packed_fixed64_size());
   ASSERT_EQ(2, message.packed_sfixed32_size());
   ASSERT_EQ(2, message.packed_sfixed64_size());
-  ASSERT_EQ(2, message.packed_float_size   ());
-  ASSERT_EQ(2, message.packed_double_size  ());
-  ASSERT_EQ(2, message.packed_bool_size    ());
-  ASSERT_EQ(2, message.packed_enum_size    ());
+  ASSERT_EQ(2, message.packed_float_size());
+  ASSERT_EQ(2, message.packed_double_size());
+  ASSERT_EQ(2, message.packed_bool_size());
+  ASSERT_EQ(2, message.packed_enum_size());
 
-  EXPECT_EQ(601  , message.packed_int32   (0));
-  EXPECT_EQ(602  , message.packed_int64   (0));
-  EXPECT_EQ(603  , message.packed_uint32  (0));
-  EXPECT_EQ(604  , message.packed_uint64  (0));
-  EXPECT_EQ(605  , message.packed_sint32  (0));
-  EXPECT_EQ(606  , message.packed_sint64  (0));
-  EXPECT_EQ(607  , message.packed_fixed32 (0));
-  EXPECT_EQ(608  , message.packed_fixed64 (0));
-  EXPECT_EQ(609  , message.packed_sfixed32(0));
-  EXPECT_EQ(610  , message.packed_sfixed64(0));
-  EXPECT_EQ(611  , message.packed_float   (0));
-  EXPECT_EQ(612  , message.packed_double  (0));
-  EXPECT_EQ(true , message.packed_bool    (0));
+  EXPECT_EQ(601, message.packed_int32(0));
+  EXPECT_EQ(602, message.packed_int64(0));
+  EXPECT_EQ(603, message.packed_uint32(0));
+  EXPECT_EQ(604, message.packed_uint64(0));
+  EXPECT_EQ(605, message.packed_sint32(0));
+  EXPECT_EQ(606, message.packed_sint64(0));
+  EXPECT_EQ(607, message.packed_fixed32(0));
+  EXPECT_EQ(608, message.packed_fixed64(0));
+  EXPECT_EQ(609, message.packed_sfixed32(0));
+  EXPECT_EQ(610, message.packed_sfixed64(0));
+  EXPECT_EQ(611, message.packed_float(0));
+  EXPECT_EQ(612, message.packed_double(0));
+  EXPECT_EQ(true, message.packed_bool(0));
   EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.packed_enum(0));
 
-  EXPECT_EQ(701  , message.packed_int32   (1));
-  EXPECT_EQ(702  , message.packed_int64   (1));
-  EXPECT_EQ(703  , message.packed_uint32  (1));
-  EXPECT_EQ(704  , message.packed_uint64  (1));
-  EXPECT_EQ(705  , message.packed_sint32  (1));
-  EXPECT_EQ(706  , message.packed_sint64  (1));
-  EXPECT_EQ(707  , message.packed_fixed32 (1));
-  EXPECT_EQ(708  , message.packed_fixed64 (1));
-  EXPECT_EQ(709  , message.packed_sfixed32(1));
-  EXPECT_EQ(710  , message.packed_sfixed64(1));
-  EXPECT_EQ(711  , message.packed_float   (1));
-  EXPECT_EQ(712  , message.packed_double  (1));
-  EXPECT_EQ(false, message.packed_bool    (1));
+  EXPECT_EQ(701, message.packed_int32(1));
+  EXPECT_EQ(702, message.packed_int64(1));
+  EXPECT_EQ(703, message.packed_uint32(1));
+  EXPECT_EQ(704, message.packed_uint64(1));
+  EXPECT_EQ(705, message.packed_sint32(1));
+  EXPECT_EQ(706, message.packed_sint64(1));
+  EXPECT_EQ(707, message.packed_fixed32(1));
+  EXPECT_EQ(708, message.packed_fixed64(1));
+  EXPECT_EQ(709, message.packed_sfixed32(1));
+  EXPECT_EQ(710, message.packed_sfixed64(1));
+  EXPECT_EQ(711, message.packed_float(1));
+  EXPECT_EQ(712, message.packed_double(1));
+  EXPECT_EQ(false, message.packed_bool(1));
   EXPECT_EQ(unittest::FOREIGN_LITE_BAZ, message.packed_enum(1));
 }
 
@@ -730,20 +730,20 @@
 void TestUtilLite::ExpectPackedClear(
     const unittest::TestPackedTypesLite& message) {
   // Packed repeated fields are empty.
-  EXPECT_EQ(0, message.packed_int32_size   ());
-  EXPECT_EQ(0, message.packed_int64_size   ());
-  EXPECT_EQ(0, message.packed_uint32_size  ());
-  EXPECT_EQ(0, message.packed_uint64_size  ());
-  EXPECT_EQ(0, message.packed_sint32_size  ());
-  EXPECT_EQ(0, message.packed_sint64_size  ());
-  EXPECT_EQ(0, message.packed_fixed32_size ());
-  EXPECT_EQ(0, message.packed_fixed64_size ());
+  EXPECT_EQ(0, message.packed_int32_size());
+  EXPECT_EQ(0, message.packed_int64_size());
+  EXPECT_EQ(0, message.packed_uint32_size());
+  EXPECT_EQ(0, message.packed_uint64_size());
+  EXPECT_EQ(0, message.packed_sint32_size());
+  EXPECT_EQ(0, message.packed_sint64_size());
+  EXPECT_EQ(0, message.packed_fixed32_size());
+  EXPECT_EQ(0, message.packed_fixed64_size());
   EXPECT_EQ(0, message.packed_sfixed32_size());
   EXPECT_EQ(0, message.packed_sfixed64_size());
-  EXPECT_EQ(0, message.packed_float_size   ());
-  EXPECT_EQ(0, message.packed_double_size  ());
-  EXPECT_EQ(0, message.packed_bool_size    ());
-  EXPECT_EQ(0, message.packed_enum_size    ());
+  EXPECT_EQ(0, message.packed_float_size());
+  EXPECT_EQ(0, message.packed_double_size());
+  EXPECT_EQ(0, message.packed_bool_size());
+  EXPECT_EQ(0, message.packed_enum_size());
 }
 
 // -------------------------------------------------------------------
@@ -751,49 +751,49 @@
 void TestUtilLite::ExpectPackedFieldsModified(
     const unittest::TestPackedTypesLite& message) {
   // Do the same for packed repeated fields.
-  ASSERT_EQ(2, message.packed_int32_size   ());
-  ASSERT_EQ(2, message.packed_int64_size   ());
-  ASSERT_EQ(2, message.packed_uint32_size  ());
-  ASSERT_EQ(2, message.packed_uint64_size  ());
-  ASSERT_EQ(2, message.packed_sint32_size  ());
-  ASSERT_EQ(2, message.packed_sint64_size  ());
-  ASSERT_EQ(2, message.packed_fixed32_size ());
-  ASSERT_EQ(2, message.packed_fixed64_size ());
+  ASSERT_EQ(2, message.packed_int32_size());
+  ASSERT_EQ(2, message.packed_int64_size());
+  ASSERT_EQ(2, message.packed_uint32_size());
+  ASSERT_EQ(2, message.packed_uint64_size());
+  ASSERT_EQ(2, message.packed_sint32_size());
+  ASSERT_EQ(2, message.packed_sint64_size());
+  ASSERT_EQ(2, message.packed_fixed32_size());
+  ASSERT_EQ(2, message.packed_fixed64_size());
   ASSERT_EQ(2, message.packed_sfixed32_size());
   ASSERT_EQ(2, message.packed_sfixed64_size());
-  ASSERT_EQ(2, message.packed_float_size   ());
-  ASSERT_EQ(2, message.packed_double_size  ());
-  ASSERT_EQ(2, message.packed_bool_size    ());
-  ASSERT_EQ(2, message.packed_enum_size    ());
+  ASSERT_EQ(2, message.packed_float_size());
+  ASSERT_EQ(2, message.packed_double_size());
+  ASSERT_EQ(2, message.packed_bool_size());
+  ASSERT_EQ(2, message.packed_enum_size());
 
-  EXPECT_EQ(601  , message.packed_int32   (0));
-  EXPECT_EQ(602  , message.packed_int64   (0));
-  EXPECT_EQ(603  , message.packed_uint32  (0));
-  EXPECT_EQ(604  , message.packed_uint64  (0));
-  EXPECT_EQ(605  , message.packed_sint32  (0));
-  EXPECT_EQ(606  , message.packed_sint64  (0));
-  EXPECT_EQ(607  , message.packed_fixed32 (0));
-  EXPECT_EQ(608  , message.packed_fixed64 (0));
-  EXPECT_EQ(609  , message.packed_sfixed32(0));
-  EXPECT_EQ(610  , message.packed_sfixed64(0));
-  EXPECT_EQ(611  , message.packed_float   (0));
-  EXPECT_EQ(612  , message.packed_double  (0));
-  EXPECT_EQ(true , message.packed_bool    (0));
+  EXPECT_EQ(601, message.packed_int32(0));
+  EXPECT_EQ(602, message.packed_int64(0));
+  EXPECT_EQ(603, message.packed_uint32(0));
+  EXPECT_EQ(604, message.packed_uint64(0));
+  EXPECT_EQ(605, message.packed_sint32(0));
+  EXPECT_EQ(606, message.packed_sint64(0));
+  EXPECT_EQ(607, message.packed_fixed32(0));
+  EXPECT_EQ(608, message.packed_fixed64(0));
+  EXPECT_EQ(609, message.packed_sfixed32(0));
+  EXPECT_EQ(610, message.packed_sfixed64(0));
+  EXPECT_EQ(611, message.packed_float(0));
+  EXPECT_EQ(612, message.packed_double(0));
+  EXPECT_EQ(true, message.packed_bool(0));
   EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.packed_enum(0));
   // Actually verify the second (modified) elements now.
-  EXPECT_EQ(801  , message.packed_int32   (1));
-  EXPECT_EQ(802  , message.packed_int64   (1));
-  EXPECT_EQ(803  , message.packed_uint32  (1));
-  EXPECT_EQ(804  , message.packed_uint64  (1));
-  EXPECT_EQ(805  , message.packed_sint32  (1));
-  EXPECT_EQ(806  , message.packed_sint64  (1));
-  EXPECT_EQ(807  , message.packed_fixed32 (1));
-  EXPECT_EQ(808  , message.packed_fixed64 (1));
-  EXPECT_EQ(809  , message.packed_sfixed32(1));
-  EXPECT_EQ(810  , message.packed_sfixed64(1));
-  EXPECT_EQ(811  , message.packed_float   (1));
-  EXPECT_EQ(812  , message.packed_double  (1));
-  EXPECT_EQ(true , message.packed_bool    (1));
+  EXPECT_EQ(801, message.packed_int32(1));
+  EXPECT_EQ(802, message.packed_int64(1));
+  EXPECT_EQ(803, message.packed_uint32(1));
+  EXPECT_EQ(804, message.packed_uint64(1));
+  EXPECT_EQ(805, message.packed_sint32(1));
+  EXPECT_EQ(806, message.packed_sint64(1));
+  EXPECT_EQ(807, message.packed_fixed32(1));
+  EXPECT_EQ(808, message.packed_fixed64(1));
+  EXPECT_EQ(809, message.packed_sfixed32(1));
+  EXPECT_EQ(810, message.packed_sfixed64(1));
+  EXPECT_EQ(811, message.packed_float(1));
+  EXPECT_EQ(812, message.packed_double(1));
+  EXPECT_EQ(true, message.packed_bool(1));
   EXPECT_EQ(unittest::FOREIGN_LITE_FOO, message.packed_enum(1));
 }
 
@@ -806,116 +806,145 @@
 // I gave up on the 80-char limit here.  Sorry.
 
 void TestUtilLite::SetAllExtensions(unittest::TestAllExtensionsLite* message) {
-  message->SetExtension(unittest::optional_int32_extension_lite   , 101);
-  message->SetExtension(unittest::optional_int64_extension_lite   , 102);
-  message->SetExtension(unittest::optional_uint32_extension_lite  , 103);
-  message->SetExtension(unittest::optional_uint64_extension_lite  , 104);
-  message->SetExtension(unittest::optional_sint32_extension_lite  , 105);
-  message->SetExtension(unittest::optional_sint64_extension_lite  , 106);
-  message->SetExtension(unittest::optional_fixed32_extension_lite , 107);
-  message->SetExtension(unittest::optional_fixed64_extension_lite , 108);
+  message->SetExtension(unittest::optional_int32_extension_lite, 101);
+  message->SetExtension(unittest::optional_int64_extension_lite, 102);
+  message->SetExtension(unittest::optional_uint32_extension_lite, 103);
+  message->SetExtension(unittest::optional_uint64_extension_lite, 104);
+  message->SetExtension(unittest::optional_sint32_extension_lite, 105);
+  message->SetExtension(unittest::optional_sint64_extension_lite, 106);
+  message->SetExtension(unittest::optional_fixed32_extension_lite, 107);
+  message->SetExtension(unittest::optional_fixed64_extension_lite, 108);
   message->SetExtension(unittest::optional_sfixed32_extension_lite, 109);
   message->SetExtension(unittest::optional_sfixed64_extension_lite, 110);
-  message->SetExtension(unittest::optional_float_extension_lite   , 111);
-  message->SetExtension(unittest::optional_double_extension_lite  , 112);
-  message->SetExtension(unittest::optional_bool_extension_lite    , true);
-  message->SetExtension(unittest::optional_string_extension_lite  , "115");
-  message->SetExtension(unittest::optional_bytes_extension_lite   , "116");
+  message->SetExtension(unittest::optional_float_extension_lite, 111);
+  message->SetExtension(unittest::optional_double_extension_lite, 112);
+  message->SetExtension(unittest::optional_bool_extension_lite, true);
+  message->SetExtension(unittest::optional_string_extension_lite, "115");
+  message->SetExtension(unittest::optional_bytes_extension_lite, "116");
 
-  message->MutableExtension(unittest::optionalgroup_extension_lite                 )->set_a(117);
-  message->MutableExtension(unittest::optional_nested_message_extension_lite       )->set_bb(118);
-  message->MutableExtension(unittest::optional_foreign_message_extension_lite      )->set_c(119);
-  message->MutableExtension(unittest::optional_import_message_extension_lite       )->set_d(120);
-  message->MutableExtension(unittest::optional_public_import_message_extension_lite)->set_e(126);
-  message->MutableExtension(unittest::optional_lazy_message_extension_lite         )->set_bb(127);
+  message->MutableExtension(unittest::optionalgroup_extension_lite)->set_a(117);
+  message->MutableExtension(unittest::optional_nested_message_extension_lite)
+      ->set_bb(118);
+  message->MutableExtension(unittest::optional_foreign_message_extension_lite)
+      ->set_c(119);
+  message->MutableExtension(unittest::optional_import_message_extension_lite)
+      ->set_d(120);
+  message
+      ->MutableExtension(
+          unittest::optional_public_import_message_extension_lite)
+      ->set_e(126);
+  message->MutableExtension(unittest::optional_lazy_message_extension_lite)
+      ->set_bb(127);
 
-  message->SetExtension(unittest::optional_nested_enum_extension_lite , unittest::TestAllTypesLite::BAZ );
-  message->SetExtension(unittest::optional_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAZ      );
-  message->SetExtension(unittest::optional_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAZ);
+  message->SetExtension(unittest::optional_nested_enum_extension_lite,
+                        unittest::TestAllTypesLite::BAZ);
+  message->SetExtension(unittest::optional_foreign_enum_extension_lite,
+                        unittest::FOREIGN_LITE_BAZ);
+  message->SetExtension(unittest::optional_import_enum_extension_lite,
+                        unittest_import::IMPORT_LITE_BAZ);
 
 
   // -----------------------------------------------------------------
 
-  message->AddExtension(unittest::repeated_int32_extension_lite   , 201);
-  message->AddExtension(unittest::repeated_int64_extension_lite   , 202);
-  message->AddExtension(unittest::repeated_uint32_extension_lite  , 203);
-  message->AddExtension(unittest::repeated_uint64_extension_lite  , 204);
-  message->AddExtension(unittest::repeated_sint32_extension_lite  , 205);
-  message->AddExtension(unittest::repeated_sint64_extension_lite  , 206);
-  message->AddExtension(unittest::repeated_fixed32_extension_lite , 207);
-  message->AddExtension(unittest::repeated_fixed64_extension_lite , 208);
+  message->AddExtension(unittest::repeated_int32_extension_lite, 201);
+  message->AddExtension(unittest::repeated_int64_extension_lite, 202);
+  message->AddExtension(unittest::repeated_uint32_extension_lite, 203);
+  message->AddExtension(unittest::repeated_uint64_extension_lite, 204);
+  message->AddExtension(unittest::repeated_sint32_extension_lite, 205);
+  message->AddExtension(unittest::repeated_sint64_extension_lite, 206);
+  message->AddExtension(unittest::repeated_fixed32_extension_lite, 207);
+  message->AddExtension(unittest::repeated_fixed64_extension_lite, 208);
   message->AddExtension(unittest::repeated_sfixed32_extension_lite, 209);
   message->AddExtension(unittest::repeated_sfixed64_extension_lite, 210);
-  message->AddExtension(unittest::repeated_float_extension_lite   , 211);
-  message->AddExtension(unittest::repeated_double_extension_lite  , 212);
-  message->AddExtension(unittest::repeated_bool_extension_lite    , true);
-  message->AddExtension(unittest::repeated_string_extension_lite  , "215");
-  message->AddExtension(unittest::repeated_bytes_extension_lite   , "216");
+  message->AddExtension(unittest::repeated_float_extension_lite, 211);
+  message->AddExtension(unittest::repeated_double_extension_lite, 212);
+  message->AddExtension(unittest::repeated_bool_extension_lite, true);
+  message->AddExtension(unittest::repeated_string_extension_lite, "215");
+  message->AddExtension(unittest::repeated_bytes_extension_lite, "216");
 
-  message->AddExtension(unittest::repeatedgroup_extension_lite           )->set_a(217);
-  message->AddExtension(unittest::repeated_nested_message_extension_lite )->set_bb(218);
-  message->AddExtension(unittest::repeated_foreign_message_extension_lite)->set_c(219);
-  message->AddExtension(unittest::repeated_import_message_extension_lite )->set_d(220);
-  message->AddExtension(unittest::repeated_lazy_message_extension_lite   )->set_bb(227);
+  message->AddExtension(unittest::repeatedgroup_extension_lite)->set_a(217);
+  message->AddExtension(unittest::repeated_nested_message_extension_lite)
+      ->set_bb(218);
+  message->AddExtension(unittest::repeated_foreign_message_extension_lite)
+      ->set_c(219);
+  message->AddExtension(unittest::repeated_import_message_extension_lite)
+      ->set_d(220);
+  message->AddExtension(unittest::repeated_lazy_message_extension_lite)
+      ->set_bb(227);
 
-  message->AddExtension(unittest::repeated_nested_enum_extension_lite , unittest::TestAllTypesLite::BAR );
-  message->AddExtension(unittest::repeated_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAR      );
-  message->AddExtension(unittest::repeated_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAR);
+  message->AddExtension(unittest::repeated_nested_enum_extension_lite,
+                        unittest::TestAllTypesLite::BAR);
+  message->AddExtension(unittest::repeated_foreign_enum_extension_lite,
+                        unittest::FOREIGN_LITE_BAR);
+  message->AddExtension(unittest::repeated_import_enum_extension_lite,
+                        unittest_import::IMPORT_LITE_BAR);
 
 
   // Add a second one of each field.
-  message->AddExtension(unittest::repeated_int32_extension_lite   , 301);
-  message->AddExtension(unittest::repeated_int64_extension_lite   , 302);
-  message->AddExtension(unittest::repeated_uint32_extension_lite  , 303);
-  message->AddExtension(unittest::repeated_uint64_extension_lite  , 304);
-  message->AddExtension(unittest::repeated_sint32_extension_lite  , 305);
-  message->AddExtension(unittest::repeated_sint64_extension_lite  , 306);
-  message->AddExtension(unittest::repeated_fixed32_extension_lite , 307);
-  message->AddExtension(unittest::repeated_fixed64_extension_lite , 308);
+  message->AddExtension(unittest::repeated_int32_extension_lite, 301);
+  message->AddExtension(unittest::repeated_int64_extension_lite, 302);
+  message->AddExtension(unittest::repeated_uint32_extension_lite, 303);
+  message->AddExtension(unittest::repeated_uint64_extension_lite, 304);
+  message->AddExtension(unittest::repeated_sint32_extension_lite, 305);
+  message->AddExtension(unittest::repeated_sint64_extension_lite, 306);
+  message->AddExtension(unittest::repeated_fixed32_extension_lite, 307);
+  message->AddExtension(unittest::repeated_fixed64_extension_lite, 308);
   message->AddExtension(unittest::repeated_sfixed32_extension_lite, 309);
   message->AddExtension(unittest::repeated_sfixed64_extension_lite, 310);
-  message->AddExtension(unittest::repeated_float_extension_lite   , 311);
-  message->AddExtension(unittest::repeated_double_extension_lite  , 312);
-  message->AddExtension(unittest::repeated_bool_extension_lite    , false);
-  message->AddExtension(unittest::repeated_string_extension_lite  , "315");
-  message->AddExtension(unittest::repeated_bytes_extension_lite   , "316");
+  message->AddExtension(unittest::repeated_float_extension_lite, 311);
+  message->AddExtension(unittest::repeated_double_extension_lite, 312);
+  message->AddExtension(unittest::repeated_bool_extension_lite, false);
+  message->AddExtension(unittest::repeated_string_extension_lite, "315");
+  message->AddExtension(unittest::repeated_bytes_extension_lite, "316");
 
-  message->AddExtension(unittest::repeatedgroup_extension_lite           )->set_a(317);
-  message->AddExtension(unittest::repeated_nested_message_extension_lite )->set_bb(318);
-  message->AddExtension(unittest::repeated_foreign_message_extension_lite)->set_c(319);
-  message->AddExtension(unittest::repeated_import_message_extension_lite )->set_d(320);
-  message->AddExtension(unittest::repeated_lazy_message_extension_lite   )->set_bb(327);
+  message->AddExtension(unittest::repeatedgroup_extension_lite)->set_a(317);
+  message->AddExtension(unittest::repeated_nested_message_extension_lite)
+      ->set_bb(318);
+  message->AddExtension(unittest::repeated_foreign_message_extension_lite)
+      ->set_c(319);
+  message->AddExtension(unittest::repeated_import_message_extension_lite)
+      ->set_d(320);
+  message->AddExtension(unittest::repeated_lazy_message_extension_lite)
+      ->set_bb(327);
 
-  message->AddExtension(unittest::repeated_nested_enum_extension_lite , unittest::TestAllTypesLite::BAZ );
-  message->AddExtension(unittest::repeated_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAZ      );
-  message->AddExtension(unittest::repeated_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAZ);
+  message->AddExtension(unittest::repeated_nested_enum_extension_lite,
+                        unittest::TestAllTypesLite::BAZ);
+  message->AddExtension(unittest::repeated_foreign_enum_extension_lite,
+                        unittest::FOREIGN_LITE_BAZ);
+  message->AddExtension(unittest::repeated_import_enum_extension_lite,
+                        unittest_import::IMPORT_LITE_BAZ);
 
 
   // -----------------------------------------------------------------
 
-  message->SetExtension(unittest::default_int32_extension_lite   , 401);
-  message->SetExtension(unittest::default_int64_extension_lite   , 402);
-  message->SetExtension(unittest::default_uint32_extension_lite  , 403);
-  message->SetExtension(unittest::default_uint64_extension_lite  , 404);
-  message->SetExtension(unittest::default_sint32_extension_lite  , 405);
-  message->SetExtension(unittest::default_sint64_extension_lite  , 406);
-  message->SetExtension(unittest::default_fixed32_extension_lite , 407);
-  message->SetExtension(unittest::default_fixed64_extension_lite , 408);
+  message->SetExtension(unittest::default_int32_extension_lite, 401);
+  message->SetExtension(unittest::default_int64_extension_lite, 402);
+  message->SetExtension(unittest::default_uint32_extension_lite, 403);
+  message->SetExtension(unittest::default_uint64_extension_lite, 404);
+  message->SetExtension(unittest::default_sint32_extension_lite, 405);
+  message->SetExtension(unittest::default_sint64_extension_lite, 406);
+  message->SetExtension(unittest::default_fixed32_extension_lite, 407);
+  message->SetExtension(unittest::default_fixed64_extension_lite, 408);
   message->SetExtension(unittest::default_sfixed32_extension_lite, 409);
   message->SetExtension(unittest::default_sfixed64_extension_lite, 410);
-  message->SetExtension(unittest::default_float_extension_lite   , 411);
-  message->SetExtension(unittest::default_double_extension_lite  , 412);
-  message->SetExtension(unittest::default_bool_extension_lite    , false);
-  message->SetExtension(unittest::default_string_extension_lite  , "415");
-  message->SetExtension(unittest::default_bytes_extension_lite   , "416");
+  message->SetExtension(unittest::default_float_extension_lite, 411);
+  message->SetExtension(unittest::default_double_extension_lite, 412);
+  message->SetExtension(unittest::default_bool_extension_lite, false);
+  message->SetExtension(unittest::default_string_extension_lite, "415");
+  message->SetExtension(unittest::default_bytes_extension_lite, "416");
 
-  message->SetExtension(unittest::default_nested_enum_extension_lite , unittest::TestAllTypesLite::FOO );
-  message->SetExtension(unittest::default_foreign_enum_extension_lite, unittest::FOREIGN_LITE_FOO      );
-  message->SetExtension(unittest::default_import_enum_extension_lite , unittest_import::IMPORT_LITE_FOO);
+  message->SetExtension(unittest::default_nested_enum_extension_lite,
+                        unittest::TestAllTypesLite::FOO);
+  message->SetExtension(unittest::default_foreign_enum_extension_lite,
+                        unittest::FOREIGN_LITE_FOO);
+  message->SetExtension(unittest::default_import_enum_extension_lite,
+                        unittest_import::IMPORT_LITE_FOO);
 
 
   message->SetExtension(unittest::oneof_uint32_extension_lite, 601);
-  message->MutableExtension(unittest::oneof_nested_message_extension_lite)->set_bb(602);;
+  message->MutableExtension(unittest::oneof_nested_message_extension_lite)
+      ->set_bb(602);
+  ;
   message->SetExtension(unittest::oneof_string_extension_lite, "603");
   message->SetExtension(unittest::oneof_bytes_extension_lite, "604");
 }
@@ -924,31 +953,40 @@
 
 void TestUtilLite::ModifyRepeatedExtensions(
     unittest::TestAllExtensionsLite* message) {
-  message->SetExtension(unittest::repeated_int32_extension_lite   , 1, 501);
-  message->SetExtension(unittest::repeated_int64_extension_lite   , 1, 502);
-  message->SetExtension(unittest::repeated_uint32_extension_lite  , 1, 503);
-  message->SetExtension(unittest::repeated_uint64_extension_lite  , 1, 504);
-  message->SetExtension(unittest::repeated_sint32_extension_lite  , 1, 505);
-  message->SetExtension(unittest::repeated_sint64_extension_lite  , 1, 506);
-  message->SetExtension(unittest::repeated_fixed32_extension_lite , 1, 507);
-  message->SetExtension(unittest::repeated_fixed64_extension_lite , 1, 508);
+  message->SetExtension(unittest::repeated_int32_extension_lite, 1, 501);
+  message->SetExtension(unittest::repeated_int64_extension_lite, 1, 502);
+  message->SetExtension(unittest::repeated_uint32_extension_lite, 1, 503);
+  message->SetExtension(unittest::repeated_uint64_extension_lite, 1, 504);
+  message->SetExtension(unittest::repeated_sint32_extension_lite, 1, 505);
+  message->SetExtension(unittest::repeated_sint64_extension_lite, 1, 506);
+  message->SetExtension(unittest::repeated_fixed32_extension_lite, 1, 507);
+  message->SetExtension(unittest::repeated_fixed64_extension_lite, 1, 508);
   message->SetExtension(unittest::repeated_sfixed32_extension_lite, 1, 509);
   message->SetExtension(unittest::repeated_sfixed64_extension_lite, 1, 510);
-  message->SetExtension(unittest::repeated_float_extension_lite   , 1, 511);
-  message->SetExtension(unittest::repeated_double_extension_lite  , 1, 512);
-  message->SetExtension(unittest::repeated_bool_extension_lite    , 1, true);
-  message->SetExtension(unittest::repeated_string_extension_lite  , 1, "515");
-  message->SetExtension(unittest::repeated_bytes_extension_lite   , 1, "516");
+  message->SetExtension(unittest::repeated_float_extension_lite, 1, 511);
+  message->SetExtension(unittest::repeated_double_extension_lite, 1, 512);
+  message->SetExtension(unittest::repeated_bool_extension_lite, 1, true);
+  message->SetExtension(unittest::repeated_string_extension_lite, 1, "515");
+  message->SetExtension(unittest::repeated_bytes_extension_lite, 1, "516");
 
-  message->MutableExtension(unittest::repeatedgroup_extension_lite           , 1)->set_a(517);
-  message->MutableExtension(unittest::repeated_nested_message_extension_lite , 1)->set_bb(518);
-  message->MutableExtension(unittest::repeated_foreign_message_extension_lite, 1)->set_c(519);
-  message->MutableExtension(unittest::repeated_import_message_extension_lite , 1)->set_d(520);
-  message->MutableExtension(unittest::repeated_lazy_message_extension_lite   , 1)->set_bb(527);
+  message->MutableExtension(unittest::repeatedgroup_extension_lite, 1)
+      ->set_a(517);
+  message->MutableExtension(unittest::repeated_nested_message_extension_lite, 1)
+      ->set_bb(518);
+  message
+      ->MutableExtension(unittest::repeated_foreign_message_extension_lite, 1)
+      ->set_c(519);
+  message->MutableExtension(unittest::repeated_import_message_extension_lite, 1)
+      ->set_d(520);
+  message->MutableExtension(unittest::repeated_lazy_message_extension_lite, 1)
+      ->set_bb(527);
 
-  message->SetExtension(unittest::repeated_nested_enum_extension_lite , 1, unittest::TestAllTypesLite::FOO );
-  message->SetExtension(unittest::repeated_foreign_enum_extension_lite, 1, unittest::FOREIGN_LITE_FOO      );
-  message->SetExtension(unittest::repeated_import_enum_extension_lite , 1, unittest_import::IMPORT_LITE_FOO);
+  message->SetExtension(unittest::repeated_nested_enum_extension_lite, 1,
+                        unittest::TestAllTypesLite::FOO);
+  message->SetExtension(unittest::repeated_foreign_enum_extension_lite, 1,
+                        unittest::FOREIGN_LITE_FOO);
+  message->SetExtension(unittest::repeated_import_enum_extension_lite, 1,
+                        unittest_import::IMPORT_LITE_FOO);
 
 }
 
@@ -956,202 +994,351 @@
 
 void TestUtilLite::ExpectAllExtensionsSet(
     const unittest::TestAllExtensionsLite& message) {
-  EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension_lite   ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_int64_extension_lite   ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_uint64_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_sint32_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_sint64_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_fixed32_extension_lite ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_fixed64_extension_lite ));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_int64_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_uint64_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_sint32_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_sint64_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_fixed32_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_fixed64_extension_lite));
   EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed32_extension_lite));
   EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed64_extension_lite));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_float_extension_lite   ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_double_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_bool_extension_lite    ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_bytes_extension_lite   ));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_float_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_double_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_bool_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::optional_bytes_extension_lite));
 
-  EXPECT_TRUE(message.HasExtension(unittest::optionalgroup_extension_lite                 ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_nested_message_extension_lite       ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_message_extension_lite      ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_import_message_extension_lite       ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_public_import_message_extension_lite));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_lazy_message_extension_lite         ));
+  EXPECT_TRUE(message.HasExtension(unittest::optionalgroup_extension_lite));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::optional_nested_message_extension_lite));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::optional_foreign_message_extension_lite));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::optional_import_message_extension_lite));
+  EXPECT_TRUE(message.HasExtension(
+      unittest::optional_public_import_message_extension_lite));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::optional_lazy_message_extension_lite));
 
-  EXPECT_TRUE(message.GetExtension(unittest::optionalgroup_extension_lite                 ).has_a());
-  EXPECT_TRUE(message.GetExtension(unittest::optional_nested_message_extension_lite       ).has_bb());
-  EXPECT_TRUE(message.GetExtension(unittest::optional_foreign_message_extension_lite      ).has_c());
-  EXPECT_TRUE(message.GetExtension(unittest::optional_import_message_extension_lite       ).has_d());
-  EXPECT_TRUE(message.GetExtension(unittest::optional_public_import_message_extension_lite).has_e());
-  EXPECT_TRUE(message.GetExtension(unittest::optional_lazy_message_extension_lite         ).has_bb());
+  EXPECT_TRUE(
+      message.GetExtension(unittest::optionalgroup_extension_lite).has_a());
+  EXPECT_TRUE(
+      message.GetExtension(unittest::optional_nested_message_extension_lite)
+          .has_bb());
+  EXPECT_TRUE(
+      message.GetExtension(unittest::optional_foreign_message_extension_lite)
+          .has_c());
+  EXPECT_TRUE(
+      message.GetExtension(unittest::optional_import_message_extension_lite)
+          .has_d());
+  EXPECT_TRUE(
+      message
+          .GetExtension(unittest::optional_public_import_message_extension_lite)
+          .has_e());
+  EXPECT_TRUE(
+      message.GetExtension(unittest::optional_lazy_message_extension_lite)
+          .has_bb());
 
-  EXPECT_TRUE(message.HasExtension(unittest::optional_nested_enum_extension_lite ));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_enum_extension_lite));
-  EXPECT_TRUE(message.HasExtension(unittest::optional_import_enum_extension_lite ));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::optional_nested_enum_extension_lite));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::optional_foreign_enum_extension_lite));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::optional_import_enum_extension_lite));
 
 
-  EXPECT_EQ(101  , message.GetExtension(unittest::optional_int32_extension_lite   ));
-  EXPECT_EQ(102  , message.GetExtension(unittest::optional_int64_extension_lite   ));
-  EXPECT_EQ(103  , message.GetExtension(unittest::optional_uint32_extension_lite  ));
-  EXPECT_EQ(104  , message.GetExtension(unittest::optional_uint64_extension_lite  ));
-  EXPECT_EQ(105  , message.GetExtension(unittest::optional_sint32_extension_lite  ));
-  EXPECT_EQ(106  , message.GetExtension(unittest::optional_sint64_extension_lite  ));
-  EXPECT_EQ(107  , message.GetExtension(unittest::optional_fixed32_extension_lite ));
-  EXPECT_EQ(108  , message.GetExtension(unittest::optional_fixed64_extension_lite ));
-  EXPECT_EQ(109  , message.GetExtension(unittest::optional_sfixed32_extension_lite));
-  EXPECT_EQ(110  , message.GetExtension(unittest::optional_sfixed64_extension_lite));
-  EXPECT_EQ(111  , message.GetExtension(unittest::optional_float_extension_lite   ));
-  EXPECT_EQ(112  , message.GetExtension(unittest::optional_double_extension_lite  ));
-  EXPECT_EQ(true , message.GetExtension(unittest::optional_bool_extension_lite    ));
-  EXPECT_EQ("115", message.GetExtension(unittest::optional_string_extension_lite  ));
-  EXPECT_EQ("116", message.GetExtension(unittest::optional_bytes_extension_lite   ));
+  EXPECT_EQ(101, message.GetExtension(unittest::optional_int32_extension_lite));
+  EXPECT_EQ(102, message.GetExtension(unittest::optional_int64_extension_lite));
+  EXPECT_EQ(103,
+            message.GetExtension(unittest::optional_uint32_extension_lite));
+  EXPECT_EQ(104,
+            message.GetExtension(unittest::optional_uint64_extension_lite));
+  EXPECT_EQ(105,
+            message.GetExtension(unittest::optional_sint32_extension_lite));
+  EXPECT_EQ(106,
+            message.GetExtension(unittest::optional_sint64_extension_lite));
+  EXPECT_EQ(107,
+            message.GetExtension(unittest::optional_fixed32_extension_lite));
+  EXPECT_EQ(108,
+            message.GetExtension(unittest::optional_fixed64_extension_lite));
+  EXPECT_EQ(109,
+            message.GetExtension(unittest::optional_sfixed32_extension_lite));
+  EXPECT_EQ(110,
+            message.GetExtension(unittest::optional_sfixed64_extension_lite));
+  EXPECT_EQ(111, message.GetExtension(unittest::optional_float_extension_lite));
+  EXPECT_EQ(112,
+            message.GetExtension(unittest::optional_double_extension_lite));
+  EXPECT_EQ(true, message.GetExtension(unittest::optional_bool_extension_lite));
+  EXPECT_EQ("115",
+            message.GetExtension(unittest::optional_string_extension_lite));
+  EXPECT_EQ("116",
+            message.GetExtension(unittest::optional_bytes_extension_lite));
 
-  EXPECT_EQ(117, message.GetExtension(unittest::optionalgroup_extension_lite                 ).a());
-  EXPECT_EQ(118, message.GetExtension(unittest::optional_nested_message_extension_lite       ).bb());
-  EXPECT_EQ(119, message.GetExtension(unittest::optional_foreign_message_extension_lite      ).c());
-  EXPECT_EQ(120, message.GetExtension(unittest::optional_import_message_extension_lite       ).d());
-  EXPECT_EQ(126, message.GetExtension(unittest::optional_public_import_message_extension_lite).e());
-  EXPECT_EQ(127, message.GetExtension(unittest::optional_lazy_message_extension_lite         ).bb());
+  EXPECT_EQ(117,
+            message.GetExtension(unittest::optionalgroup_extension_lite).a());
+  EXPECT_EQ(
+      118,
+      message.GetExtension(unittest::optional_nested_message_extension_lite)
+          .bb());
+  EXPECT_EQ(
+      119,
+      message.GetExtension(unittest::optional_foreign_message_extension_lite)
+          .c());
+  EXPECT_EQ(
+      120,
+      message.GetExtension(unittest::optional_import_message_extension_lite)
+          .d());
+  EXPECT_EQ(
+      126,
+      message
+          .GetExtension(unittest::optional_public_import_message_extension_lite)
+          .e());
+  EXPECT_EQ(127,
+            message.GetExtension(unittest::optional_lazy_message_extension_lite)
+                .bb());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.GetExtension(unittest::optional_nested_enum_extension_lite ));
-  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ      , message.GetExtension(unittest::optional_foreign_enum_extension_lite));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.GetExtension(unittest::optional_import_enum_extension_lite ));
+  EXPECT_EQ(
+      unittest::TestAllTypesLite::BAZ,
+      message.GetExtension(unittest::optional_nested_enum_extension_lite));
+  EXPECT_EQ(
+      unittest::FOREIGN_LITE_BAZ,
+      message.GetExtension(unittest::optional_foreign_enum_extension_lite));
+  EXPECT_EQ(
+      unittest_import::IMPORT_LITE_BAZ,
+      message.GetExtension(unittest::optional_import_enum_extension_lite));
 
 
   // -----------------------------------------------------------------
 
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension_lite ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension_lite ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension_lite    ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension_lite   ));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension_lite));
+  ASSERT_EQ(2,
+            message.ExtensionSize(unittest::repeated_fixed32_extension_lite));
+  ASSERT_EQ(2,
+            message.ExtensionSize(unittest::repeated_fixed64_extension_lite));
+  ASSERT_EQ(2,
+            message.ExtensionSize(unittest::repeated_sfixed32_extension_lite));
+  ASSERT_EQ(2,
+            message.ExtensionSize(unittest::repeated_sfixed64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension_lite));
 
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension_lite           ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension_lite ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension_lite ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_lazy_message_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite    ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension_lite    ));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(
+                   unittest::repeated_nested_message_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(
+                   unittest::repeated_foreign_message_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(
+                   unittest::repeated_import_message_extension_lite));
+  ASSERT_EQ(
+      2, message.ExtensionSize(unittest::repeated_lazy_message_extension_lite));
+  ASSERT_EQ(
+      2, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite));
+  ASSERT_EQ(
+      2, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite));
+  ASSERT_EQ(
+      2, message.ExtensionSize(unittest::repeated_import_enum_extension_lite));
 
 
-  EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension_lite   , 0));
-  EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension_lite   , 0));
-  EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension_lite  , 0));
-  EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension_lite  , 0));
-  EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension_lite  , 0));
-  EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension_lite  , 0));
-  EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension_lite , 0));
-  EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension_lite , 0));
-  EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 0));
-  EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 0));
-  EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension_lite   , 0));
-  EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension_lite  , 0));
-  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite    , 0));
-  EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension_lite  , 0));
-  EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension_lite   , 0));
+  EXPECT_EQ(201,
+            message.GetExtension(unittest::repeated_int32_extension_lite, 0));
+  EXPECT_EQ(202,
+            message.GetExtension(unittest::repeated_int64_extension_lite, 0));
+  EXPECT_EQ(203,
+            message.GetExtension(unittest::repeated_uint32_extension_lite, 0));
+  EXPECT_EQ(204,
+            message.GetExtension(unittest::repeated_uint64_extension_lite, 0));
+  EXPECT_EQ(205,
+            message.GetExtension(unittest::repeated_sint32_extension_lite, 0));
+  EXPECT_EQ(206,
+            message.GetExtension(unittest::repeated_sint64_extension_lite, 0));
+  EXPECT_EQ(207,
+            message.GetExtension(unittest::repeated_fixed32_extension_lite, 0));
+  EXPECT_EQ(208,
+            message.GetExtension(unittest::repeated_fixed64_extension_lite, 0));
+  EXPECT_EQ(
+      209, message.GetExtension(unittest::repeated_sfixed32_extension_lite, 0));
+  EXPECT_EQ(
+      210, message.GetExtension(unittest::repeated_sfixed64_extension_lite, 0));
+  EXPECT_EQ(211,
+            message.GetExtension(unittest::repeated_float_extension_lite, 0));
+  EXPECT_EQ(212,
+            message.GetExtension(unittest::repeated_double_extension_lite, 0));
+  EXPECT_EQ(true,
+            message.GetExtension(unittest::repeated_bool_extension_lite, 0));
+  EXPECT_EQ("215",
+            message.GetExtension(unittest::repeated_string_extension_lite, 0));
+  EXPECT_EQ("216",
+            message.GetExtension(unittest::repeated_bytes_extension_lite, 0));
 
-  EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension_lite           , 0).a());
-  EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension_lite , 0).bb());
-  EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 0).c());
-  EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension_lite , 0).d());
-  EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension_lite   , 0).bb());
+  EXPECT_EQ(
+      217, message.GetExtension(unittest::repeatedgroup_extension_lite, 0).a());
+  EXPECT_EQ(
+      218,
+      message.GetExtension(unittest::repeated_nested_message_extension_lite, 0)
+          .bb());
+  EXPECT_EQ(
+      219,
+      message.GetExtension(unittest::repeated_foreign_message_extension_lite, 0)
+          .c());
+  EXPECT_EQ(
+      220,
+      message.GetExtension(unittest::repeated_import_message_extension_lite, 0)
+          .d());
+  EXPECT_EQ(
+      227,
+      message.GetExtension(unittest::repeated_lazy_message_extension_lite, 0)
+          .bb());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 0));
-  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 0));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::repeated_import_enum_extension_lite , 0));
+  EXPECT_EQ(
+      unittest::TestAllTypesLite::BAR,
+      message.GetExtension(unittest::repeated_nested_enum_extension_lite, 0));
+  EXPECT_EQ(
+      unittest::FOREIGN_LITE_BAR,
+      message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 0));
+  EXPECT_EQ(
+      unittest_import::IMPORT_LITE_BAR,
+      message.GetExtension(unittest::repeated_import_enum_extension_lite, 0));
 
 
-  EXPECT_EQ(301  , message.GetExtension(unittest::repeated_int32_extension_lite   , 1));
-  EXPECT_EQ(302  , message.GetExtension(unittest::repeated_int64_extension_lite   , 1));
-  EXPECT_EQ(303  , message.GetExtension(unittest::repeated_uint32_extension_lite  , 1));
-  EXPECT_EQ(304  , message.GetExtension(unittest::repeated_uint64_extension_lite  , 1));
-  EXPECT_EQ(305  , message.GetExtension(unittest::repeated_sint32_extension_lite  , 1));
-  EXPECT_EQ(306  , message.GetExtension(unittest::repeated_sint64_extension_lite  , 1));
-  EXPECT_EQ(307  , message.GetExtension(unittest::repeated_fixed32_extension_lite , 1));
-  EXPECT_EQ(308  , message.GetExtension(unittest::repeated_fixed64_extension_lite , 1));
-  EXPECT_EQ(309  , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 1));
-  EXPECT_EQ(310  , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 1));
-  EXPECT_EQ(311  , message.GetExtension(unittest::repeated_float_extension_lite   , 1));
-  EXPECT_EQ(312  , message.GetExtension(unittest::repeated_double_extension_lite  , 1));
-  EXPECT_EQ(false, message.GetExtension(unittest::repeated_bool_extension_lite    , 1));
-  EXPECT_EQ("315", message.GetExtension(unittest::repeated_string_extension_lite  , 1));
-  EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension_lite   , 1));
+  EXPECT_EQ(301,
+            message.GetExtension(unittest::repeated_int32_extension_lite, 1));
+  EXPECT_EQ(302,
+            message.GetExtension(unittest::repeated_int64_extension_lite, 1));
+  EXPECT_EQ(303,
+            message.GetExtension(unittest::repeated_uint32_extension_lite, 1));
+  EXPECT_EQ(304,
+            message.GetExtension(unittest::repeated_uint64_extension_lite, 1));
+  EXPECT_EQ(305,
+            message.GetExtension(unittest::repeated_sint32_extension_lite, 1));
+  EXPECT_EQ(306,
+            message.GetExtension(unittest::repeated_sint64_extension_lite, 1));
+  EXPECT_EQ(307,
+            message.GetExtension(unittest::repeated_fixed32_extension_lite, 1));
+  EXPECT_EQ(308,
+            message.GetExtension(unittest::repeated_fixed64_extension_lite, 1));
+  EXPECT_EQ(
+      309, message.GetExtension(unittest::repeated_sfixed32_extension_lite, 1));
+  EXPECT_EQ(
+      310, message.GetExtension(unittest::repeated_sfixed64_extension_lite, 1));
+  EXPECT_EQ(311,
+            message.GetExtension(unittest::repeated_float_extension_lite, 1));
+  EXPECT_EQ(312,
+            message.GetExtension(unittest::repeated_double_extension_lite, 1));
+  EXPECT_EQ(false,
+            message.GetExtension(unittest::repeated_bool_extension_lite, 1));
+  EXPECT_EQ("315",
+            message.GetExtension(unittest::repeated_string_extension_lite, 1));
+  EXPECT_EQ("316",
+            message.GetExtension(unittest::repeated_bytes_extension_lite, 1));
 
-  EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension_lite           , 1).a());
-  EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension_lite , 1).bb());
-  EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 1).c());
-  EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension_lite , 1).d());
-  EXPECT_EQ(327, message.GetExtension(unittest::repeated_lazy_message_extension_lite   , 1).bb());
+  EXPECT_EQ(
+      317, message.GetExtension(unittest::repeatedgroup_extension_lite, 1).a());
+  EXPECT_EQ(
+      318,
+      message.GetExtension(unittest::repeated_nested_message_extension_lite, 1)
+          .bb());
+  EXPECT_EQ(
+      319,
+      message.GetExtension(unittest::repeated_foreign_message_extension_lite, 1)
+          .c());
+  EXPECT_EQ(
+      320,
+      message.GetExtension(unittest::repeated_import_message_extension_lite, 1)
+          .d());
+  EXPECT_EQ(
+      327,
+      message.GetExtension(unittest::repeated_lazy_message_extension_lite, 1)
+          .bb());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 1));
-  EXPECT_EQ(unittest::FOREIGN_LITE_BAZ      , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 1));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.GetExtension(unittest::repeated_import_enum_extension_lite , 1));
+  EXPECT_EQ(
+      unittest::TestAllTypesLite::BAZ,
+      message.GetExtension(unittest::repeated_nested_enum_extension_lite, 1));
+  EXPECT_EQ(
+      unittest::FOREIGN_LITE_BAZ,
+      message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 1));
+  EXPECT_EQ(
+      unittest_import::IMPORT_LITE_BAZ,
+      message.GetExtension(unittest::repeated_import_enum_extension_lite, 1));
 
 
   // -----------------------------------------------------------------
 
-  EXPECT_TRUE(message.HasExtension(unittest::default_int32_extension_lite   ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_int64_extension_lite   ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_uint32_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_uint64_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_sint32_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_sint64_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_fixed32_extension_lite ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_fixed64_extension_lite ));
+  EXPECT_TRUE(message.HasExtension(unittest::default_int32_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_int64_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_uint32_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_uint64_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_sint32_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_sint64_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_fixed32_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_fixed64_extension_lite));
   EXPECT_TRUE(message.HasExtension(unittest::default_sfixed32_extension_lite));
   EXPECT_TRUE(message.HasExtension(unittest::default_sfixed64_extension_lite));
-  EXPECT_TRUE(message.HasExtension(unittest::default_float_extension_lite   ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_double_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_bool_extension_lite    ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_string_extension_lite  ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_bytes_extension_lite   ));
+  EXPECT_TRUE(message.HasExtension(unittest::default_float_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_double_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_bool_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_string_extension_lite));
+  EXPECT_TRUE(message.HasExtension(unittest::default_bytes_extension_lite));
 
-  EXPECT_TRUE(message.HasExtension(unittest::default_nested_enum_extension_lite ));
-  EXPECT_TRUE(message.HasExtension(unittest::default_foreign_enum_extension_lite));
-  EXPECT_TRUE(message.HasExtension(unittest::default_import_enum_extension_lite ));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::default_nested_enum_extension_lite));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::default_foreign_enum_extension_lite));
+  EXPECT_TRUE(
+      message.HasExtension(unittest::default_import_enum_extension_lite));
 
 
-  EXPECT_EQ(401  , message.GetExtension(unittest::default_int32_extension_lite   ));
-  EXPECT_EQ(402  , message.GetExtension(unittest::default_int64_extension_lite   ));
-  EXPECT_EQ(403  , message.GetExtension(unittest::default_uint32_extension_lite  ));
-  EXPECT_EQ(404  , message.GetExtension(unittest::default_uint64_extension_lite  ));
-  EXPECT_EQ(405  , message.GetExtension(unittest::default_sint32_extension_lite  ));
-  EXPECT_EQ(406  , message.GetExtension(unittest::default_sint64_extension_lite  ));
-  EXPECT_EQ(407  , message.GetExtension(unittest::default_fixed32_extension_lite ));
-  EXPECT_EQ(408  , message.GetExtension(unittest::default_fixed64_extension_lite ));
-  EXPECT_EQ(409  , message.GetExtension(unittest::default_sfixed32_extension_lite));
-  EXPECT_EQ(410  , message.GetExtension(unittest::default_sfixed64_extension_lite));
-  EXPECT_EQ(411  , message.GetExtension(unittest::default_float_extension_lite   ));
-  EXPECT_EQ(412  , message.GetExtension(unittest::default_double_extension_lite  ));
-  EXPECT_EQ(false, message.GetExtension(unittest::default_bool_extension_lite    ));
-  EXPECT_EQ("415", message.GetExtension(unittest::default_string_extension_lite  ));
-  EXPECT_EQ("416", message.GetExtension(unittest::default_bytes_extension_lite   ));
+  EXPECT_EQ(401, message.GetExtension(unittest::default_int32_extension_lite));
+  EXPECT_EQ(402, message.GetExtension(unittest::default_int64_extension_lite));
+  EXPECT_EQ(403, message.GetExtension(unittest::default_uint32_extension_lite));
+  EXPECT_EQ(404, message.GetExtension(unittest::default_uint64_extension_lite));
+  EXPECT_EQ(405, message.GetExtension(unittest::default_sint32_extension_lite));
+  EXPECT_EQ(406, message.GetExtension(unittest::default_sint64_extension_lite));
+  EXPECT_EQ(407,
+            message.GetExtension(unittest::default_fixed32_extension_lite));
+  EXPECT_EQ(408,
+            message.GetExtension(unittest::default_fixed64_extension_lite));
+  EXPECT_EQ(409,
+            message.GetExtension(unittest::default_sfixed32_extension_lite));
+  EXPECT_EQ(410,
+            message.GetExtension(unittest::default_sfixed64_extension_lite));
+  EXPECT_EQ(411, message.GetExtension(unittest::default_float_extension_lite));
+  EXPECT_EQ(412, message.GetExtension(unittest::default_double_extension_lite));
+  EXPECT_EQ(false, message.GetExtension(unittest::default_bool_extension_lite));
+  EXPECT_EQ("415",
+            message.GetExtension(unittest::default_string_extension_lite));
+  EXPECT_EQ("416",
+            message.GetExtension(unittest::default_bytes_extension_lite));
 
-  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::default_nested_enum_extension_lite ));
-  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.GetExtension(unittest::default_foreign_enum_extension_lite));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::default_import_enum_extension_lite ));
+  EXPECT_EQ(unittest::TestAllTypesLite::FOO,
+            message.GetExtension(unittest::default_nested_enum_extension_lite));
+  EXPECT_EQ(
+      unittest::FOREIGN_LITE_FOO,
+      message.GetExtension(unittest::default_foreign_enum_extension_lite));
+  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO,
+            message.GetExtension(unittest::default_import_enum_extension_lite));
 
 
   EXPECT_TRUE(message.HasExtension(unittest::oneof_uint32_extension_lite));
-  EXPECT_TRUE(message.GetExtension(unittest::oneof_nested_message_extension_lite).has_bb());
+  EXPECT_TRUE(
+      message.GetExtension(unittest::oneof_nested_message_extension_lite)
+          .has_bb());
   EXPECT_TRUE(message.HasExtension(unittest::oneof_string_extension_lite));
   EXPECT_TRUE(message.HasExtension(unittest::oneof_bytes_extension_lite));
 
   EXPECT_EQ(601, message.GetExtension(unittest::oneof_uint32_extension_lite));
-  EXPECT_EQ(602, message.GetExtension(unittest::oneof_nested_message_extension_lite).bb());
+  EXPECT_EQ(
+      602,
+      message.GetExtension(unittest::oneof_nested_message_extension_lite).bb());
   EXPECT_EQ("603", message.GetExtension(unittest::oneof_string_extension_lite));
   EXPECT_EQ("604", message.GetExtension(unittest::oneof_bytes_extension_lite));
 }
@@ -1166,145 +1353,213 @@
   EXPECT_EQ(0, message.ByteSize());
 
   // has_blah() should initially be false for all optional fields.
-  EXPECT_FALSE(message.HasExtension(unittest::optional_int32_extension_lite   ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension_lite   ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_uint32_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_uint64_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_sint32_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_sint64_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_fixed32_extension_lite ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_fixed64_extension_lite ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed32_extension_lite));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed64_extension_lite));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_float_extension_lite   ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_double_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_bool_extension_lite    ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_string_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_bytes_extension_lite   ));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_int32_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_uint32_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_uint64_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_sint32_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_sint64_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_fixed32_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_fixed64_extension_lite));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_sfixed32_extension_lite));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_sfixed64_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_float_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_double_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_bool_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_string_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::optional_bytes_extension_lite));
 
-  EXPECT_FALSE(message.HasExtension(unittest::optionalgroup_extension_lite                 ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_nested_message_extension_lite       ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_message_extension_lite      ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_import_message_extension_lite       ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_public_import_message_extension_lite));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_lazy_message_extension_lite         ));
+  EXPECT_FALSE(message.HasExtension(unittest::optionalgroup_extension_lite));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_nested_message_extension_lite));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_foreign_message_extension_lite));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_import_message_extension_lite));
+  EXPECT_FALSE(message.HasExtension(
+      unittest::optional_public_import_message_extension_lite));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_lazy_message_extension_lite));
 
-  EXPECT_FALSE(message.HasExtension(unittest::optional_nested_enum_extension_lite ));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_enum_extension_lite));
-  EXPECT_FALSE(message.HasExtension(unittest::optional_import_enum_extension_lite ));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_nested_enum_extension_lite));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_foreign_enum_extension_lite));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::optional_import_enum_extension_lite));
 
 
   // Optional fields without defaults are set to zero or something like it.
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_int32_extension_lite   ));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_int64_extension_lite   ));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_uint32_extension_lite  ));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_uint64_extension_lite  ));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sint32_extension_lite  ));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sint64_extension_lite  ));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_fixed32_extension_lite ));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_fixed64_extension_lite ));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sfixed32_extension_lite));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_sfixed64_extension_lite));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_float_extension_lite   ));
-  EXPECT_EQ(0    , message.GetExtension(unittest::optional_double_extension_lite  ));
-  EXPECT_EQ(false, message.GetExtension(unittest::optional_bool_extension_lite    ));
-  EXPECT_EQ(""   , message.GetExtension(unittest::optional_string_extension_lite  ));
-  EXPECT_EQ(""   , message.GetExtension(unittest::optional_bytes_extension_lite   ));
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_int32_extension_lite));
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_int64_extension_lite));
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_uint32_extension_lite));
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_uint64_extension_lite));
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_sint32_extension_lite));
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_sint64_extension_lite));
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_fixed32_extension_lite));
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_fixed64_extension_lite));
+  EXPECT_EQ(0,
+            message.GetExtension(unittest::optional_sfixed32_extension_lite));
+  EXPECT_EQ(0,
+            message.GetExtension(unittest::optional_sfixed64_extension_lite));
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_float_extension_lite));
+  EXPECT_EQ(0, message.GetExtension(unittest::optional_double_extension_lite));
+  EXPECT_EQ(false,
+            message.GetExtension(unittest::optional_bool_extension_lite));
+  EXPECT_EQ("", message.GetExtension(unittest::optional_string_extension_lite));
+  EXPECT_EQ("", message.GetExtension(unittest::optional_bytes_extension_lite));
 
   // Embedded messages should also be clear.
-  EXPECT_FALSE(message.GetExtension(unittest::optionalgroup_extension_lite                 ).has_a());
-  EXPECT_FALSE(message.GetExtension(unittest::optional_nested_message_extension_lite       ).has_bb());
-  EXPECT_FALSE(message.GetExtension(unittest::optional_foreign_message_extension_lite      ).has_c());
-  EXPECT_FALSE(message.GetExtension(unittest::optional_import_message_extension_lite       ).has_d());
-  EXPECT_FALSE(message.GetExtension(unittest::optional_public_import_message_extension_lite).has_e());
-  EXPECT_FALSE(message.GetExtension(unittest::optional_lazy_message_extension_lite         ).has_bb());
+  EXPECT_FALSE(
+      message.GetExtension(unittest::optionalgroup_extension_lite).has_a());
+  EXPECT_FALSE(
+      message.GetExtension(unittest::optional_nested_message_extension_lite)
+          .has_bb());
+  EXPECT_FALSE(
+      message.GetExtension(unittest::optional_foreign_message_extension_lite)
+          .has_c());
+  EXPECT_FALSE(
+      message.GetExtension(unittest::optional_import_message_extension_lite)
+          .has_d());
+  EXPECT_FALSE(
+      message
+          .GetExtension(unittest::optional_public_import_message_extension_lite)
+          .has_e());
+  EXPECT_FALSE(
+      message.GetExtension(unittest::optional_lazy_message_extension_lite)
+          .has_bb());
 
-  EXPECT_EQ(0, message.GetExtension(unittest::optionalgroup_extension_lite                 ).a());
-  EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension_lite       ).bb());
-  EXPECT_EQ(0, message.GetExtension(unittest::optional_foreign_message_extension_lite      ).c());
-  EXPECT_EQ(0, message.GetExtension(unittest::optional_import_message_extension_lite       ).d());
-  EXPECT_EQ(0, message.GetExtension(unittest::optional_public_import_message_extension_lite).e());
-  EXPECT_EQ(0, message.GetExtension(unittest::optional_lazy_message_extension_lite         ).bb());
+  EXPECT_EQ(0,
+            message.GetExtension(unittest::optionalgroup_extension_lite).a());
+  EXPECT_EQ(
+      0, message.GetExtension(unittest::optional_nested_message_extension_lite)
+             .bb());
+  EXPECT_EQ(
+      0, message.GetExtension(unittest::optional_foreign_message_extension_lite)
+             .c());
+  EXPECT_EQ(
+      0, message.GetExtension(unittest::optional_import_message_extension_lite)
+             .d());
+  EXPECT_EQ(0, message
+                   .GetExtension(
+                       unittest::optional_public_import_message_extension_lite)
+                   .e());
+  EXPECT_EQ(0,
+            message.GetExtension(unittest::optional_lazy_message_extension_lite)
+                .bb());
 
   // Enums without defaults are set to the first value in the enum.
-  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::optional_nested_enum_extension_lite ));
-  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.GetExtension(unittest::optional_foreign_enum_extension_lite));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::optional_import_enum_extension_lite ));
+  EXPECT_EQ(
+      unittest::TestAllTypesLite::FOO,
+      message.GetExtension(unittest::optional_nested_enum_extension_lite));
+  EXPECT_EQ(
+      unittest::FOREIGN_LITE_FOO,
+      message.GetExtension(unittest::optional_foreign_enum_extension_lite));
+  EXPECT_EQ(
+      unittest_import::IMPORT_LITE_FOO,
+      message.GetExtension(unittest::optional_import_enum_extension_lite));
 
 
   // Repeated fields are empty.
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int32_extension_lite   ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int64_extension_lite   ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint32_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint64_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint32_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint64_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed32_extension_lite ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed64_extension_lite ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_float_extension_lite   ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_double_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bool_extension_lite    ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bytes_extension_lite   ));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int32_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int64_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint32_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint64_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint32_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint64_extension_lite));
+  EXPECT_EQ(0,
+            message.ExtensionSize(unittest::repeated_fixed32_extension_lite));
+  EXPECT_EQ(0,
+            message.ExtensionSize(unittest::repeated_fixed64_extension_lite));
+  EXPECT_EQ(0,
+            message.ExtensionSize(unittest::repeated_sfixed32_extension_lite));
+  EXPECT_EQ(0,
+            message.ExtensionSize(unittest::repeated_sfixed64_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_float_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_double_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bool_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bytes_extension_lite));
 
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeatedgroup_extension_lite           ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_message_extension_lite ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_message_extension_lite ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_lazy_message_extension_lite   ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite    ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite   ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_enum_extension_lite    ));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::repeatedgroup_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(
+                   unittest::repeated_nested_message_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(
+                   unittest::repeated_foreign_message_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(
+                   unittest::repeated_import_message_extension_lite));
+  EXPECT_EQ(
+      0, message.ExtensionSize(unittest::repeated_lazy_message_extension_lite));
+  EXPECT_EQ(
+      0, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite));
+  EXPECT_EQ(
+      0, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite));
+  EXPECT_EQ(
+      0, message.ExtensionSize(unittest::repeated_import_enum_extension_lite));
 
 
   // has_blah() should also be false for all default fields.
-  EXPECT_FALSE(message.HasExtension(unittest::default_int32_extension_lite   ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_int64_extension_lite   ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_uint32_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_uint64_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_sint32_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_sint64_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_fixed32_extension_lite ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_fixed64_extension_lite ));
+  EXPECT_FALSE(message.HasExtension(unittest::default_int32_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_int64_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_uint32_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_uint64_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_sint32_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_sint64_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_fixed32_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_fixed64_extension_lite));
   EXPECT_FALSE(message.HasExtension(unittest::default_sfixed32_extension_lite));
   EXPECT_FALSE(message.HasExtension(unittest::default_sfixed64_extension_lite));
-  EXPECT_FALSE(message.HasExtension(unittest::default_float_extension_lite   ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_double_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_bool_extension_lite    ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_string_extension_lite  ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_bytes_extension_lite   ));
+  EXPECT_FALSE(message.HasExtension(unittest::default_float_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_double_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_bool_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_string_extension_lite));
+  EXPECT_FALSE(message.HasExtension(unittest::default_bytes_extension_lite));
 
-  EXPECT_FALSE(message.HasExtension(unittest::default_nested_enum_extension_lite ));
-  EXPECT_FALSE(message.HasExtension(unittest::default_foreign_enum_extension_lite));
-  EXPECT_FALSE(message.HasExtension(unittest::default_import_enum_extension_lite ));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::default_nested_enum_extension_lite));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::default_foreign_enum_extension_lite));
+  EXPECT_FALSE(
+      message.HasExtension(unittest::default_import_enum_extension_lite));
 
 
   // Fields with defaults have their default values (duh).
-  EXPECT_EQ( 41    , message.GetExtension(unittest::default_int32_extension_lite   ));
-  EXPECT_EQ( 42    , message.GetExtension(unittest::default_int64_extension_lite   ));
-  EXPECT_EQ( 43    , message.GetExtension(unittest::default_uint32_extension_lite  ));
-  EXPECT_EQ( 44    , message.GetExtension(unittest::default_uint64_extension_lite  ));
-  EXPECT_EQ(-45    , message.GetExtension(unittest::default_sint32_extension_lite  ));
-  EXPECT_EQ( 46    , message.GetExtension(unittest::default_sint64_extension_lite  ));
-  EXPECT_EQ( 47    , message.GetExtension(unittest::default_fixed32_extension_lite ));
-  EXPECT_EQ( 48    , message.GetExtension(unittest::default_fixed64_extension_lite ));
-  EXPECT_EQ( 49    , message.GetExtension(unittest::default_sfixed32_extension_lite));
-  EXPECT_EQ(-50    , message.GetExtension(unittest::default_sfixed64_extension_lite));
-  EXPECT_EQ( 51.5  , message.GetExtension(unittest::default_float_extension_lite   ));
-  EXPECT_EQ( 52e3  , message.GetExtension(unittest::default_double_extension_lite  ));
-  EXPECT_EQ(true   , message.GetExtension(unittest::default_bool_extension_lite    ));
-  EXPECT_EQ("hello", message.GetExtension(unittest::default_string_extension_lite  ));
-  EXPECT_EQ("world", message.GetExtension(unittest::default_bytes_extension_lite   ));
+  EXPECT_EQ(41, message.GetExtension(unittest::default_int32_extension_lite));
+  EXPECT_EQ(42, message.GetExtension(unittest::default_int64_extension_lite));
+  EXPECT_EQ(43, message.GetExtension(unittest::default_uint32_extension_lite));
+  EXPECT_EQ(44, message.GetExtension(unittest::default_uint64_extension_lite));
+  EXPECT_EQ(-45, message.GetExtension(unittest::default_sint32_extension_lite));
+  EXPECT_EQ(46, message.GetExtension(unittest::default_sint64_extension_lite));
+  EXPECT_EQ(47, message.GetExtension(unittest::default_fixed32_extension_lite));
+  EXPECT_EQ(48, message.GetExtension(unittest::default_fixed64_extension_lite));
+  EXPECT_EQ(49,
+            message.GetExtension(unittest::default_sfixed32_extension_lite));
+  EXPECT_EQ(-50,
+            message.GetExtension(unittest::default_sfixed64_extension_lite));
+  EXPECT_EQ(51.5, message.GetExtension(unittest::default_float_extension_lite));
+  EXPECT_EQ(52e3,
+            message.GetExtension(unittest::default_double_extension_lite));
+  EXPECT_EQ(true, message.GetExtension(unittest::default_bool_extension_lite));
+  EXPECT_EQ("hello",
+            message.GetExtension(unittest::default_string_extension_lite));
+  EXPECT_EQ("world",
+            message.GetExtension(unittest::default_bytes_extension_lite));
 
-  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::default_nested_enum_extension_lite ));
-  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.GetExtension(unittest::default_foreign_enum_extension_lite));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::default_import_enum_extension_lite ));
+  EXPECT_EQ(unittest::TestAllTypesLite::BAR,
+            message.GetExtension(unittest::default_nested_enum_extension_lite));
+  EXPECT_EQ(
+      unittest::FOREIGN_LITE_BAR,
+      message.GetExtension(unittest::default_foreign_enum_extension_lite));
+  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR,
+            message.GetExtension(unittest::default_import_enum_extension_lite));
 
 
   EXPECT_FALSE(message.HasExtension(unittest::oneof_uint32_extension_lite));
-  EXPECT_FALSE(message.GetExtension(unittest::oneof_nested_message_extension_lite).has_bb());
+  EXPECT_FALSE(
+      message.GetExtension(unittest::oneof_nested_message_extension_lite)
+          .has_bb());
   EXPECT_FALSE(message.HasExtension(unittest::oneof_string_extension_lite));
   EXPECT_FALSE(message.HasExtension(unittest::oneof_bytes_extension_lite));
 }
@@ -1316,85 +1571,164 @@
   // ModifyRepeatedFields only sets the second repeated element of each
   // field.  In addition to verifying this, we also verify that the first
   // element and size were *not* modified.
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension_lite ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension_lite ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension_lite    ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension_lite   ));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension_lite));
+  ASSERT_EQ(2,
+            message.ExtensionSize(unittest::repeated_fixed32_extension_lite));
+  ASSERT_EQ(2,
+            message.ExtensionSize(unittest::repeated_fixed64_extension_lite));
+  ASSERT_EQ(2,
+            message.ExtensionSize(unittest::repeated_sfixed32_extension_lite));
+  ASSERT_EQ(2,
+            message.ExtensionSize(unittest::repeated_sfixed64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension_lite));
 
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension_lite           ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension_lite ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension_lite ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_lazy_message_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite    ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension_lite    ));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(
+                   unittest::repeated_nested_message_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(
+                   unittest::repeated_foreign_message_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(
+                   unittest::repeated_import_message_extension_lite));
+  ASSERT_EQ(
+      2, message.ExtensionSize(unittest::repeated_lazy_message_extension_lite));
+  ASSERT_EQ(
+      2, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite));
+  ASSERT_EQ(
+      2, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite));
+  ASSERT_EQ(
+      2, message.ExtensionSize(unittest::repeated_import_enum_extension_lite));
 
 
-  EXPECT_EQ(201  , message.GetExtension(unittest::repeated_int32_extension_lite   , 0));
-  EXPECT_EQ(202  , message.GetExtension(unittest::repeated_int64_extension_lite   , 0));
-  EXPECT_EQ(203  , message.GetExtension(unittest::repeated_uint32_extension_lite  , 0));
-  EXPECT_EQ(204  , message.GetExtension(unittest::repeated_uint64_extension_lite  , 0));
-  EXPECT_EQ(205  , message.GetExtension(unittest::repeated_sint32_extension_lite  , 0));
-  EXPECT_EQ(206  , message.GetExtension(unittest::repeated_sint64_extension_lite  , 0));
-  EXPECT_EQ(207  , message.GetExtension(unittest::repeated_fixed32_extension_lite , 0));
-  EXPECT_EQ(208  , message.GetExtension(unittest::repeated_fixed64_extension_lite , 0));
-  EXPECT_EQ(209  , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 0));
-  EXPECT_EQ(210  , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 0));
-  EXPECT_EQ(211  , message.GetExtension(unittest::repeated_float_extension_lite   , 0));
-  EXPECT_EQ(212  , message.GetExtension(unittest::repeated_double_extension_lite  , 0));
-  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite    , 0));
-  EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension_lite  , 0));
-  EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension_lite   , 0));
+  EXPECT_EQ(201,
+            message.GetExtension(unittest::repeated_int32_extension_lite, 0));
+  EXPECT_EQ(202,
+            message.GetExtension(unittest::repeated_int64_extension_lite, 0));
+  EXPECT_EQ(203,
+            message.GetExtension(unittest::repeated_uint32_extension_lite, 0));
+  EXPECT_EQ(204,
+            message.GetExtension(unittest::repeated_uint64_extension_lite, 0));
+  EXPECT_EQ(205,
+            message.GetExtension(unittest::repeated_sint32_extension_lite, 0));
+  EXPECT_EQ(206,
+            message.GetExtension(unittest::repeated_sint64_extension_lite, 0));
+  EXPECT_EQ(207,
+            message.GetExtension(unittest::repeated_fixed32_extension_lite, 0));
+  EXPECT_EQ(208,
+            message.GetExtension(unittest::repeated_fixed64_extension_lite, 0));
+  EXPECT_EQ(
+      209, message.GetExtension(unittest::repeated_sfixed32_extension_lite, 0));
+  EXPECT_EQ(
+      210, message.GetExtension(unittest::repeated_sfixed64_extension_lite, 0));
+  EXPECT_EQ(211,
+            message.GetExtension(unittest::repeated_float_extension_lite, 0));
+  EXPECT_EQ(212,
+            message.GetExtension(unittest::repeated_double_extension_lite, 0));
+  EXPECT_EQ(true,
+            message.GetExtension(unittest::repeated_bool_extension_lite, 0));
+  EXPECT_EQ("215",
+            message.GetExtension(unittest::repeated_string_extension_lite, 0));
+  EXPECT_EQ("216",
+            message.GetExtension(unittest::repeated_bytes_extension_lite, 0));
 
-  EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension_lite           , 0).a());
-  EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension_lite , 0).bb());
-  EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 0).c());
-  EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension_lite , 0).d());
-  EXPECT_EQ(227, message.GetExtension(unittest::repeated_lazy_message_extension_lite   , 0).bb());
+  EXPECT_EQ(
+      217, message.GetExtension(unittest::repeatedgroup_extension_lite, 0).a());
+  EXPECT_EQ(
+      218,
+      message.GetExtension(unittest::repeated_nested_message_extension_lite, 0)
+          .bb());
+  EXPECT_EQ(
+      219,
+      message.GetExtension(unittest::repeated_foreign_message_extension_lite, 0)
+          .c());
+  EXPECT_EQ(
+      220,
+      message.GetExtension(unittest::repeated_import_message_extension_lite, 0)
+          .d());
+  EXPECT_EQ(
+      227,
+      message.GetExtension(unittest::repeated_lazy_message_extension_lite, 0)
+          .bb());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 0));
-  EXPECT_EQ(unittest::FOREIGN_LITE_BAR      , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 0));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::repeated_import_enum_extension_lite , 0));
+  EXPECT_EQ(
+      unittest::TestAllTypesLite::BAR,
+      message.GetExtension(unittest::repeated_nested_enum_extension_lite, 0));
+  EXPECT_EQ(
+      unittest::FOREIGN_LITE_BAR,
+      message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 0));
+  EXPECT_EQ(
+      unittest_import::IMPORT_LITE_BAR,
+      message.GetExtension(unittest::repeated_import_enum_extension_lite, 0));
 
 
   // Actually verify the second (modified) elements now.
-  EXPECT_EQ(501  , message.GetExtension(unittest::repeated_int32_extension_lite   , 1));
-  EXPECT_EQ(502  , message.GetExtension(unittest::repeated_int64_extension_lite   , 1));
-  EXPECT_EQ(503  , message.GetExtension(unittest::repeated_uint32_extension_lite  , 1));
-  EXPECT_EQ(504  , message.GetExtension(unittest::repeated_uint64_extension_lite  , 1));
-  EXPECT_EQ(505  , message.GetExtension(unittest::repeated_sint32_extension_lite  , 1));
-  EXPECT_EQ(506  , message.GetExtension(unittest::repeated_sint64_extension_lite  , 1));
-  EXPECT_EQ(507  , message.GetExtension(unittest::repeated_fixed32_extension_lite , 1));
-  EXPECT_EQ(508  , message.GetExtension(unittest::repeated_fixed64_extension_lite , 1));
-  EXPECT_EQ(509  , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 1));
-  EXPECT_EQ(510  , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 1));
-  EXPECT_EQ(511  , message.GetExtension(unittest::repeated_float_extension_lite   , 1));
-  EXPECT_EQ(512  , message.GetExtension(unittest::repeated_double_extension_lite  , 1));
-  EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite    , 1));
-  EXPECT_EQ("515", message.GetExtension(unittest::repeated_string_extension_lite  , 1));
-  EXPECT_EQ("516", message.GetExtension(unittest::repeated_bytes_extension_lite   , 1));
+  EXPECT_EQ(501,
+            message.GetExtension(unittest::repeated_int32_extension_lite, 1));
+  EXPECT_EQ(502,
+            message.GetExtension(unittest::repeated_int64_extension_lite, 1));
+  EXPECT_EQ(503,
+            message.GetExtension(unittest::repeated_uint32_extension_lite, 1));
+  EXPECT_EQ(504,
+            message.GetExtension(unittest::repeated_uint64_extension_lite, 1));
+  EXPECT_EQ(505,
+            message.GetExtension(unittest::repeated_sint32_extension_lite, 1));
+  EXPECT_EQ(506,
+            message.GetExtension(unittest::repeated_sint64_extension_lite, 1));
+  EXPECT_EQ(507,
+            message.GetExtension(unittest::repeated_fixed32_extension_lite, 1));
+  EXPECT_EQ(508,
+            message.GetExtension(unittest::repeated_fixed64_extension_lite, 1));
+  EXPECT_EQ(
+      509, message.GetExtension(unittest::repeated_sfixed32_extension_lite, 1));
+  EXPECT_EQ(
+      510, message.GetExtension(unittest::repeated_sfixed64_extension_lite, 1));
+  EXPECT_EQ(511,
+            message.GetExtension(unittest::repeated_float_extension_lite, 1));
+  EXPECT_EQ(512,
+            message.GetExtension(unittest::repeated_double_extension_lite, 1));
+  EXPECT_EQ(true,
+            message.GetExtension(unittest::repeated_bool_extension_lite, 1));
+  EXPECT_EQ("515",
+            message.GetExtension(unittest::repeated_string_extension_lite, 1));
+  EXPECT_EQ("516",
+            message.GetExtension(unittest::repeated_bytes_extension_lite, 1));
 
-  EXPECT_EQ(517, message.GetExtension(unittest::repeatedgroup_extension_lite           , 1).a());
-  EXPECT_EQ(518, message.GetExtension(unittest::repeated_nested_message_extension_lite , 1).bb());
-  EXPECT_EQ(519, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 1).c());
-  EXPECT_EQ(520, message.GetExtension(unittest::repeated_import_message_extension_lite , 1).d());
-  EXPECT_EQ(527, message.GetExtension(unittest::repeated_lazy_message_extension_lite   , 1).bb());
+  EXPECT_EQ(
+      517, message.GetExtension(unittest::repeatedgroup_extension_lite, 1).a());
+  EXPECT_EQ(
+      518,
+      message.GetExtension(unittest::repeated_nested_message_extension_lite, 1)
+          .bb());
+  EXPECT_EQ(
+      519,
+      message.GetExtension(unittest::repeated_foreign_message_extension_lite, 1)
+          .c());
+  EXPECT_EQ(
+      520,
+      message.GetExtension(unittest::repeated_import_message_extension_lite, 1)
+          .d());
+  EXPECT_EQ(
+      527,
+      message.GetExtension(unittest::repeated_lazy_message_extension_lite, 1)
+          .bb());
 
-  EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 1));
-  EXPECT_EQ(unittest::FOREIGN_LITE_FOO      , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 1));
-  EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::repeated_import_enum_extension_lite , 1));
+  EXPECT_EQ(
+      unittest::TestAllTypesLite::FOO,
+      message.GetExtension(unittest::repeated_nested_enum_extension_lite, 1));
+  EXPECT_EQ(
+      unittest::FOREIGN_LITE_FOO,
+      message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 1));
+  EXPECT_EQ(
+      unittest_import::IMPORT_LITE_FOO,
+      message.GetExtension(unittest::repeated_import_enum_extension_lite, 1));
 
 }
 
@@ -1402,55 +1736,57 @@
 
 void TestUtilLite::SetPackedExtensions(
     unittest::TestPackedExtensionsLite* message) {
-  message->AddExtension(unittest::packed_int32_extension_lite   , 601);
-  message->AddExtension(unittest::packed_int64_extension_lite   , 602);
-  message->AddExtension(unittest::packed_uint32_extension_lite  , 603);
-  message->AddExtension(unittest::packed_uint64_extension_lite  , 604);
-  message->AddExtension(unittest::packed_sint32_extension_lite  , 605);
-  message->AddExtension(unittest::packed_sint64_extension_lite  , 606);
-  message->AddExtension(unittest::packed_fixed32_extension_lite , 607);
-  message->AddExtension(unittest::packed_fixed64_extension_lite , 608);
+  message->AddExtension(unittest::packed_int32_extension_lite, 601);
+  message->AddExtension(unittest::packed_int64_extension_lite, 602);
+  message->AddExtension(unittest::packed_uint32_extension_lite, 603);
+  message->AddExtension(unittest::packed_uint64_extension_lite, 604);
+  message->AddExtension(unittest::packed_sint32_extension_lite, 605);
+  message->AddExtension(unittest::packed_sint64_extension_lite, 606);
+  message->AddExtension(unittest::packed_fixed32_extension_lite, 607);
+  message->AddExtension(unittest::packed_fixed64_extension_lite, 608);
   message->AddExtension(unittest::packed_sfixed32_extension_lite, 609);
   message->AddExtension(unittest::packed_sfixed64_extension_lite, 610);
-  message->AddExtension(unittest::packed_float_extension_lite   , 611);
-  message->AddExtension(unittest::packed_double_extension_lite  , 612);
-  message->AddExtension(unittest::packed_bool_extension_lite    , true);
-  message->AddExtension(unittest::packed_enum_extension_lite, unittest::FOREIGN_LITE_BAR);
+  message->AddExtension(unittest::packed_float_extension_lite, 611);
+  message->AddExtension(unittest::packed_double_extension_lite, 612);
+  message->AddExtension(unittest::packed_bool_extension_lite, true);
+  message->AddExtension(unittest::packed_enum_extension_lite,
+                        unittest::FOREIGN_LITE_BAR);
   // add a second one of each field
-  message->AddExtension(unittest::packed_int32_extension_lite   , 701);
-  message->AddExtension(unittest::packed_int64_extension_lite   , 702);
-  message->AddExtension(unittest::packed_uint32_extension_lite  , 703);
-  message->AddExtension(unittest::packed_uint64_extension_lite  , 704);
-  message->AddExtension(unittest::packed_sint32_extension_lite  , 705);
-  message->AddExtension(unittest::packed_sint64_extension_lite  , 706);
-  message->AddExtension(unittest::packed_fixed32_extension_lite , 707);
-  message->AddExtension(unittest::packed_fixed64_extension_lite , 708);
+  message->AddExtension(unittest::packed_int32_extension_lite, 701);
+  message->AddExtension(unittest::packed_int64_extension_lite, 702);
+  message->AddExtension(unittest::packed_uint32_extension_lite, 703);
+  message->AddExtension(unittest::packed_uint64_extension_lite, 704);
+  message->AddExtension(unittest::packed_sint32_extension_lite, 705);
+  message->AddExtension(unittest::packed_sint64_extension_lite, 706);
+  message->AddExtension(unittest::packed_fixed32_extension_lite, 707);
+  message->AddExtension(unittest::packed_fixed64_extension_lite, 708);
   message->AddExtension(unittest::packed_sfixed32_extension_lite, 709);
   message->AddExtension(unittest::packed_sfixed64_extension_lite, 710);
-  message->AddExtension(unittest::packed_float_extension_lite   , 711);
-  message->AddExtension(unittest::packed_double_extension_lite  , 712);
-  message->AddExtension(unittest::packed_bool_extension_lite    , false);
-  message->AddExtension(unittest::packed_enum_extension_lite, unittest::FOREIGN_LITE_BAZ);
+  message->AddExtension(unittest::packed_float_extension_lite, 711);
+  message->AddExtension(unittest::packed_double_extension_lite, 712);
+  message->AddExtension(unittest::packed_bool_extension_lite, false);
+  message->AddExtension(unittest::packed_enum_extension_lite,
+                        unittest::FOREIGN_LITE_BAZ);
 }
 
 // -------------------------------------------------------------------
 
 void TestUtilLite::ModifyPackedExtensions(
     unittest::TestPackedExtensionsLite* message) {
-  message->SetExtension(unittest::packed_int32_extension_lite   , 1, 801);
-  message->SetExtension(unittest::packed_int64_extension_lite   , 1, 802);
-  message->SetExtension(unittest::packed_uint32_extension_lite  , 1, 803);
-  message->SetExtension(unittest::packed_uint64_extension_lite  , 1, 804);
-  message->SetExtension(unittest::packed_sint32_extension_lite  , 1, 805);
-  message->SetExtension(unittest::packed_sint64_extension_lite  , 1, 806);
-  message->SetExtension(unittest::packed_fixed32_extension_lite , 1, 807);
-  message->SetExtension(unittest::packed_fixed64_extension_lite , 1, 808);
+  message->SetExtension(unittest::packed_int32_extension_lite, 1, 801);
+  message->SetExtension(unittest::packed_int64_extension_lite, 1, 802);
+  message->SetExtension(unittest::packed_uint32_extension_lite, 1, 803);
+  message->SetExtension(unittest::packed_uint64_extension_lite, 1, 804);
+  message->SetExtension(unittest::packed_sint32_extension_lite, 1, 805);
+  message->SetExtension(unittest::packed_sint64_extension_lite, 1, 806);
+  message->SetExtension(unittest::packed_fixed32_extension_lite, 1, 807);
+  message->SetExtension(unittest::packed_fixed64_extension_lite, 1, 808);
   message->SetExtension(unittest::packed_sfixed32_extension_lite, 1, 809);
   message->SetExtension(unittest::packed_sfixed64_extension_lite, 1, 810);
-  message->SetExtension(unittest::packed_float_extension_lite   , 1, 811);
-  message->SetExtension(unittest::packed_double_extension_lite  , 1, 812);
-  message->SetExtension(unittest::packed_bool_extension_lite    , 1, true);
-  message->SetExtension(unittest::packed_enum_extension_lite    , 1,
+  message->SetExtension(unittest::packed_float_extension_lite, 1, 811);
+  message->SetExtension(unittest::packed_double_extension_lite, 1, 812);
+  message->SetExtension(unittest::packed_bool_extension_lite, 1, true);
+  message->SetExtension(unittest::packed_enum_extension_lite, 1,
                         unittest::FOREIGN_LITE_FOO);
 }
 
@@ -1458,49 +1794,75 @@
 
 void TestUtilLite::ExpectPackedExtensionsSet(
     const unittest::TestPackedExtensionsLite& message) {
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension_lite ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension_lite ));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension_lite));
   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension_lite));
   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension_lite));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension_lite    ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension_lite    ));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension_lite));
 
-  EXPECT_EQ(601  , message.GetExtension(unittest::packed_int32_extension_lite   , 0));
-  EXPECT_EQ(602  , message.GetExtension(unittest::packed_int64_extension_lite   , 0));
-  EXPECT_EQ(603  , message.GetExtension(unittest::packed_uint32_extension_lite  , 0));
-  EXPECT_EQ(604  , message.GetExtension(unittest::packed_uint64_extension_lite  , 0));
-  EXPECT_EQ(605  , message.GetExtension(unittest::packed_sint32_extension_lite  , 0));
-  EXPECT_EQ(606  , message.GetExtension(unittest::packed_sint64_extension_lite  , 0));
-  EXPECT_EQ(607  , message.GetExtension(unittest::packed_fixed32_extension_lite , 0));
-  EXPECT_EQ(608  , message.GetExtension(unittest::packed_fixed64_extension_lite , 0));
-  EXPECT_EQ(609  , message.GetExtension(unittest::packed_sfixed32_extension_lite, 0));
-  EXPECT_EQ(610  , message.GetExtension(unittest::packed_sfixed64_extension_lite, 0));
-  EXPECT_EQ(611  , message.GetExtension(unittest::packed_float_extension_lite   , 0));
-  EXPECT_EQ(612  , message.GetExtension(unittest::packed_double_extension_lite  , 0));
-  EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite    , 0));
+  EXPECT_EQ(601,
+            message.GetExtension(unittest::packed_int32_extension_lite, 0));
+  EXPECT_EQ(602,
+            message.GetExtension(unittest::packed_int64_extension_lite, 0));
+  EXPECT_EQ(603,
+            message.GetExtension(unittest::packed_uint32_extension_lite, 0));
+  EXPECT_EQ(604,
+            message.GetExtension(unittest::packed_uint64_extension_lite, 0));
+  EXPECT_EQ(605,
+            message.GetExtension(unittest::packed_sint32_extension_lite, 0));
+  EXPECT_EQ(606,
+            message.GetExtension(unittest::packed_sint64_extension_lite, 0));
+  EXPECT_EQ(607,
+            message.GetExtension(unittest::packed_fixed32_extension_lite, 0));
+  EXPECT_EQ(608,
+            message.GetExtension(unittest::packed_fixed64_extension_lite, 0));
+  EXPECT_EQ(609,
+            message.GetExtension(unittest::packed_sfixed32_extension_lite, 0));
+  EXPECT_EQ(610,
+            message.GetExtension(unittest::packed_sfixed64_extension_lite, 0));
+  EXPECT_EQ(611,
+            message.GetExtension(unittest::packed_float_extension_lite, 0));
+  EXPECT_EQ(612,
+            message.GetExtension(unittest::packed_double_extension_lite, 0));
+  EXPECT_EQ(true,
+            message.GetExtension(unittest::packed_bool_extension_lite, 0));
   EXPECT_EQ(unittest::FOREIGN_LITE_BAR,
             message.GetExtension(unittest::packed_enum_extension_lite, 0));
-  EXPECT_EQ(701  , message.GetExtension(unittest::packed_int32_extension_lite   , 1));
-  EXPECT_EQ(702  , message.GetExtension(unittest::packed_int64_extension_lite   , 1));
-  EXPECT_EQ(703  , message.GetExtension(unittest::packed_uint32_extension_lite  , 1));
-  EXPECT_EQ(704  , message.GetExtension(unittest::packed_uint64_extension_lite  , 1));
-  EXPECT_EQ(705  , message.GetExtension(unittest::packed_sint32_extension_lite  , 1));
-  EXPECT_EQ(706  , message.GetExtension(unittest::packed_sint64_extension_lite  , 1));
-  EXPECT_EQ(707  , message.GetExtension(unittest::packed_fixed32_extension_lite , 1));
-  EXPECT_EQ(708  , message.GetExtension(unittest::packed_fixed64_extension_lite , 1));
-  EXPECT_EQ(709  , message.GetExtension(unittest::packed_sfixed32_extension_lite, 1));
-  EXPECT_EQ(710  , message.GetExtension(unittest::packed_sfixed64_extension_lite, 1));
-  EXPECT_EQ(711  , message.GetExtension(unittest::packed_float_extension_lite   , 1));
-  EXPECT_EQ(712  , message.GetExtension(unittest::packed_double_extension_lite  , 1));
-  EXPECT_EQ(false, message.GetExtension(unittest::packed_bool_extension_lite    , 1));
+  EXPECT_EQ(701,
+            message.GetExtension(unittest::packed_int32_extension_lite, 1));
+  EXPECT_EQ(702,
+            message.GetExtension(unittest::packed_int64_extension_lite, 1));
+  EXPECT_EQ(703,
+            message.GetExtension(unittest::packed_uint32_extension_lite, 1));
+  EXPECT_EQ(704,
+            message.GetExtension(unittest::packed_uint64_extension_lite, 1));
+  EXPECT_EQ(705,
+            message.GetExtension(unittest::packed_sint32_extension_lite, 1));
+  EXPECT_EQ(706,
+            message.GetExtension(unittest::packed_sint64_extension_lite, 1));
+  EXPECT_EQ(707,
+            message.GetExtension(unittest::packed_fixed32_extension_lite, 1));
+  EXPECT_EQ(708,
+            message.GetExtension(unittest::packed_fixed64_extension_lite, 1));
+  EXPECT_EQ(709,
+            message.GetExtension(unittest::packed_sfixed32_extension_lite, 1));
+  EXPECT_EQ(710,
+            message.GetExtension(unittest::packed_sfixed64_extension_lite, 1));
+  EXPECT_EQ(711,
+            message.GetExtension(unittest::packed_float_extension_lite, 1));
+  EXPECT_EQ(712,
+            message.GetExtension(unittest::packed_double_extension_lite, 1));
+  EXPECT_EQ(false,
+            message.GetExtension(unittest::packed_bool_extension_lite, 1));
   EXPECT_EQ(unittest::FOREIGN_LITE_BAZ,
             message.GetExtension(unittest::packed_enum_extension_lite, 1));
 }
@@ -1509,70 +1871,96 @@
 
 void TestUtilLite::ExpectPackedExtensionsClear(
     const unittest::TestPackedExtensionsLite& message) {
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int32_extension_lite   ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int64_extension_lite   ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint32_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint64_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint32_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint64_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed32_extension_lite ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed64_extension_lite ));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int32_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int64_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint32_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint64_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint32_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint64_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed32_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed64_extension_lite));
   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed32_extension_lite));
   EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed64_extension_lite));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_float_extension_lite   ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_double_extension_lite  ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_bool_extension_lite    ));
-  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_enum_extension_lite    ));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_float_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_double_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_bool_extension_lite));
+  EXPECT_EQ(0, message.ExtensionSize(unittest::packed_enum_extension_lite));
 }
 
 // -------------------------------------------------------------------
 
 void TestUtilLite::ExpectPackedExtensionsModified(
     const unittest::TestPackedExtensionsLite& message) {
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension_lite ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension_lite ));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension_lite));
   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension_lite));
   ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension_lite));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension_lite   ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension_lite  ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension_lite    ));
-  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension_lite    ));
-  EXPECT_EQ(601  , message.GetExtension(unittest::packed_int32_extension_lite   , 0));
-  EXPECT_EQ(602  , message.GetExtension(unittest::packed_int64_extension_lite   , 0));
-  EXPECT_EQ(603  , message.GetExtension(unittest::packed_uint32_extension_lite  , 0));
-  EXPECT_EQ(604  , message.GetExtension(unittest::packed_uint64_extension_lite  , 0));
-  EXPECT_EQ(605  , message.GetExtension(unittest::packed_sint32_extension_lite  , 0));
-  EXPECT_EQ(606  , message.GetExtension(unittest::packed_sint64_extension_lite  , 0));
-  EXPECT_EQ(607  , message.GetExtension(unittest::packed_fixed32_extension_lite , 0));
-  EXPECT_EQ(608  , message.GetExtension(unittest::packed_fixed64_extension_lite , 0));
-  EXPECT_EQ(609  , message.GetExtension(unittest::packed_sfixed32_extension_lite, 0));
-  EXPECT_EQ(610  , message.GetExtension(unittest::packed_sfixed64_extension_lite, 0));
-  EXPECT_EQ(611  , message.GetExtension(unittest::packed_float_extension_lite   , 0));
-  EXPECT_EQ(612  , message.GetExtension(unittest::packed_double_extension_lite  , 0));
-  EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite    , 0));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension_lite));
+  ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension_lite));
+  EXPECT_EQ(601,
+            message.GetExtension(unittest::packed_int32_extension_lite, 0));
+  EXPECT_EQ(602,
+            message.GetExtension(unittest::packed_int64_extension_lite, 0));
+  EXPECT_EQ(603,
+            message.GetExtension(unittest::packed_uint32_extension_lite, 0));
+  EXPECT_EQ(604,
+            message.GetExtension(unittest::packed_uint64_extension_lite, 0));
+  EXPECT_EQ(605,
+            message.GetExtension(unittest::packed_sint32_extension_lite, 0));
+  EXPECT_EQ(606,
+            message.GetExtension(unittest::packed_sint64_extension_lite, 0));
+  EXPECT_EQ(607,
+            message.GetExtension(unittest::packed_fixed32_extension_lite, 0));
+  EXPECT_EQ(608,
+            message.GetExtension(unittest::packed_fixed64_extension_lite, 0));
+  EXPECT_EQ(609,
+            message.GetExtension(unittest::packed_sfixed32_extension_lite, 0));
+  EXPECT_EQ(610,
+            message.GetExtension(unittest::packed_sfixed64_extension_lite, 0));
+  EXPECT_EQ(611,
+            message.GetExtension(unittest::packed_float_extension_lite, 0));
+  EXPECT_EQ(612,
+            message.GetExtension(unittest::packed_double_extension_lite, 0));
+  EXPECT_EQ(true,
+            message.GetExtension(unittest::packed_bool_extension_lite, 0));
   EXPECT_EQ(unittest::FOREIGN_LITE_BAR,
             message.GetExtension(unittest::packed_enum_extension_lite, 0));
 
   // Actually verify the second (modified) elements now.
-  EXPECT_EQ(801  , message.GetExtension(unittest::packed_int32_extension_lite   , 1));
-  EXPECT_EQ(802  , message.GetExtension(unittest::packed_int64_extension_lite   , 1));
-  EXPECT_EQ(803  , message.GetExtension(unittest::packed_uint32_extension_lite  , 1));
-  EXPECT_EQ(804  , message.GetExtension(unittest::packed_uint64_extension_lite  , 1));
-  EXPECT_EQ(805  , message.GetExtension(unittest::packed_sint32_extension_lite  , 1));
-  EXPECT_EQ(806  , message.GetExtension(unittest::packed_sint64_extension_lite  , 1));
-  EXPECT_EQ(807  , message.GetExtension(unittest::packed_fixed32_extension_lite , 1));
-  EXPECT_EQ(808  , message.GetExtension(unittest::packed_fixed64_extension_lite , 1));
-  EXPECT_EQ(809  , message.GetExtension(unittest::packed_sfixed32_extension_lite, 1));
-  EXPECT_EQ(810  , message.GetExtension(unittest::packed_sfixed64_extension_lite, 1));
-  EXPECT_EQ(811  , message.GetExtension(unittest::packed_float_extension_lite   , 1));
-  EXPECT_EQ(812  , message.GetExtension(unittest::packed_double_extension_lite  , 1));
-  EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite    , 1));
+  EXPECT_EQ(801,
+            message.GetExtension(unittest::packed_int32_extension_lite, 1));
+  EXPECT_EQ(802,
+            message.GetExtension(unittest::packed_int64_extension_lite, 1));
+  EXPECT_EQ(803,
+            message.GetExtension(unittest::packed_uint32_extension_lite, 1));
+  EXPECT_EQ(804,
+            message.GetExtension(unittest::packed_uint64_extension_lite, 1));
+  EXPECT_EQ(805,
+            message.GetExtension(unittest::packed_sint32_extension_lite, 1));
+  EXPECT_EQ(806,
+            message.GetExtension(unittest::packed_sint64_extension_lite, 1));
+  EXPECT_EQ(807,
+            message.GetExtension(unittest::packed_fixed32_extension_lite, 1));
+  EXPECT_EQ(808,
+            message.GetExtension(unittest::packed_fixed64_extension_lite, 1));
+  EXPECT_EQ(809,
+            message.GetExtension(unittest::packed_sfixed32_extension_lite, 1));
+  EXPECT_EQ(810,
+            message.GetExtension(unittest::packed_sfixed64_extension_lite, 1));
+  EXPECT_EQ(811,
+            message.GetExtension(unittest::packed_float_extension_lite, 1));
+  EXPECT_EQ(812,
+            message.GetExtension(unittest::packed_double_extension_lite, 1));
+  EXPECT_EQ(true,
+            message.GetExtension(unittest::packed_bool_extension_lite, 1));
   EXPECT_EQ(unittest::FOREIGN_LITE_FOO,
             message.GetExtension(unittest::packed_enum_extension_lite, 1));
 }
diff --git a/src/google/protobuf/testing/file.cc b/src/google/protobuf/testing/file.cc
index 06cc981..7d3708e 100644
--- a/src/google/protobuf/testing/file.cc
+++ b/src/google/protobuf/testing/file.cc
@@ -45,7 +45,7 @@
 #endif
 #include <errno.h>
 
-#include <google/protobuf/stubs/io_win32.h>
+#include <google/protobuf/io/io_win32.h>
 #include <google/protobuf/stubs/logging.h>
 
 namespace google {
@@ -59,11 +59,11 @@
 #endif
 
 #ifdef _WIN32
-using google::protobuf::internal::win32::access;
-using google::protobuf::internal::win32::chdir;
-using google::protobuf::internal::win32::fopen;
-using google::protobuf::internal::win32::mkdir;
-using google::protobuf::internal::win32::stat;
+using google::protobuf::io::win32::access;
+using google::protobuf::io::win32::chdir;
+using google::protobuf::io::win32::fopen;
+using google::protobuf::io::win32::mkdir;
+using google::protobuf::io::win32::stat;
 #endif
 
 bool File::Exists(const string& name) {
diff --git a/src/google/protobuf/testing/googletest.cc b/src/google/protobuf/testing/googletest.cc
index 5c89c0f..aca089c 100644
--- a/src/google/protobuf/testing/googletest.cc
+++ b/src/google/protobuf/testing/googletest.cc
@@ -33,7 +33,7 @@
 
 #include <google/protobuf/testing/googletest.h>
 #include <google/protobuf/testing/file.h>
-#include <google/protobuf/stubs/io_win32.h>
+#include <google/protobuf/io/io_win32.h>
 #include <google/protobuf/stubs/strutil.h>
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -55,11 +55,11 @@
 #ifdef _WIN32
 // DO NOT include <io.h>, instead create functions in io_win32.{h,cc} and import
 // them like we do below.
-using google::protobuf::internal::win32::close;
-using google::protobuf::internal::win32::dup2;
-using google::protobuf::internal::win32::dup;
-using google::protobuf::internal::win32::mkdir;
-using google::protobuf::internal::win32::open;
+using google::protobuf::io::win32::close;
+using google::protobuf::io::win32::dup2;
+using google::protobuf::io::win32::dup;
+using google::protobuf::io::win32::mkdir;
+using google::protobuf::io::win32::open;
 #endif
 
 #ifndef O_BINARY
diff --git a/src/google/protobuf/text_format.h b/src/google/protobuf/text_format.h
index 4c7c33b..f999f47 100644
--- a/src/google/protobuf/text_format.h
+++ b/src/google/protobuf/text_format.h
@@ -552,6 +552,13 @@
     // a warning message will be generated.
     void AllowUnknownExtension(bool allow) { allow_unknown_extension_ = allow; }
 
+    // When an unknown field is met, parsing will fail if this option is set
+    // to false(the default). If true, unknown fields will be ignored and
+    // a warning message will be generated.
+    // Please aware that set this option true may hide some errors (e.g.
+    // spelling error on field name). Avoid to use this option if possible.
+    void AllowUnknownField(bool allow) { allow_unknown_field_ = allow; }
+
 
     void AllowFieldNumber(bool allow) { allow_field_number_ = allow; }
 
diff --git a/src/google/protobuf/text_format_unittest.cc b/src/google/protobuf/text_format_unittest.cc
index 0bed993..7faf5c0 100644
--- a/src/google/protobuf/text_format_unittest.cc
+++ b/src/google/protobuf/text_format_unittest.cc
@@ -48,9 +48,9 @@
 #include <google/protobuf/test_util.h>
 #include <google/protobuf/test_util2.h>
 #include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_proto3.pb.h>
 #include <google/protobuf/unittest_mset.pb.h>
 #include <google/protobuf/unittest_mset_wire_format.pb.h>
+#include <google/protobuf/unittest_proto3.pb.h>
 #include <google/protobuf/io/tokenizer.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/stubs/strutil.h>
@@ -142,10 +142,11 @@
   proto_.mutable_optional_nested_message()->set_bb(2);
   proto_.mutable_optional_foreign_message();
 
-  EXPECT_EQ("optional_int32: 1 optional_string: \"hello\" "
-            "optional_nested_message { bb: 2 } "
-            "optional_foreign_message { }",
-            proto_.ShortDebugString());
+  EXPECT_EQ(
+      "optional_int32: 1 optional_string: \"hello\" "
+      "optional_nested_message { bb: 2 } "
+      "optional_foreign_message { }",
+      proto_.ShortDebugString());
 }
 
 TEST_F(TextFormatTest, ShortPrimitiveRepeateds) {
@@ -164,41 +165,44 @@
   std::string text;
   EXPECT_TRUE(printer.PrintToString(proto_, &text));
 
-  EXPECT_EQ("optional_int32: 123\n"
-            "repeated_int32: [456, 789]\n"
-            "repeated_string: \"foo\"\n"
-            "repeated_string: \"bar\"\n"
-            "repeated_nested_message {\n  bb: 2\n}\n"
-            "repeated_nested_message {\n  bb: 3\n}\n"
-            "repeated_nested_enum: [FOO, BAR]\n",
-            text);
+  EXPECT_EQ(
+      "optional_int32: 123\n"
+      "repeated_int32: [456, 789]\n"
+      "repeated_string: \"foo\"\n"
+      "repeated_string: \"bar\"\n"
+      "repeated_nested_message {\n  bb: 2\n}\n"
+      "repeated_nested_message {\n  bb: 3\n}\n"
+      "repeated_nested_enum: [FOO, BAR]\n",
+      text);
 
   // Verify that any existing data in the string is cleared when PrintToString()
   // is called.
   text = "just some data here...\n\nblah blah";
   EXPECT_TRUE(printer.PrintToString(proto_, &text));
 
-  EXPECT_EQ("optional_int32: 123\n"
-            "repeated_int32: [456, 789]\n"
-            "repeated_string: \"foo\"\n"
-            "repeated_string: \"bar\"\n"
-            "repeated_nested_message {\n  bb: 2\n}\n"
-            "repeated_nested_message {\n  bb: 3\n}\n"
-            "repeated_nested_enum: [FOO, BAR]\n",
-            text);
+  EXPECT_EQ(
+      "optional_int32: 123\n"
+      "repeated_int32: [456, 789]\n"
+      "repeated_string: \"foo\"\n"
+      "repeated_string: \"bar\"\n"
+      "repeated_nested_message {\n  bb: 2\n}\n"
+      "repeated_nested_message {\n  bb: 3\n}\n"
+      "repeated_nested_enum: [FOO, BAR]\n",
+      text);
 
   // Try in single-line mode.
   printer.SetSingleLineMode(true);
   EXPECT_TRUE(printer.PrintToString(proto_, &text));
 
-  EXPECT_EQ("optional_int32: 123 "
-            "repeated_int32: [456, 789] "
-            "repeated_string: \"foo\" "
-            "repeated_string: \"bar\" "
-            "repeated_nested_message { bb: 2 } "
-            "repeated_nested_message { bb: 3 } "
-            "repeated_nested_enum: [FOO, BAR] ",
-            text);
+  EXPECT_EQ(
+      "optional_int32: 123 "
+      "repeated_int32: [456, 789] "
+      "repeated_string: \"foo\" "
+      "repeated_string: \"bar\" "
+      "repeated_nested_message { bb: 2 } "
+      "repeated_nested_message { bb: 3 } "
+      "repeated_nested_enum: [FOO, BAR] ",
+      text);
 }
 
 
@@ -272,17 +276,17 @@
   unknown_fields->AddVarint(8, 3);
 
   EXPECT_EQ(
-    "5: 1\n"
-    "5: 0x00000002\n"
-    "5: 0x0000000000000003\n"
-    "5: \"4\"\n"
-    "5 {\n"
-    "  10: 5\n"
-    "}\n"
-    "8: 1\n"
-    "8: 2\n"
-    "8: 3\n",
-    message.DebugString());
+      "5: 1\n"
+      "5: 0x00000002\n"
+      "5: 0x0000000000000003\n"
+      "5: \"4\"\n"
+      "5 {\n"
+      "  10: 5\n"
+      "}\n"
+      "8: 1\n"
+      "8: 2\n"
+      "8: 3\n",
+      message.DebugString());
 }
 
 TEST_F(TextFormatTest, PrintUnknownFieldsHidden) {
@@ -345,13 +349,13 @@
   EXPECT_TRUE(unknown_fields.ParseFromString(data));
   EXPECT_TRUE(TextFormat::PrintUnknownFieldsToString(unknown_fields, &text));
   EXPECT_EQ(
-    "44: \"abc\"\n"
-    "44: \"def\"\n"
-    "44: \"\"\n"
-    "48 {\n"
-    "  1: 123\n"
-    "}\n",
-    text);
+      "44: \"abc\"\n"
+      "44: \"def\"\n"
+      "44: \"\"\n"
+      "48 {\n"
+      "  1: 123\n"
+      "}\n",
+      text);
 }
 
 TEST_F(TextFormatTest, PrintMessageWithIndent) {
@@ -368,12 +372,12 @@
   printer.SetInitialIndentLevel(1);
   EXPECT_TRUE(printer.PrintToString(message, &text));
   EXPECT_EQ(
-    "  repeated_string: \"abc\"\n"
-    "  repeated_string: \"def\"\n"
-    "  repeated_nested_message {\n"
-    "    bb: 123\n"
-    "  }\n",
-    text);
+      "  repeated_string: \"abc\"\n"
+      "  repeated_string: \"def\"\n"
+      "  repeated_nested_message {\n"
+      "    bb: 123\n"
+      "  }\n",
+      text);
 }
 
 TEST_F(TextFormatTest, PrintMessageSingleLine) {
@@ -391,9 +395,9 @@
   printer.SetSingleLineMode(true);
   EXPECT_TRUE(printer.PrintToString(message, &text));
   EXPECT_EQ(
-    "  repeated_string: \"abc\" repeated_string: \"def\" "
-    "repeated_nested_message { bb: 123 } ",
-    text);
+      "  repeated_string: \"abc\" repeated_string: \"def\" "
+      "repeated_nested_message { bb: 123 } ",
+      text);
 }
 
 TEST_F(TextFormatTest, PrintBufferTooSmall) {
@@ -778,8 +782,7 @@
   std::string parse_string =
       "optional_string: " + kEscapeTestStringEscaped + "\n";
 
-  io::ArrayInputStream input_stream(parse_string.data(),
-                                    parse_string.size());
+  io::ArrayInputStream input_stream(parse_string.data(), parse_string.size());
   TextFormat::Parse(&input_stream, &proto_);
 
   // Compare.
@@ -790,19 +793,18 @@
   // Create a parse string with multiple parts on one line.
   std::string parse_string = "optional_string: \"foo\" \"bar\"\n";
 
-  io::ArrayInputStream input_stream1(parse_string.data(),
-                                    parse_string.size());
+  io::ArrayInputStream input_stream1(parse_string.data(), parse_string.size());
   TextFormat::Parse(&input_stream1, &proto_);
 
   // Compare.
   EXPECT_EQ("foobar", proto_.optional_string());
 
   // Create a parse string with multiple parts on separate lines.
-  parse_string = "optional_string: \"foo\"\n"
-                 "\"bar\"\n";
+  parse_string =
+      "optional_string: \"foo\"\n"
+      "\"bar\"\n";
 
-  io::ArrayInputStream input_stream2(parse_string.data(),
-                                    parse_string.size());
+  io::ArrayInputStream input_stream2(parse_string.data(), parse_string.size());
   TextFormat::Parse(&input_stream2, &proto_);
 
   // Compare.
@@ -816,8 +818,7 @@
   // Have it parse a float with the 'f' suffix.
   std::string parse_string = "optional_float: 1.0f\n";
 
-  io::ArrayInputStream input_stream(parse_string.data(),
-                                    parse_string.size());
+  io::ArrayInputStream input_stream(parse_string.data(), parse_string.size());
 
   TextFormat::Parse(&input_stream, &proto_);
 
@@ -954,8 +955,7 @@
       "optional_int32: 1  # a comment\n"
       "optional_int64: 2  # another comment";
 
-  io::ArrayInputStream input_stream(parse_string.data(),
-                                    parse_string.size());
+  io::ArrayInputStream input_stream(parse_string.data(), parse_string.size());
 
   TextFormat::Parse(&input_stream, &proto_);
 
@@ -970,8 +970,7 @@
 
   std::string parse_string = "optional_nested_message: { bb: 1}\n";
 
-  io::ArrayInputStream input_stream(parse_string.data(),
-                                    parse_string.size());
+  io::ArrayInputStream input_stream(parse_string.data(), parse_string.size());
 
   TextFormat::Parse(&input_stream, &proto_);
 
@@ -1018,16 +1017,17 @@
   //   have this problem, so we switched to that instead.
 
   EXPECT_EQ(
-    "repeated_int64: -9223372036854775808\n"
-    "repeated_uint64: 18446744073709551615\n"
-    "repeated_double: 123.456\n"
-    "repeated_double: 1.23e+21\n"
-    "repeated_double: 1.23e-18\n"
-    "repeated_double: inf\n"
-    "repeated_double: -inf\n"
-    "repeated_double: nan\n"
-    "repeated_string: \"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\'\\\"\"\n",
-    RemoveRedundantZeros(message.DebugString()));
+      "repeated_int64: -9223372036854775808\n"
+      "repeated_uint64: 18446744073709551615\n"
+      "repeated_double: 123.456\n"
+      "repeated_double: 1.23e+21\n"
+      "repeated_double: 1.23e-18\n"
+      "repeated_double: inf\n"
+      "repeated_double: -inf\n"
+      "repeated_double: nan\n"
+      "repeated_string: "
+      "\"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\'\\\"\"\n",
+      RemoveRedundantZeros(message.DebugString()));
 }
 
 TEST_F(TextFormatTest, PrintFloatPrecision) {
@@ -1074,49 +1074,48 @@
   message.add_repeated_double(1.23456789876543e100);
 
   EXPECT_EQ(
-    "repeated_float: 1\n"
-    "repeated_float: 1.2\n"
-    "repeated_float: 1.23\n"
-    "repeated_float: 1.234\n"
-    "repeated_float: 1.2345\n"
-    "repeated_float: 1.23456\n"
-    "repeated_float: 1.2e+10\n"
-    "repeated_float: 1.23e+10\n"
-    "repeated_float: 1.234e+10\n"
-    "repeated_float: 1.2345e+10\n"
-    "repeated_float: 1.23456e+10\n"
-    "repeated_double: 1.2\n"
-    "repeated_double: 1.23\n"
-    "repeated_double: 1.234\n"
-    "repeated_double: 1.2345\n"
-    "repeated_double: 1.23456\n"
-    "repeated_double: 1.234567\n"
-    "repeated_double: 1.2345678\n"
-    "repeated_double: 1.23456789\n"
-    "repeated_double: 1.234567898\n"
-    "repeated_double: 1.2345678987\n"
-    "repeated_double: 1.23456789876\n"
-    "repeated_double: 1.234567898765\n"
-    "repeated_double: 1.2345678987654\n"
-    "repeated_double: 1.23456789876543\n"
-    "repeated_double: 1.2e+100\n"
-    "repeated_double: 1.23e+100\n"
-    "repeated_double: 1.234e+100\n"
-    "repeated_double: 1.2345e+100\n"
-    "repeated_double: 1.23456e+100\n"
-    "repeated_double: 1.234567e+100\n"
-    "repeated_double: 1.2345678e+100\n"
-    "repeated_double: 1.23456789e+100\n"
-    "repeated_double: 1.234567898e+100\n"
-    "repeated_double: 1.2345678987e+100\n"
-    "repeated_double: 1.23456789876e+100\n"
-    "repeated_double: 1.234567898765e+100\n"
-    "repeated_double: 1.2345678987654e+100\n"
-    "repeated_double: 1.23456789876543e+100\n",
-    RemoveRedundantZeros(message.DebugString()));
+      "repeated_float: 1\n"
+      "repeated_float: 1.2\n"
+      "repeated_float: 1.23\n"
+      "repeated_float: 1.234\n"
+      "repeated_float: 1.2345\n"
+      "repeated_float: 1.23456\n"
+      "repeated_float: 1.2e+10\n"
+      "repeated_float: 1.23e+10\n"
+      "repeated_float: 1.234e+10\n"
+      "repeated_float: 1.2345e+10\n"
+      "repeated_float: 1.23456e+10\n"
+      "repeated_double: 1.2\n"
+      "repeated_double: 1.23\n"
+      "repeated_double: 1.234\n"
+      "repeated_double: 1.2345\n"
+      "repeated_double: 1.23456\n"
+      "repeated_double: 1.234567\n"
+      "repeated_double: 1.2345678\n"
+      "repeated_double: 1.23456789\n"
+      "repeated_double: 1.234567898\n"
+      "repeated_double: 1.2345678987\n"
+      "repeated_double: 1.23456789876\n"
+      "repeated_double: 1.234567898765\n"
+      "repeated_double: 1.2345678987654\n"
+      "repeated_double: 1.23456789876543\n"
+      "repeated_double: 1.2e+100\n"
+      "repeated_double: 1.23e+100\n"
+      "repeated_double: 1.234e+100\n"
+      "repeated_double: 1.2345e+100\n"
+      "repeated_double: 1.23456e+100\n"
+      "repeated_double: 1.234567e+100\n"
+      "repeated_double: 1.2345678e+100\n"
+      "repeated_double: 1.23456789e+100\n"
+      "repeated_double: 1.234567898e+100\n"
+      "repeated_double: 1.2345678987e+100\n"
+      "repeated_double: 1.23456789876e+100\n"
+      "repeated_double: 1.234567898765e+100\n"
+      "repeated_double: 1.2345678987654e+100\n"
+      "repeated_double: 1.23456789876543e+100\n",
+      RemoveRedundantZeros(message.DebugString()));
 }
 
-
 TEST_F(TextFormatTest, AllowPartial) {
   unittest::TestRequired message;
   TextFormat::Parser parser;
@@ -1130,29 +1129,29 @@
 TEST_F(TextFormatTest, ParseExotic) {
   unittest::TestAllTypes message;
   ASSERT_TRUE(TextFormat::ParseFromString(
-    "repeated_int32: -1\n"
-    "repeated_int32: -2147483648\n"
-    "repeated_int64: -1\n"
-    "repeated_int64: -9223372036854775808\n"
-    "repeated_uint32: 4294967295\n"
-    "repeated_uint32: 2147483648\n"
-    "repeated_uint64: 18446744073709551615\n"
-    "repeated_uint64: 9223372036854775808\n"
-    "repeated_double: 123.0\n"
-    "repeated_double: 123.5\n"
-    "repeated_double: 0.125\n"
-    "repeated_double: 1.23E17\n"
-    "repeated_double: 1.235E+22\n"
-    "repeated_double: 1.235e-18\n"
-    "repeated_double: 123.456789\n"
-    "repeated_double: inf\n"
-    "repeated_double: Infinity\n"
-    "repeated_double: -inf\n"
-    "repeated_double: -Infinity\n"
-    "repeated_double: nan\n"
-    "repeated_double: NaN\n"
-    "repeated_string: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\"\n",
-    &message));
+      "repeated_int32: -1\n"
+      "repeated_int32: -2147483648\n"
+      "repeated_int64: -1\n"
+      "repeated_int64: -9223372036854775808\n"
+      "repeated_uint32: 4294967295\n"
+      "repeated_uint32: 2147483648\n"
+      "repeated_uint64: 18446744073709551615\n"
+      "repeated_uint64: 9223372036854775808\n"
+      "repeated_double: 123.0\n"
+      "repeated_double: 123.5\n"
+      "repeated_double: 0.125\n"
+      "repeated_double: 1.23E17\n"
+      "repeated_double: 1.235E+22\n"
+      "repeated_double: 1.235e-18\n"
+      "repeated_double: 123.456789\n"
+      "repeated_double: inf\n"
+      "repeated_double: Infinity\n"
+      "repeated_double: -inf\n"
+      "repeated_double: -Infinity\n"
+      "repeated_double: nan\n"
+      "repeated_double: NaN\n"
+      "repeated_string: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\"\n",
+      &message));
 
   ASSERT_EQ(2, message.repeated_int32_size());
   EXPECT_EQ(-1, message.repeated_int32(0));
@@ -1184,12 +1183,12 @@
             message.repeated_uint64(1));
 
   ASSERT_EQ(13, message.repeated_double_size());
-  EXPECT_EQ(123.0     , message.repeated_double(0));
-  EXPECT_EQ(123.5     , message.repeated_double(1));
-  EXPECT_EQ(0.125     , message.repeated_double(2));
-  EXPECT_EQ(1.23E17   , message.repeated_double(3));
-  EXPECT_EQ(1.235E22  , message.repeated_double(4));
-  EXPECT_EQ(1.235E-18 , message.repeated_double(5));
+  EXPECT_EQ(123.0, message.repeated_double(0));
+  EXPECT_EQ(123.5, message.repeated_double(1));
+  EXPECT_EQ(0.125, message.repeated_double(2));
+  EXPECT_EQ(1.23E17, message.repeated_double(3));
+  EXPECT_EQ(1.235E22, message.repeated_double(4));
+  EXPECT_EQ(1.235E-18, message.repeated_double(5));
   EXPECT_EQ(123.456789, message.repeated_double(6));
   EXPECT_EQ(message.repeated_double(7),
             std::numeric_limits<double>::infinity());
@@ -1207,14 +1206,26 @@
   ASSERT_EQ(1, message.repeated_string_size());
   EXPECT_EQ(std::string("\000\001\a\b\f\n\r\t\v\\\'\"", 12),
             message.repeated_string(0));
+
+  ASSERT_TRUE(
+      TextFormat::ParseFromString("repeated_float: 3.4028235e+38\n"
+                                  "repeated_float: -3.4028235e+38\n"
+                                  "repeated_float: 3.40282351e+38\n"
+                                  "repeated_float: -3.40282351e+38\n",
+                                  &message));
+  EXPECT_EQ(message.repeated_float(0), std::numeric_limits<float>::max());
+  EXPECT_EQ(message.repeated_float(1), -std::numeric_limits<float>::max());
+  EXPECT_EQ(message.repeated_float(2), std::numeric_limits<float>::infinity());
+  EXPECT_EQ(message.repeated_float(3), -std::numeric_limits<float>::infinity());
+
 }
 
 TEST_F(TextFormatTest, PrintFieldsInIndexOrder) {
   protobuf_unittest::TestFieldOrderings message;
   // Fields are listed in index order instead of field number.
-  message.set_my_string("str");           // Field number 11
-  message.set_my_int(12345);              // Field number 1
-  message.set_my_float(0.999);            // Field number 101
+  message.set_my_string("str");  // Field number 11
+  message.set_my_int(12345);     // Field number 1
+  message.set_my_float(0.999);   // Field number 101
   // Extensions are listed based on the order of extension number.
   // Extension number 12.
   message
@@ -1332,8 +1343,8 @@
   void ExpectLocation(TextFormat::ParseInfoTree* tree, const Descriptor* d,
                       const std::string& field_name, int index, int line,
                       int column) {
-    TextFormat::ParseLocation location = tree->GetLocation(
-        d->FindFieldByName(field_name), index);
+    TextFormat::ParseLocation location =
+        tree->GetLocation(d->FindFieldByName(field_name), index);
     EXPECT_EQ(line, location.line);
     EXPECT_EQ(column, location.column);
   }
@@ -1349,8 +1360,8 @@
 
     // implements ErrorCollector -------------------------------------
     void AddError(int line, int column, const std::string& message) {
-      strings::SubstituteAndAppend(&text_, "$0:$1: $2\n",
-                                   line + 1, column + 1, message);
+      strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", line + 1, column + 1,
+                                   message);
     }
 
     void AddWarning(int line, int column, const std::string& message) {
@@ -1429,33 +1440,33 @@
   std::unique_ptr<unittest::TestAllTypes> message(new unittest::TestAllTypes);
   const Descriptor* d = message->GetDescriptor();
 
-#define EXPECT_FIELD(name, value, valuestring) \
-  EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \
-    valuestring, d->FindFieldByName("optional_" #name), message.get())); \
-  EXPECT_EQ(value, message->optional_##name()); \
+#define EXPECT_FIELD(name, value, valuestring)                             \
+  EXPECT_TRUE(TextFormat::ParseFieldValueFromString(                       \
+      valuestring, d->FindFieldByName("optional_" #name), message.get())); \
+  EXPECT_EQ(value, message->optional_##name());                            \
   EXPECT_TRUE(message->has_optional_##name());
 
-#define EXPECT_BOOL_FIELD(name, value, valuestring) \
-  EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \
-    valuestring, d->FindFieldByName("optional_" #name), message.get())); \
-  EXPECT_TRUE(message->optional_##name() == value); \
+#define EXPECT_BOOL_FIELD(name, value, valuestring)                        \
+  EXPECT_TRUE(TextFormat::ParseFieldValueFromString(                       \
+      valuestring, d->FindFieldByName("optional_" #name), message.get())); \
+  EXPECT_TRUE(message->optional_##name() == value);                        \
   EXPECT_TRUE(message->has_optional_##name());
 
-#define EXPECT_FLOAT_FIELD(name, value, valuestring) \
-  EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \
-    valuestring, d->FindFieldByName("optional_" #name), message.get())); \
-  EXPECT_FLOAT_EQ(value, message->optional_##name()); \
+#define EXPECT_FLOAT_FIELD(name, value, valuestring)                       \
+  EXPECT_TRUE(TextFormat::ParseFieldValueFromString(                       \
+      valuestring, d->FindFieldByName("optional_" #name), message.get())); \
+  EXPECT_FLOAT_EQ(value, message->optional_##name());                      \
   EXPECT_TRUE(message->has_optional_##name());
 
-#define EXPECT_DOUBLE_FIELD(name, value, valuestring) \
-  EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \
-    valuestring, d->FindFieldByName("optional_" #name), message.get())); \
-  EXPECT_DOUBLE_EQ(value, message->optional_##name()); \
+#define EXPECT_DOUBLE_FIELD(name, value, valuestring)                      \
+  EXPECT_TRUE(TextFormat::ParseFieldValueFromString(                       \
+      valuestring, d->FindFieldByName("optional_" #name), message.get())); \
+  EXPECT_DOUBLE_EQ(value, message->optional_##name());                     \
   EXPECT_TRUE(message->has_optional_##name());
 
-#define EXPECT_INVALID(name, valuestring) \
+#define EXPECT_INVALID(name, valuestring)             \
   EXPECT_FALSE(TextFormat::ParseFieldValueFromString( \
-    valuestring, d->FindFieldByName("optional_" #name), message.get()));
+      valuestring, d->FindFieldByName("optional_" #name), message.get()));
 
   // int32
   EXPECT_FIELD(int32, 1, "1");
@@ -1545,8 +1556,8 @@
 
   // message
   EXPECT_TRUE(TextFormat::ParseFieldValueFromString(
-    "<bb:12>", d->FindFieldByName("optional_nested_message"), message.get()));
-  EXPECT_EQ(12, message->optional_nested_message().bb()); \
+      "<bb:12>", d->FindFieldByName("optional_nested_message"), message.get()));
+  EXPECT_EQ(12, message->optional_nested_message().bb());
   EXPECT_TRUE(message->has_optional_nested_message());
   EXPECT_INVALID(nested_message, "any");
 
@@ -1557,15 +1568,13 @@
 #undef EXPECT_INVALID
 }
 
-
 TEST_F(TextFormatParserTest, InvalidToken) {
-  ExpectFailure("optional_bool: true\n-5\n", "Expected identifier, got: -",
-                2, 1);
+  ExpectFailure("optional_bool: true\n-5\n", "Expected identifier, got: -", 2,
+                1);
 
-  ExpectFailure("optional_bool: true!\n", "Expected identifier, got: !", 1,
-                20);
-  ExpectFailure("\"some string\"",
-                "Expected identifier, got: \"some string\"", 1, 1);
+  ExpectFailure("optional_bool: true!\n", "Expected identifier, got: !", 1, 20);
+  ExpectFailure("\"some string\"", "Expected identifier, got: \"some string\"",
+                1, 1);
 }
 
 TEST_F(TextFormatParserTest, InvalidFieldName) {
@@ -1615,11 +1624,10 @@
   // Invalid values for a double/float field.
   ExpectFailure("optional_double: \"hello\"\n",
                 "Expected double, got: \"hello\"", 1, 18);
-  ExpectFailure("optional_double: true\n", "Expected double, got: true", 1,
-                18);
+  ExpectFailure("optional_double: true\n", "Expected double, got: true", 1, 18);
   ExpectFailure("optional_double: !\n", "Expected double, got: !", 1, 18);
-  ExpectFailure("optional_double {\n  \n}\n", "Expected \":\", found \"{\".",
-                1, 17);
+  ExpectFailure("optional_double {\n  \n}\n", "Expected \":\", found \"{\".", 1,
+                17);
 
   // Invalid values for a signed integer field.
   ExpectFailure("optional_int32: \"hello\"\n",
@@ -1627,8 +1635,8 @@
   ExpectFailure("optional_int32: true\n", "Expected integer, got: true", 1, 17);
   ExpectFailure("optional_int32: 4.5\n", "Expected integer, got: 4.5", 1, 17);
   ExpectFailure("optional_int32: !\n", "Expected integer, got: !", 1, 17);
-  ExpectFailure("optional_int32 {\n \n}\n", "Expected \":\", found \"{\".",
-                1, 16);
+  ExpectFailure("optional_int32 {\n \n}\n", "Expected \":\", found \"{\".", 1,
+                16);
   ExpectFailure("optional_int32: 0x80000000\n",
                 "Integer out of range (0x80000000)", 1, 17);
   ExpectFailure("optional_int64: 0x8000000000000000\n",
@@ -1641,13 +1649,13 @@
   // Invalid values for an unsigned integer field.
   ExpectFailure("optional_uint64: \"hello\"\n",
                 "Expected integer, got: \"hello\"", 1, 18);
-  ExpectFailure("optional_uint64: true\n",
-                "Expected integer, got: true", 1, 18);
+  ExpectFailure("optional_uint64: true\n", "Expected integer, got: true", 1,
+                18);
   ExpectFailure("optional_uint64: 4.5\n", "Expected integer, got: 4.5", 1, 18);
   ExpectFailure("optional_uint64: -5\n", "Expected integer, got: -", 1, 18);
   ExpectFailure("optional_uint64: !\n", "Expected integer, got: !", 1, 18);
-  ExpectFailure("optional_uint64 {\n \n}\n", "Expected \":\", found \"{\".",
-                1, 17);
+  ExpectFailure("optional_uint64 {\n \n}\n", "Expected \":\", found \"{\".", 1,
+                17);
   ExpectFailure("optional_uint32: 0x100000000\n",
                 "Integer out of range (0x100000000)", 1, 18);
   ExpectFailure("optional_uint64: 0x10000000000000000\n",
@@ -1662,19 +1670,19 @@
 
   ExpectFailure(
       "optional_bool: meh\n",
-      "Invalid value for boolean field \"optional_bool\". Value: \"meh\".",
-      2, 1);
+      "Invalid value for boolean field \"optional_bool\". Value: \"meh\".", 2,
+      1);
 
-  ExpectFailure("optional_bool {\n \n}\n", "Expected \":\", found \"{\".",
-                1, 15);
+  ExpectFailure("optional_bool {\n \n}\n", "Expected \":\", found \"{\".", 1,
+                15);
 
   // Invalid values for a string field.
   ExpectFailure("optional_string: true\n", "Expected string, got: true", 1, 18);
   ExpectFailure("optional_string: 5\n", "Expected string, got: 5", 1, 18);
   ExpectFailure("optional_string: -7.5\n", "Expected string, got: -", 1, 18);
   ExpectFailure("optional_string: !\n", "Expected string, got: !", 1, 18);
-  ExpectFailure("optional_string {\n \n}\n", "Expected \":\", found \"{\".",
-                1, 17);
+  ExpectFailure("optional_string {\n \n}\n", "Expected \":\", found \"{\".", 1,
+                17);
 
   // Invalid values for an enumeration field.
   ExpectFailure("optional_nested_enum: \"hello\"\n",
@@ -1683,7 +1691,8 @@
   // Valid token, but enum value is not defined.
   ExpectFailure("optional_nested_enum: 5\n",
                 "Unknown enumeration value of \"5\" for field "
-                "\"optional_nested_enum\".", 2, 1);
+                "\"optional_nested_enum\".",
+                2, 1);
   // We consume the negative sign, so the error position starts one character
   // later.
   ExpectFailure("optional_nested_enum: -7.5\n", "Expected integer, got: 7.5", 1,
@@ -1691,29 +1700,27 @@
   ExpectFailure("optional_nested_enum: !\n",
                 "Expected integer or identifier, got: !", 1, 23);
 
-  ExpectFailure(
-      "optional_nested_enum: grah\n",
-      "Unknown enumeration value of \"grah\" for field "
-      "\"optional_nested_enum\".", 2, 1);
+  ExpectFailure("optional_nested_enum: grah\n",
+                "Unknown enumeration value of \"grah\" for field "
+                "\"optional_nested_enum\".",
+                2, 1);
 
-  ExpectFailure(
-      "optional_nested_enum {\n \n}\n",
-      "Expected \":\", found \"{\".", 1, 22);
+  ExpectFailure("optional_nested_enum {\n \n}\n",
+                "Expected \":\", found \"{\".", 1, 22);
 }
 
 TEST_F(TextFormatParserTest, MessageDelimiters) {
   // Non-matching delimiters.
-  ExpectFailure("OptionalGroup <\n \n}\n", "Expected \">\", found \"}\".",
-                3, 1);
+  ExpectFailure("OptionalGroup <\n \n}\n", "Expected \">\", found \"}\".", 3,
+                1);
 
   // Invalid delimiters.
-  ExpectFailure("OptionalGroup [\n \n]\n", "Expected \"{\", found \"[\".",
-                1, 15);
+  ExpectFailure("OptionalGroup [\n \n]\n", "Expected \"{\", found \"[\".", 1,
+                15);
 
   // Unending message.
   ExpectFailure("optional_nested_message {\n \nbb: 118\n",
-                "Expected identifier, got: ",
-                4, 1);
+                "Expected identifier, got: ", 4, 1);
 }
 
 TEST_F(TextFormatParserTest, UnknownExtension) {
@@ -1726,23 +1733,22 @@
 
 TEST_F(TextFormatParserTest, MissingRequired) {
   unittest::TestRequired message;
-  ExpectFailure("a: 1",
-                "Message missing required fields: b, c",
-                0, 1, &message);
+  ExpectFailure("a: 1", "Message missing required fields: b, c", 0, 1,
+                &message);
 }
 
 TEST_F(TextFormatParserTest, ParseDuplicateRequired) {
   unittest::TestRequired message;
   ExpectFailure("a: 1 b: 2 c: 3 a: 1",
-                "Non-repeated field \"a\" is specified multiple times.",
-                1, 17, &message);
+                "Non-repeated field \"a\" is specified multiple times.", 1, 17,
+                &message);
 }
 
 TEST_F(TextFormatParserTest, ParseDuplicateOptional) {
   unittest::ForeignMessage message;
   ExpectFailure("c: 1 c: 2",
-                "Non-repeated field \"c\" is specified multiple times.",
-                1, 7, &message);
+                "Non-repeated field \"c\" is specified multiple times.", 1, 7,
+                &message);
 }
 
 TEST_F(TextFormatParserTest, MergeDuplicateRequired) {
@@ -1778,10 +1784,11 @@
   }
 
   ASSERT_EQ(1, errors.size());
-  EXPECT_EQ("Error parsing text-format protobuf_unittest.TestAllTypes: "
-            "1:14: Message type \"protobuf_unittest.TestAllTypes\" has no field "
-            "named \"no_such_field\".",
-            errors[0]);
+  EXPECT_EQ(
+      "Error parsing text-format protobuf_unittest.TestAllTypes: "
+      "1:14: Message type \"protobuf_unittest.TestAllTypes\" has no field "
+      "named \"no_such_field\".",
+      errors[0]);
 }
 
 TEST_F(TextFormatParserTest, FailsOnTokenizationError) {
@@ -1795,16 +1802,18 @@
   }
 
   ASSERT_EQ(1, errors.size());
-  EXPECT_EQ("Error parsing text-format protobuf_unittest.TestAllTypes: "
-            "1:1: Invalid control characters encountered in text.",
-            errors[0]);
+  EXPECT_EQ(
+      "Error parsing text-format protobuf_unittest.TestAllTypes: "
+      "1:1: Invalid control characters encountered in text.",
+      errors[0]);
 }
 
 TEST_F(TextFormatParserTest, ParseDeprecatedField) {
   unittest::TestDeprecatedFields message;
   ExpectMessage("deprecated_int32: 42",
                 "WARNING:text format contains deprecated field "
-                "\"deprecated_int32\"", 1, 21, &message, true);
+                "\"deprecated_int32\"",
+                1, 21, &message, true);
 }
 
 TEST_F(TextFormatParserTest, SetRecursionLimit) {
@@ -1828,25 +1837,24 @@
   static const char proto_debug_string_[];
 };
 const char TextFormatMessageSetTest::proto_debug_string_[] =
-"message_set {\n"
-"  [protobuf_unittest.TestMessageSetExtension1] {\n"
-"    i: 23\n"
-"  }\n"
-"  [protobuf_unittest.TestMessageSetExtension2] {\n"
-"    str: \"foo\"\n"
-"  }\n"
-"}\n";
-
+    "message_set {\n"
+    "  [protobuf_unittest.TestMessageSetExtension1] {\n"
+    "    i: 23\n"
+    "  }\n"
+    "  [protobuf_unittest.TestMessageSetExtension2] {\n"
+    "    str: \"foo\"\n"
+    "  }\n"
+    "}\n";
 
 TEST_F(TextFormatMessageSetTest, Serialize) {
   protobuf_unittest::TestMessageSetContainer proto;
   protobuf_unittest::TestMessageSetExtension1* item_a =
-    proto.mutable_message_set()->MutableExtension(
-      protobuf_unittest::TestMessageSetExtension1::message_set_extension);
+      proto.mutable_message_set()->MutableExtension(
+          protobuf_unittest::TestMessageSetExtension1::message_set_extension);
   item_a->set_i(23);
   protobuf_unittest::TestMessageSetExtension2* item_b =
-    proto.mutable_message_set()->MutableExtension(
-      protobuf_unittest::TestMessageSetExtension2::message_set_extension);
+      proto.mutable_message_set()->MutableExtension(
+          protobuf_unittest::TestMessageSetExtension2::message_set_extension);
   item_b->set_str("foo");
   EXPECT_EQ(proto_debug_string_, proto.DebugString());
 }
@@ -1854,18 +1862,165 @@
 TEST_F(TextFormatMessageSetTest, Deserialize) {
   protobuf_unittest::TestMessageSetContainer proto;
   ASSERT_TRUE(TextFormat::ParseFromString(proto_debug_string_, &proto));
-  EXPECT_EQ(23, proto.message_set().GetExtension(
-    protobuf_unittest::TestMessageSetExtension1::message_set_extension).i());
-  EXPECT_EQ("foo", proto.message_set().GetExtension(
-    protobuf_unittest::TestMessageSetExtension2::message_set_extension).str());
+  EXPECT_EQ(
+      23,
+      proto.message_set()
+          .GetExtension(
+              protobuf_unittest::TestMessageSetExtension1::message_set_extension)
+          .i());
+  EXPECT_EQ(
+      "foo",
+      proto.message_set()
+          .GetExtension(
+              protobuf_unittest::TestMessageSetExtension2::message_set_extension)
+          .str());
 
   // Ensure that these are the only entries present.
   std::vector<const FieldDescriptor*> descriptors;
-  proto.message_set().GetReflection()->ListFields(
-    proto.message_set(), &descriptors);
+  proto.message_set().GetReflection()->ListFields(proto.message_set(),
+                                                  &descriptors);
   EXPECT_EQ(2, descriptors.size());
 }
 
+TEST(TextFormatUnknownFieldTest, TestUnknownField) {
+  protobuf_unittest::TestAllTypes proto;
+  TextFormat::Parser parser;
+  // Unknown field is not permitted by default.
+  EXPECT_FALSE(parser.ParseFromString("unknown_field: 12345", &proto));
+  EXPECT_FALSE(parser.ParseFromString("12345678: 12345", &proto));
+
+  parser.AllowUnknownField(true);
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: 12345", &proto));
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: -12345", &proto));
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: 1.2345", &proto));
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: -1.2345", &proto));
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: 1.2345f", &proto));
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: -1.2345f", &proto));
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: inf", &proto));
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: -inf", &proto));
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: TYPE_STRING", &proto));
+  EXPECT_TRUE(
+      parser.ParseFromString("unknown_field: \"string value\"", &proto));
+  // Invalid field value
+  EXPECT_FALSE(parser.ParseFromString("unknown_field: -TYPE_STRING", &proto));
+  // Two or more unknown fields
+  EXPECT_TRUE(
+      parser.ParseFromString("unknown_field1: TYPE_STRING\n"
+                             "unknown_field2: 12345",
+                             &proto));
+  // Unknown nested message
+  EXPECT_TRUE(
+      parser.ParseFromString("unknown_message1: {}\n"
+                             "unknown_message2 {\n"
+                             "  unknown_field: 12345\n"
+                             "}\n"
+                             "unknown_message3 <\n"
+                             "  unknown_nested_message {\n"
+                             "    unknown_field: 12345\n"
+                             "  }\n"
+                             ">",
+                             &proto));
+  // Unmatched delimeters for message body
+  EXPECT_FALSE(parser.ParseFromString("unknown_message: {>", &proto));
+  // Unknown extension
+  EXPECT_TRUE(
+      parser.ParseFromString("[somewhere.unknown_extension1]: 12345\n"
+                             "[somewhere.unknown_extension2] {\n"
+                             "  unknown_field: 12345\n"
+                             "}",
+                             &proto));
+  // Unknown fields between known fields
+  ASSERT_TRUE(
+      parser.ParseFromString("optional_int32: 1\n"
+                             "unknown_field: 12345\n"
+                             "optional_string: \"string\"\n"
+                             "unknown_message { unknown: 0 }\n"
+                             "optional_nested_message { bb: 2 }",
+                             &proto));
+  EXPECT_EQ(1, proto.optional_int32());
+  EXPECT_EQ("string", proto.optional_string());
+  EXPECT_EQ(2, proto.optional_nested_message().bb());
+
+  // Unknown field with numeric tag number instead of identifier.
+  EXPECT_TRUE(parser.ParseFromString("12345678: 12345", &proto));
+
+  // Nested unknown extensions.
+  EXPECT_TRUE(
+      parser.ParseFromString("[test.extension1] <\n"
+                             "  unknown_nested_message <\n"
+                             "    [test.extension2] <\n"
+                             "      unknown_field: 12345\n"
+                             "    >\n"
+                             "  >\n"
+                             ">",
+                             &proto));
+  EXPECT_TRUE(
+      parser.ParseFromString("[test.extension1] {\n"
+                             "  unknown_nested_message {\n"
+                             "    [test.extension2] {\n"
+                             "      unknown_field: 12345\n"
+                             "    }\n"
+                             "  }\n"
+                             "}",
+                             &proto));
+  EXPECT_TRUE(
+      parser.ParseFromString("[test.extension1] <\n"
+                             "  some_unknown_fields: <\n"
+                             "    unknown_field: 12345\n"
+                             "  >\n"
+                             ">",
+                             &proto));
+  EXPECT_TRUE(
+      parser.ParseFromString("[test.extension1] {\n"
+                             "  some_unknown_fields: {\n"
+                             "    unknown_field: 12345\n"
+                             "  }\n"
+                             "}",
+                             &proto));
+
+  // Unknown field with compact repetition.
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: [1, 2]", &proto));
+  // Unknown field with compact repetition of some unknown enum.
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: [VAL1, VAL2]", &proto));
+  // Unknown field with compact repetition with sub-message.
+  EXPECT_TRUE(parser.ParseFromString("unknown_field: [{a:1}, <b:2>]", &proto));
+}
+
+TEST(TextFormatUnknownFieldTest, TestAnyInUnknownField) {
+  protobuf_unittest::TestAllTypes proto;
+  TextFormat::Parser parser;
+  parser.AllowUnknownField(true);
+  EXPECT_TRUE(
+      parser.ParseFromString("unknown {\n"
+                             "  [type.googleapis.com/foo.bar] {\n"
+                             "  }\n"
+                             "}",
+                             &proto));
+}
+
+TEST(TextFormatUnknownFieldTest, TestUnknownExtension) {
+  protobuf_unittest::TestAllTypes proto;
+  TextFormat::Parser parser;
+  std::string message_with_ext =
+      "[test.extension1] {\n"
+      "  some_unknown_fields: {\n"
+      "    unknown_field: 12345\n"
+      "  }\n"
+      "}";
+  // Unknown extensions are not permitted by default.
+  EXPECT_FALSE(parser.ParseFromString(message_with_ext, &proto));
+  // AllowUnknownField implies AllowUnknownExtension.
+  parser.AllowUnknownField(true);
+  EXPECT_TRUE(parser.ParseFromString(message_with_ext, &proto));
+
+  parser.AllowUnknownField(false);
+  EXPECT_FALSE(parser.ParseFromString(message_with_ext, &proto));
+  parser.AllowUnknownExtension(true);
+  EXPECT_TRUE(parser.ParseFromString(message_with_ext, &proto));
+  // Unknown fields are still not accepted.
+  EXPECT_FALSE(parser.ParseFromString("unknown_field: 1", &proto));
+}
+
 
 }  // namespace text_format_unittest
 }  // namespace protobuf
diff --git a/src/google/protobuf/timestamp.pb.cc b/src/google/protobuf/timestamp.pb.cc
index 091caa5..6ec5991 100644
--- a/src/google/protobuf/timestamp.pb.cc
+++ b/src/google/protobuf/timestamp.pb.cc
@@ -36,10 +36,6 @@
 PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_Timestamp_google_2fprotobuf_2ftimestamp_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsTimestamp_google_2fprotobuf_2ftimestamp_2eproto}, {}};
 
-void InitDefaults_google_2fprotobuf_2ftimestamp_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Timestamp_google_2fprotobuf_2ftimestamp_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2ftimestamp_2eproto[1];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2ftimestamp_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2ftimestamp_2eproto = nullptr;
@@ -76,8 +72,7 @@
   "Protobuf.WellKnownTypesb\006proto3"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2ftimestamp_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2ftimestamp_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2ftimestamp_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2ftimestamp_2eproto,
   "google/protobuf/timestamp.proto", &assign_descriptors_table_google_2fprotobuf_2ftimestamp_2eproto, 231,
 };
 
@@ -85,6 +80,7 @@
   static constexpr ::PROTOBUF_NAMESPACE_ID::internal::InitFunc deps[1] =
   {
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Timestamp_google_2fprotobuf_2ftimestamp_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2ftimestamp_2eproto, deps, 0);
 }
 
@@ -171,39 +167,45 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Timestamp::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // int64 seconds = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_seconds(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        seconds_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // int32 nanos = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_nanos(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        nanos_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Timestamp::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/timestamp.proto b/src/google/protobuf/timestamp.proto
index 2b9e26a..cd35786 100644
--- a/src/google/protobuf/timestamp.proto
+++ b/src/google/protobuf/timestamp.proto
@@ -113,17 +113,18 @@
 // 01:30 UTC on January 15, 2017.
 //
 // In JavaScript, one can convert a Date object to this format using the
-// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
+// standard
+// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
 // method. In Python, a standard `datetime.datetime` object can be converted
-// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime)
-// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one
-// can use the Joda Time's [`ISODateTimeFormat.dateTime()`](
+// to this format using
+// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
+// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
+// the Joda Time's [`ISODateTimeFormat.dateTime()`](
 // http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D
 // ) to obtain a formatter capable of generating timestamps in this format.
 //
 //
 message Timestamp {
-
   // Represents seconds of UTC time since Unix epoch
   // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
   // 9999-12-31T23:59:59Z inclusive.
diff --git a/src/google/protobuf/type.pb.cc b/src/google/protobuf/type.pb.cc
index f30839c..d75b30a 100644
--- a/src/google/protobuf/type.pb.cc
+++ b/src/google/protobuf/type.pb.cc
@@ -122,14 +122,6 @@
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsOption_google_2fprotobuf_2ftype_2eproto}, {
       &scc_info_Any_google_2fprotobuf_2fany_2eproto.base,}};
 
-void InitDefaults_google_2fprotobuf_2ftype_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Type_google_2fprotobuf_2ftype_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Field_google_2fprotobuf_2ftype_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Enum_google_2fprotobuf_2ftype_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumValue_google_2fprotobuf_2ftype_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Option_google_2fprotobuf_2ftype_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2ftype_2eproto[5];
 static const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* file_level_enum_descriptors_google_2fprotobuf_2ftype_2eproto[3];
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2ftype_2eproto = nullptr;
@@ -252,8 +244,7 @@
   "le.Protobuf.WellKnownTypesb\006proto3"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2ftype_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2ftype_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2ftype_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2ftype_2eproto,
   "google/protobuf/type.proto", &assign_descriptors_table_google_2fprotobuf_2ftype_2eproto, 1594,
 };
 
@@ -263,6 +254,11 @@
     ::AddDescriptors_google_2fprotobuf_2fany_2eproto,
     ::AddDescriptors_google_2fprotobuf_2fsource_5fcontext_2eproto,
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Type_google_2fprotobuf_2ftype_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Field_google_2fprotobuf_2ftype_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Enum_google_2fprotobuf_2ftype_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_EnumValue_google_2fprotobuf_2ftype_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Option_google_2fprotobuf_2ftype_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2ftype_2eproto, deps, 2);
 }
 
@@ -498,61 +494,68 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Type::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_name(), ptr, ctx, "google.protobuf.Type.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.Field fields = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_fields(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 18 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 18) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated string oneofs = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(add_oneofs(), ptr, ctx, "google.protobuf.Type.oneofs");
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 26 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 26) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.Option options = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_options(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 34 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 34) break;
+          ptr += 1;
+        }
         break;
       }
       // .google.protobuf.SourceContext source_context = 5;
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 42) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_source_context(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // .google.protobuf.Syntax syntax = 6;
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 48) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         set_syntax(static_cast<PROTOBUF_NAMESPACE_ID::Syntax>(val));
         break;
       }
@@ -560,15 +563,20 @@
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Type::MergePartialFromCodedStream(
@@ -1090,17 +1098,18 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Field::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // .google.protobuf.Field.Kind kind = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         set_kind(static_cast<PROTOBUF_NAMESPACE_ID::Field_Kind>(val));
         break;
       }
@@ -1108,82 +1117,89 @@
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         set_cardinality(static_cast<PROTOBUF_NAMESPACE_ID::Field_Cardinality>(val));
         break;
       }
       // int32 number = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 24) goto handle_unusual;
-        set_number(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        number_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // string name = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_name(), ptr, ctx, "google.protobuf.Field.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // string type_url = 6;
       case 6: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 50) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_type_url(), ptr, ctx, "google.protobuf.Field.type_url");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // int32 oneof_index = 7;
       case 7: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 56) goto handle_unusual;
-        set_oneof_index(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        oneof_index_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // bool packed = 8;
       case 8: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 64) goto handle_unusual;
-        set_packed(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        packed_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.Option options = 9;
       case 9: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 74) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_options(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 74 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 74) break;
+          ptr += 1;
+        }
         break;
       }
       // string json_name = 10;
       case 10: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 82) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_json_name(), ptr, ctx, "google.protobuf.Field.json_name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // string default_value = 11;
       case 11: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 90) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_default_value(), ptr, ctx, "google.protobuf.Field.default_value");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Field::MergePartialFromCodedStream(
@@ -1869,51 +1885,56 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Enum::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_name(), ptr, ctx, "google.protobuf.Enum.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.EnumValue enumvalue = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_enumvalue(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 18 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 18) break;
+          ptr += 1;
+        }
         break;
       }
       // repeated .google.protobuf.Option options = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_options(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 26 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 26) break;
+          ptr += 1;
+        }
         break;
       }
       // .google.protobuf.SourceContext source_context = 4;
       case 4: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 34) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_source_context(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // .google.protobuf.Syntax syntax = 5;
       case 5: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 40) goto handle_unusual;
         ::PROTOBUF_NAMESPACE_ID::uint64 val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         set_syntax(static_cast<PROTOBUF_NAMESPACE_ID::Syntax>(val));
         break;
       }
@@ -1921,15 +1942,20 @@
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Enum::MergePartialFromCodedStream(
@@ -2368,49 +2394,57 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* EnumValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_name(), ptr, ctx, "google.protobuf.EnumValue.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // int32 number = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 16) goto handle_unusual;
-        set_number(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        number_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       // repeated .google.protobuf.Option options = 3;
       case 3: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 26) goto handle_unusual;
-        do {
+        while (true) {
           ptr = ctx->ParseMessage(add_options(), ptr);
-          GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
-          if (ctx->Done(&ptr)) return ptr;
-        } while ((::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint64>(ptr) & 255) == 26 && (ptr += 1));
+          CHK_(ptr);
+          if (!ctx->DataAvailable(ptr)) break;
+          if (::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<::PROTOBUF_NAMESPACE_ID::uint8>(ptr) != 26) break;
+          ptr += 1;
+        }
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool EnumValue::MergePartialFromCodedStream(
@@ -2801,39 +2835,45 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Option::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // string name = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_name(), ptr, ctx, "google.protobuf.Option.name");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       // .google.protobuf.Any value = 2;
       case 2: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 18) goto handle_unusual;
         ptr = ctx->ParseMessage(mutable_value(), ptr);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Option::MergePartialFromCodedStream(
diff --git a/src/google/protobuf/type.pb.h b/src/google/protobuf/type.pb.h
index 7e57a50..262c41c 100644
--- a/src/google/protobuf/type.pb.h
+++ b/src/google/protobuf/type.pb.h
@@ -82,7 +82,7 @@
 PROTOBUF_NAMESPACE_CLOSE
 PROTOBUF_NAMESPACE_OPEN
 
-enum Field_Kind {
+enum Field_Kind : int {
   Field_Kind_TYPE_UNKNOWN = 0,
   Field_Kind_TYPE_DOUBLE = 1,
   Field_Kind_TYPE_FLOAT = 2,
@@ -111,16 +111,20 @@
 constexpr int Field_Kind_Kind_ARRAYSIZE = Field_Kind_Kind_MAX + 1;
 
 PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Field_Kind_descriptor();
-inline const std::string& Field_Kind_Name(Field_Kind value) {
+template<typename T>
+inline const std::string& Field_Kind_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, Field_Kind>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function Field_Kind_Name.");
   return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    Field_Kind_descriptor(), value);
+    Field_Kind_descriptor(), enum_t_value);
 }
 inline bool Field_Kind_Parse(
     const std::string& name, Field_Kind* value) {
   return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<Field_Kind>(
     Field_Kind_descriptor(), name, value);
 }
-enum Field_Cardinality {
+enum Field_Cardinality : int {
   Field_Cardinality_CARDINALITY_UNKNOWN = 0,
   Field_Cardinality_CARDINALITY_OPTIONAL = 1,
   Field_Cardinality_CARDINALITY_REQUIRED = 2,
@@ -134,16 +138,20 @@
 constexpr int Field_Cardinality_Cardinality_ARRAYSIZE = Field_Cardinality_Cardinality_MAX + 1;
 
 PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Field_Cardinality_descriptor();
-inline const std::string& Field_Cardinality_Name(Field_Cardinality value) {
+template<typename T>
+inline const std::string& Field_Cardinality_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, Field_Cardinality>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function Field_Cardinality_Name.");
   return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    Field_Cardinality_descriptor(), value);
+    Field_Cardinality_descriptor(), enum_t_value);
 }
 inline bool Field_Cardinality_Parse(
     const std::string& name, Field_Cardinality* value) {
   return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum<Field_Cardinality>(
     Field_Cardinality_descriptor(), name, value);
 }
-enum Syntax {
+enum Syntax : int {
   SYNTAX_PROTO2 = 0,
   SYNTAX_PROTO3 = 1,
   Syntax_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(),
@@ -155,9 +163,13 @@
 constexpr int Syntax_ARRAYSIZE = Syntax_MAX + 1;
 
 PROTOBUF_EXPORT const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* Syntax_descriptor();
-inline const std::string& Syntax_Name(Syntax value) {
+template<typename T>
+inline const std::string& Syntax_Name(T enum_t_value) {
+  static_assert(::std::is_same<T, Syntax>::value ||
+    ::std::is_integral<T>::value,
+    "Incorrect type passed to function Syntax_Name.");
   return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum(
-    Syntax_descriptor(), value);
+    Syntax_descriptor(), enum_t_value);
 }
 inline bool Syntax_Parse(
     const std::string& name, Syntax* value) {
@@ -532,8 +544,12 @@
   Kind_descriptor() {
     return Field_Kind_descriptor();
   }
-  static inline const std::string& Kind_Name(Kind value) {
-    return Field_Kind_Name(value);
+  template<typename T>
+  static inline const std::string& Kind_Name(T enum_t_value) {
+    static_assert(::std::is_same<T, Kind>::value ||
+      ::std::is_integral<T>::value,
+      "Incorrect type passed to function Kind_Name.");
+    return Field_Kind_Name(enum_t_value);
   }
   static inline bool Kind_Parse(const std::string& name,
       Kind* value) {
@@ -562,8 +578,12 @@
   Cardinality_descriptor() {
     return Field_Cardinality_descriptor();
   }
-  static inline const std::string& Cardinality_Name(Cardinality value) {
-    return Field_Cardinality_Name(value);
+  template<typename T>
+  static inline const std::string& Cardinality_Name(T enum_t_value) {
+    static_assert(::std::is_same<T, Cardinality>::value ||
+      ::std::is_integral<T>::value,
+      "Incorrect type passed to function Cardinality_Name.");
+    return Field_Cardinality_Name(enum_t_value);
   }
   static inline bool Cardinality_Parse(const std::string& name,
       Cardinality* value) {
diff --git a/src/google/protobuf/type.proto b/src/google/protobuf/type.proto
index 624c15e..e4b1d3a 100644
--- a/src/google/protobuf/type.proto
+++ b/src/google/protobuf/type.proto
@@ -64,44 +64,44 @@
   // Basic field types.
   enum Kind {
     // Field type unknown.
-    TYPE_UNKNOWN        = 0;
+    TYPE_UNKNOWN = 0;
     // Field type double.
-    TYPE_DOUBLE         = 1;
+    TYPE_DOUBLE = 1;
     // Field type float.
-    TYPE_FLOAT          = 2;
+    TYPE_FLOAT = 2;
     // Field type int64.
-    TYPE_INT64          = 3;
+    TYPE_INT64 = 3;
     // Field type uint64.
-    TYPE_UINT64         = 4;
+    TYPE_UINT64 = 4;
     // Field type int32.
-    TYPE_INT32          = 5;
+    TYPE_INT32 = 5;
     // Field type fixed64.
-    TYPE_FIXED64        = 6;
+    TYPE_FIXED64 = 6;
     // Field type fixed32.
-    TYPE_FIXED32        = 7;
+    TYPE_FIXED32 = 7;
     // Field type bool.
-    TYPE_BOOL           = 8;
+    TYPE_BOOL = 8;
     // Field type string.
-    TYPE_STRING         = 9;
+    TYPE_STRING = 9;
     // Field type group. Proto2 syntax only, and deprecated.
-    TYPE_GROUP          = 10;
+    TYPE_GROUP = 10;
     // Field type message.
-    TYPE_MESSAGE        = 11;
+    TYPE_MESSAGE = 11;
     // Field type bytes.
-    TYPE_BYTES          = 12;
+    TYPE_BYTES = 12;
     // Field type uint32.
-    TYPE_UINT32         = 13;
+    TYPE_UINT32 = 13;
     // Field type enum.
-    TYPE_ENUM           = 14;
+    TYPE_ENUM = 14;
     // Field type sfixed32.
-    TYPE_SFIXED32       = 15;
+    TYPE_SFIXED32 = 15;
     // Field type sfixed64.
-    TYPE_SFIXED64       = 16;
+    TYPE_SFIXED64 = 16;
     // Field type sint32.
-    TYPE_SINT32         = 17;
+    TYPE_SINT32 = 17;
     // Field type sint64.
-    TYPE_SINT64         = 18;
-  };
+    TYPE_SINT64 = 18;
+  }
 
   // Whether a field is optional, required, or repeated.
   enum Cardinality {
diff --git a/src/google/protobuf/unknown_field_set.h b/src/google/protobuf/unknown_field_set.h
index 0d61f89..4d5cc06 100644
--- a/src/google/protobuf/unknown_field_set.h
+++ b/src/google/protobuf/unknown_field_set.h
@@ -56,20 +56,20 @@
 
 namespace google {
 namespace protobuf {
-  namespace io {
-    class CodedInputStream;         // coded_stream.h
-    class CodedOutputStream;        // coded_stream.h
-    class ZeroCopyInputStream;      // zero_copy_stream.h
-  }
-  namespace internal {
-    class InternalMetadataWithArena;  // metadata.h
-    class WireFormat;               // wire_format.h
-    class MessageSetFieldSkipperUsingCord;
-                                    // extension_set_heavy.cc
-  }
+namespace io {
+class CodedInputStream;     // coded_stream.h
+class CodedOutputStream;    // coded_stream.h
+class ZeroCopyInputStream;  // zero_copy_stream.h
+}  // namespace io
+namespace internal {
+class InternalMetadataWithArena;  // metadata.h
+class WireFormat;                 // wire_format.h
+class MessageSetFieldSkipperUsingCord;
+// extension_set_heavy.cc
+}  // namespace internal
 
-class Message;                      // message.h
-class UnknownField;                 // below
+class Message;       // message.h
+class UnknownField;  // below
 
 // An UnknownFieldSet contains fields that were encountered while parsing a
 // message but were not defined by its type.  Keeping track of these can be
@@ -125,9 +125,7 @@
   // Version of SpaceUsed() including sizeof(*this).
   size_t SpaceUsedLong() const;
 
-  int SpaceUsed() const {
-    return internal::ToIntSize(SpaceUsedLong());
-  }
+  int SpaceUsed() const { return internal::ToIntSize(SpaceUsedLong()); }
 
   // Returns the number of fields present in the UnknownFieldSet.
   inline int field_count() const;
@@ -172,6 +170,7 @@
   }
 
   static const UnknownFieldSet* default_instance();
+
  private:
   // For InternalMergeFrom
   friend class UnknownField;
@@ -302,9 +301,7 @@
   }
 }
 
-inline bool UnknownFieldSet::empty() const {
-  return fields_.empty();
-}
+inline bool UnknownFieldSet::empty() const { return fields_.empty(); }
 
 inline void UnknownFieldSet::Swap(UnknownFieldSet* x) {
   fields_.swap(x->fields_);
diff --git a/src/google/protobuf/unknown_field_set_unittest.cc b/src/google/protobuf/unknown_field_set_unittest.cc
index 771413d..6d76b67 100644
--- a/src/google/protobuf/unknown_field_set_unittest.cc
+++ b/src/google/protobuf/unknown_field_set_unittest.cc
@@ -35,14 +35,14 @@
 // This test is testing a lot more than just the UnknownFieldSet class.  It
 // tests handling of unknown fields throughout the system.
 
-#include <google/protobuf/stubs/mutex.h>
 #include <google/protobuf/unknown_field_set.h>
-#include <google/protobuf/descriptor.h>
+#include <google/protobuf/test_util.h>
+#include <google/protobuf/unittest.pb.h>
 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <google/protobuf/descriptor.h>
+#include <google/protobuf/stubs/mutex.h>
 #include <google/protobuf/wire_format.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/test_util.h>
 
 #include <google/protobuf/stubs/callback.h>
 #include <google/protobuf/stubs/common.h>
@@ -85,7 +85,7 @@
   std::string GetBizarroData() {
     unittest::TestEmptyMessage bizarro_message;
     UnknownFieldSet* bizarro_unknown_fields =
-      bizarro_message.mutable_unknown_fields();
+        bizarro_message.mutable_unknown_fields();
     for (int i = 0; i < unknown_fields_->field_count(); i++) {
       const UnknownField& unknown_field = unknown_fields_->field(i);
       if (unknown_field.type() == UnknownField::TYPE_VARINT) {
@@ -180,7 +180,7 @@
 
   const UnknownField& nested_field = field->group().field(0);
   const FieldDescriptor* nested_field_descriptor =
-    unittest::TestAllTypes::OptionalGroup::descriptor()->FindFieldByName("a");
+      unittest::TestAllTypes::OptionalGroup::descriptor()->FindFieldByName("a");
   ASSERT_TRUE(nested_field_descriptor != NULL);
 
   EXPECT_EQ(nested_field_descriptor->number(), nested_field.number());
@@ -189,8 +189,8 @@
 }
 
 TEST_F(UnknownFieldSetTest, SerializeFastAndSlowAreEquivalent) {
-  int size = WireFormat::ComputeUnknownFieldsSize(
-      empty_message_.unknown_fields());
+  int size =
+      WireFormat::ComputeUnknownFieldsSize(empty_message_.unknown_fields());
   std::string slow_buffer;
   std::string fast_buffer;
   slow_buffer.resize(size);
@@ -198,7 +198,7 @@
 
   uint8* target = reinterpret_cast<uint8*>(::google::protobuf::string_as_array(&fast_buffer));
   uint8* result = WireFormat::SerializeUnknownFieldsToArray(
-          empty_message_.unknown_fields(), target);
+      empty_message_.unknown_fields(), target);
   EXPECT_EQ(size, result - target);
 
   {
@@ -299,13 +299,13 @@
   destination.MergeFrom(source);
 
   EXPECT_EQ(
-    // Note:  The ordering of fields here depends on the ordering of adds
-    //   and merging, above.
-    "1: 1\n"
-    "3: 2\n"
-    "2: 3\n"
-    "3: 4\n",
-    destination.DebugString());
+      // Note:  The ordering of fields here depends on the ordering of adds
+      //   and merging, above.
+      "1: 1\n"
+      "3: 2\n"
+      "2: 3\n"
+      "3: 4\n",
+      destination.DebugString());
 }
 
 
@@ -408,14 +408,14 @@
 }
 
 TEST_F(UnknownFieldSetTest, UnknownEnumValue) {
-  using unittest::TestAllTypes;
   using unittest::TestAllExtensions;
+  using unittest::TestAllTypes;
   using unittest::TestEmptyMessage;
 
   const FieldDescriptor* singular_field =
-    TestAllTypes::descriptor()->FindFieldByName("optional_nested_enum");
+      TestAllTypes::descriptor()->FindFieldByName("optional_nested_enum");
   const FieldDescriptor* repeated_field =
-    TestAllTypes::descriptor()->FindFieldByName("repeated_nested_enum");
+      TestAllTypes::descriptor()->FindFieldByName("repeated_nested_enum");
   ASSERT_TRUE(singular_field != NULL);
   ASSERT_TRUE(repeated_field != NULL);
 
@@ -572,8 +572,7 @@
   unknown_fields.DeleteByNumber(deleted_number);
   ASSERT_EQ(expected_field_nubmers.size(), unknown_fields.field_count());
   for (int i = 0; i < expected_field_nubmers.size(); ++i) {
-    EXPECT_EQ(expected_field_nubmers[i],
-              unknown_fields.field(i).number());
+    EXPECT_EQ(expected_field_nubmers[i], unknown_fields.field(i).number());
   }
 }
 
diff --git a/src/google/protobuf/util/delimited_message_util.cc b/src/google/protobuf/util/delimited_message_util.cc
index c0d5cb0..425dc2c 100644
--- a/src/google/protobuf/util/delimited_message_util.cc
+++ b/src/google/protobuf/util/delimited_message_util.cc
@@ -1,8 +1,38 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
 // Adapted from the patch of kenton@google.com (Kenton Varda)
 // See https://github.com/protocolbuffers/protobuf/pull/710 for details.
 
-#include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/util/delimited_message_util.h>
+#include <google/protobuf/io/coded_stream.h>
 
 namespace google {
 namespace protobuf {
@@ -66,7 +96,9 @@
 bool SerializeDelimitedToCodedStream(const MessageLite& message,
                                      io::CodedOutputStream* output) {
   // Write the size.
-  int size = message.ByteSize();
+  size_t size = message.ByteSizeLong();
+  if (size > INT_MAX) return false;
+
   output->WriteVarint32(size);
 
   // Write the content.
diff --git a/src/google/protobuf/util/delimited_message_util.h b/src/google/protobuf/util/delimited_message_util.h
index 5f2d94c..946bbc9 100644
--- a/src/google/protobuf/util/delimited_message_util.h
+++ b/src/google/protobuf/util/delimited_message_util.h
@@ -1,3 +1,33 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
 // Adapted from the patch of kenton@google.com (Kenton Varda)
 // See https://github.com/protocolbuffers/protobuf/pull/710 for details.
 
diff --git a/src/google/protobuf/util/delimited_message_util_test.cc b/src/google/protobuf/util/delimited_message_util_test.cc
index 5a311c0..9ed6778 100644
--- a/src/google/protobuf/util/delimited_message_util_test.cc
+++ b/src/google/protobuf/util/delimited_message_util_test.cc
@@ -1,3 +1,33 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
 // Adapted from the patch of kenton@google.com (Kenton Varda)
 // See https://github.com/protocolbuffers/protobuf/pull/710 for details.
 
diff --git a/src/google/protobuf/util/field_comparator.cc b/src/google/protobuf/util/field_comparator.cc
index 83d21c9..3316506 100644
--- a/src/google/protobuf/util/field_comparator.cc
+++ b/src/google/protobuf/util/field_comparator.cc
@@ -51,8 +51,7 @@
 DefaultFieldComparator::DefaultFieldComparator()
     : float_comparison_(EXACT),
       treat_nan_as_equal_(false),
-      has_default_tolerance_(false) {
-}
+      has_default_tolerance_(false) {}
 
 DefaultFieldComparator::~DefaultFieldComparator() {}
 
@@ -64,19 +63,17 @@
   const Reflection* reflection_2 = message_2.GetReflection();
 
   switch (field->cpp_type()) {
-#define COMPARE_FIELD(METHOD)                                              \
-    if (field->is_repeated()) {                                            \
-      return ResultFromBoolean(Compare##METHOD(                            \
-          *field,                                                          \
-          reflection_1->GetRepeated##METHOD(message_1, field, index_1),    \
-          reflection_2->GetRepeated##METHOD(message_2, field, index_2)));  \
-    } else {                                                               \
-      return ResultFromBoolean(Compare##METHOD(                            \
-          *field,                                                          \
-          reflection_1->Get##METHOD(message_1, field),                     \
-          reflection_2->Get##METHOD(message_2, field)));                   \
-    }                                                                      \
-    break;  // Make sure no fall-through is introduced.
+#define COMPARE_FIELD(METHOD)                                                 \
+  if (field->is_repeated()) {                                                 \
+    return ResultFromBoolean(Compare##METHOD(                                 \
+        *field, reflection_1->GetRepeated##METHOD(message_1, field, index_1), \
+        reflection_2->GetRepeated##METHOD(message_2, field, index_2)));       \
+  } else {                                                                    \
+    return ResultFromBoolean(                                                 \
+        Compare##METHOD(*field, reflection_1->Get##METHOD(message_1, field),  \
+                        reflection_2->Get##METHOD(message_2, field)));        \
+  }                                                                           \
+  break;  // Make sure no fall-through is introduced.
 
     case FieldDescriptor::CPPTYPE_BOOL:
       COMPARE_FIELD(Bool);
@@ -97,8 +94,9 @@
         std::string scratch1;
         std::string scratch2;
         return ResultFromBoolean(
-            CompareString(*field, reflection_1->GetRepeatedStringReference(
-                                      message_1, field, index_1, &scratch1),
+            CompareString(*field,
+                          reflection_1->GetRepeatedStringReference(
+                              message_1, field, index_1, &scratch1),
                           reflection_2->GetRepeatedStringReference(
                               message_2, field, index_2, &scratch2)));
       } else {
@@ -133,8 +131,8 @@
                                      const Message& message1,
                                      const Message& message2,
                                      const util::FieldContext* field_context) {
-  return differencer->Compare(
-      message1, message2, field_context->parent_fields());
+  return differencer->Compare(message1, message2,
+                              field_context->parent_fields());
 }
 
 void DefaultFieldComparator::SetDefaultFractionAndMargin(double fraction,
@@ -169,7 +167,7 @@
   return CompareDoubleOrFloat(field, value_1, value_2);
 }
 
-template<typename T>
+template <typename T>
 bool DefaultFieldComparator::CompareDoubleOrFloat(const FieldDescriptor& field,
                                                   T value_1, T value_2) {
   if (value_1 == value_2) {
@@ -177,14 +175,14 @@
     // themselves), and is a shortcut for finite values.
     return true;
   } else if (float_comparison_ == EXACT) {
-    if (treat_nan_as_equal_ &&
-        MathLimits<T>::IsNaN(value_1) && MathLimits<T>::IsNaN(value_2)) {
+    if (treat_nan_as_equal_ && MathLimits<T>::IsNaN(value_1) &&
+        MathLimits<T>::IsNaN(value_2)) {
       return true;
     }
     return false;
   } else {
-    if (treat_nan_as_equal_ &&
-        MathLimits<T>::IsNaN(value_1) && MathLimits<T>::IsNaN(value_2)) {
+    if (treat_nan_as_equal_ && MathLimits<T>::IsNaN(value_1) &&
+        MathLimits<T>::IsNaN(value_2)) {
       return true;
     }
     // float_comparison_ == APPROXIMATE covers two use cases.
diff --git a/src/google/protobuf/util/field_comparator.h b/src/google/protobuf/util/field_comparator.h
index ca78fc5..7b5ce52 100644
--- a/src/google/protobuf/util/field_comparator.h
+++ b/src/google/protobuf/util/field_comparator.h
@@ -100,12 +100,12 @@
 class PROTOBUF_EXPORT DefaultFieldComparator : public FieldComparator {
  public:
   enum FloatComparison {
-     EXACT,               // Floats and doubles are compared exactly.
-     APPROXIMATE,         // Floats and doubles are compared using the
-                          // MathUtil::AlmostEqual method or
-                          // MathUtil::WithinFractionOrMargin method.
-     // TODO(ksroka): Introduce third value to differenciate uses of AlmostEqual
-     //               and WithinFractionOrMargin.
+    EXACT,        // Floats and doubles are compared exactly.
+    APPROXIMATE,  // Floats and doubles are compared using the
+                  // MathUtil::AlmostEqual method or
+                  // MathUtil::WithinFractionOrMargin method.
+    // TODO(ksroka): Introduce third value to differentiate uses of AlmostEqual
+    //               and WithinFractionOrMargin.
   };
 
   // Creates new comparator with float comparison set to EXACT.
@@ -122,9 +122,7 @@
     float_comparison_ = float_comparison;
   }
 
-  FloatComparison float_comparison() const {
-    return float_comparison_;
-  }
+  FloatComparison float_comparison() const { return float_comparison_; }
 
   // Set whether the FieldComparator shall treat floats or doubles that are both
   // NaN as equal (treat_nan_as_equal = true) or as different
@@ -133,9 +131,7 @@
     treat_nan_as_equal_ = treat_nan_as_equal;
   }
 
-  bool treat_nan_as_equal() const {
-    return treat_nan_as_equal_;
-  }
+  bool treat_nan_as_equal() const { return treat_nan_as_equal_; }
 
   // Sets the fraction and margin for the float comparison of a given field.
   // Uses MathUtil::WithinFractionOrMargin to compare the values.
@@ -167,12 +163,8 @@
   struct Tolerance {
     double fraction;
     double margin;
-    Tolerance()
-        : fraction(0.0),
-          margin(0.0) {}
-    Tolerance(double f, double m)
-        : fraction(f),
-          margin(m) {}
+    Tolerance() : fraction(0.0), margin(0.0) {}
+    Tolerance(double f, double m) : fraction(f), margin(m) {}
   };
 
   // Defines the map to store the tolerances for floating point comparison.
@@ -182,8 +174,8 @@
   // basic types (instead of submessages). They return true on success. One
   // can use ResultFromBoolean() to convert that boolean to a ComparisonResult
   // value.
-  bool CompareBool(const FieldDescriptor& /* unused */,
-                   bool value_1, bool value_2) {
+  bool CompareBool(const FieldDescriptor& /* unused */, bool value_1,
+                   bool value_2) {
     return value_1 == value_2;
   }
 
@@ -210,8 +202,8 @@
     return value_1 == value_2;
   }
 
-  bool CompareString(const FieldDescriptor& /* unused */, const std::string& value_1,
-                     const std::string& value_2) {
+  bool CompareString(const FieldDescriptor& /* unused */,
+                     const std::string& value_1, const std::string& value_2) {
     return value_1 == value_2;
   }
 
diff --git a/src/google/protobuf/util/field_comparator_test.cc b/src/google/protobuf/util/field_comparator_test.cc
index 00de96d..6b7ee49 100644
--- a/src/google/protobuf/util/field_comparator_test.cc
+++ b/src/google/protobuf/util/field_comparator_test.cc
@@ -51,9 +51,7 @@
 
 class DefaultFieldComparatorTest : public ::testing::Test {
  protected:
-  void SetUp() {
-    descriptor_ = TestAllTypes::descriptor();
-  }
+  void SetUp() { descriptor_ = TestAllTypes::descriptor(); }
 
   const Descriptor* descriptor_;
   DefaultFieldComparator comparator_;
@@ -62,8 +60,7 @@
 };
 
 TEST_F(DefaultFieldComparatorTest, RecursesIntoGroup) {
-  const FieldDescriptor* field =
-      descriptor_->FindFieldByName("optionalgroup");
+  const FieldDescriptor* field = descriptor_->FindFieldByName("optionalgroup");
   EXPECT_EQ(FieldComparator::RECURSE,
             comparator_.Compare(message_1_, message_2_, field, -1, -1, NULL));
 }
@@ -137,8 +134,7 @@
 }
 
 TEST_F(DefaultFieldComparatorTest, BooleanComparison) {
-  const FieldDescriptor* field =
-      descriptor_->FindFieldByName("optional_bool");
+  const FieldDescriptor* field = descriptor_->FindFieldByName("optional_bool");
   message_1_.set_optional_bool(true);
   message_2_.set_optional_bool(true);
 
@@ -189,22 +185,22 @@
   message_1_.set_optional_double(0.1);
   message_2_.set_optional_double(0.1);
 
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   message_2_.set_optional_float(0.2f);
   message_2_.set_optional_double(0.2);
 
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 }
 
 TEST_F(DefaultFieldComparatorTest, FloatingPointComparisonApproximate) {
@@ -229,21 +225,21 @@
 
   // DefaultFieldComparator's default float comparison mode is EXACT.
   ASSERT_EQ(DefaultFieldComparator::EXACT, comparator_.float_comparison());
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   comparator_.set_float_comparison(DefaultFieldComparator::APPROXIMATE);
 
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 }
 
 TEST_F(DefaultFieldComparatorTest, FloatingPointComparisonTreatNaNsAsEqual) {
@@ -261,36 +257,36 @@
   // treating NaNs as different.
   ASSERT_EQ(DefaultFieldComparator::EXACT, comparator_.float_comparison());
   ASSERT_EQ(false, comparator_.treat_nan_as_equal());
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
   comparator_.set_float_comparison(DefaultFieldComparator::APPROXIMATE);
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   comparator_.set_treat_nan_as_equal(true);
   ASSERT_EQ(true, comparator_.treat_nan_as_equal());
   comparator_.set_float_comparison(DefaultFieldComparator::EXACT);
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
   comparator_.set_float_comparison(DefaultFieldComparator::APPROXIMATE);
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 }
 
 TEST_F(DefaultFieldComparatorTest,
@@ -306,62 +302,62 @@
   message_2_.set_optional_double(109.9);
 
   comparator_.set_float_comparison(DefaultFieldComparator::APPROXIMATE);
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // Should fail since the fraction is too low.
   comparator_.SetFractionAndMargin(field_float, 0.01, 0.0);
   comparator_.SetFractionAndMargin(field_double, 0.01, 0.0);
 
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // Should fail since the margin is too low.
   comparator_.SetFractionAndMargin(field_float, 0.0, 9.0);
   comparator_.SetFractionAndMargin(field_double, 0.0, 9.0);
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // Should succeed since the fraction is high enough.
   comparator_.SetFractionAndMargin(field_float, 0.2, 0.0);
   comparator_.SetFractionAndMargin(field_double, 0.2, 0.0);
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // Should succeed since the margin is high enough.
   comparator_.SetFractionAndMargin(field_float, 0.0, 10.0);
   comparator_.SetFractionAndMargin(field_double, 0.0, 10.0);
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // Setting values for one of the fields should not affect the other.
   comparator_.SetFractionAndMargin(field_double, 0.0, 0.0);
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // +inf should be equal even though they are not technically within margin or
   // fraction.
@@ -371,12 +367,12 @@
   message_2_.set_optional_double(std::numeric_limits<double>::infinity());
   comparator_.SetFractionAndMargin(field_float, 0.0, 0.0);
   comparator_.SetFractionAndMargin(field_double, 0.0, 0.0);
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // -inf should be equal even though they are not technically within margin or
   // fraction.
@@ -386,12 +382,12 @@
   message_2_.set_optional_double(-std::numeric_limits<double>::infinity());
   comparator_.SetFractionAndMargin(field_float, 0.0, 0.0);
   comparator_.SetFractionAndMargin(field_double, 0.0, 0.0);
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 }
 
 TEST_F(DefaultFieldComparatorTest,
@@ -407,23 +403,23 @@
   message_2_.set_optional_double(109.9);
 
   comparator_.set_float_comparison(DefaultFieldComparator::APPROXIMATE);
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // Set default fraction and margin.
   comparator_.SetDefaultFractionAndMargin(0.01, 0.0);
 
   // Float comparisons should fail since the fraction is too low.
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // Set field-specific fraction and margin for one field (field_float) but not
   // the other (field_double)
@@ -431,37 +427,37 @@
 
   // The field with the override should succeed, since its field-specific
   // fraction is high enough.
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
   // The field with no override should fail, since the default fraction is too
   // low
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // Set the default fraction and margin high enough so that fields that use
   // the default should succeed
   comparator_.SetDefaultFractionAndMargin(0.2, 0.0);
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 
   // The field with an override should still be OK
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
 
   // Set fraction and margin for the field with an override to be too low
   comparator_.SetFractionAndMargin(field_float, 0.01, 0.0);
 
   // Now our default is high enough but field_float's override is too low.
-  EXPECT_EQ(FieldComparator::DIFFERENT,
-            comparator_.Compare(message_1_, message_2_,
-                                field_float, -1, -1, NULL));
-  EXPECT_EQ(FieldComparator::SAME,
-            comparator_.Compare(message_1_, message_2_,
-                                field_double, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::DIFFERENT,
+      comparator_.Compare(message_1_, message_2_, field_float, -1, -1, NULL));
+  EXPECT_EQ(
+      FieldComparator::SAME,
+      comparator_.Compare(message_1_, message_2_, field_double, -1, -1, NULL));
 }
 
 // Simple test checking whether we compare values at correct indices.
diff --git a/src/google/protobuf/util/field_mask_util.cc b/src/google/protobuf/util/field_mask_util.cc
index 11f62ba..c4b2758 100644
--- a/src/google/protobuf/util/field_mask_util.cc
+++ b/src/google/protobuf/util/field_mask_util.cc
@@ -34,6 +34,8 @@
 
 #include <google/protobuf/stubs/map_util.h>
 
+#include <google/protobuf/port_def.inc>
+
 namespace google {
 namespace protobuf {
 namespace util {
@@ -160,8 +162,8 @@
   return true;
 }
 
-void FieldMaskUtil::GetFieldMaskForAllFields(
-    const Descriptor* descriptor, FieldMask* out) {
+void FieldMaskUtil::GetFieldMaskForAllFields(const Descriptor* descriptor,
+                                             FieldMask* out) {
   for (int i = 0; i < descriptor->field_count(); ++i) {
     out->add_paths(descriptor->field(i)->name());
   }
@@ -548,8 +550,8 @@
   }
 }
 
-void FieldMaskTree::AddRequiredFieldPath(
-    Node* node, const Descriptor* descriptor) {
+void FieldMaskTree::AddRequiredFieldPath(Node* node,
+                                         const Descriptor* descriptor) {
   const int32 field_count = descriptor->field_count();
   for (int index = 0; index < field_count; ++index) {
     const FieldDescriptor* field = descriptor->field(index);
@@ -559,7 +561,7 @@
       if (child == nullptr) {
         // Add required field path to the tree
         child = new Node();
-      } else if (child->children.empty()){
+      } else if (child->children.empty()) {
         // If the required field is in the tree and does not have any children,
         // do nothing.
         continue;
diff --git a/src/google/protobuf/util/field_mask_util.h b/src/google/protobuf/util/field_mask_util.h
index 7031442..3e7a93e 100644
--- a/src/google/protobuf/util/field_mask_util.h
+++ b/src/google/protobuf/util/field_mask_util.h
@@ -35,8 +35,8 @@
 
 #include <string>
 
-#include <google/protobuf/descriptor.h>
 #include <google/protobuf/field_mask.pb.h>
+#include <google/protobuf/descriptor.h>
 #include <google/protobuf/stubs/stringpiece.h>
 
 #include <google/protobuf/port_def.inc>
@@ -134,9 +134,8 @@
   }
   // This flavor takes the protobuf type descriptor as an argument.
   // Useful when the type is not known at compile time.
-  static void Subtract(const Descriptor* descriptor,
-                       const FieldMask& mask1, const FieldMask& mask2,
-                       FieldMask* out);
+  static void Subtract(const Descriptor* descriptor, const FieldMask& mask1,
+                       const FieldMask& mask2, FieldMask* out);
 
   // Returns true if path is covered by the given FieldMask. Note that path
   // "foo.bar" covers all paths like "foo.bar.baz", "foo.bar.quz.x", etc.
@@ -177,7 +176,8 @@
   // Note that the input can contain characters not allowed in C identifiers.
   // For example, "foo_bar,baz_quz" will be converted to "fooBar,bazQuz"
   // successfully.
-  static bool SnakeCaseToCamelCase(StringPiece input, std::string* output);
+  static bool SnakeCaseToCamelCase(StringPiece input,
+                                   std::string* output);
   // Converts a field name from camelCase to snake_case:
   //   1. Every uppercase letter is converted to lowercase with a additional
   //      preceding "-".
@@ -190,7 +190,8 @@
   // Note that the input can contain characters not allowed in C identifiers.
   // For example, "fooBar,bazQuz" will be converted to "foo_bar,baz_quz"
   // successfully.
-  static bool CamelCaseToSnakeCase(StringPiece input, std::string* output);
+  static bool CamelCaseToSnakeCase(StringPiece input,
+                                   std::string* output);
 };
 
 class PROTOBUF_EXPORT FieldMaskUtil::MergeOptions {
@@ -223,15 +224,12 @@
 
 class PROTOBUF_EXPORT FieldMaskUtil::TrimOptions {
  public:
-  TrimOptions()
-      : keep_required_fields_(false) {}
+  TrimOptions() : keep_required_fields_(false) {}
   // When trimming message fields, the default behavior is to trim required
   // fields of the present message if they are not specified in the field mask.
   // If you instead want to keep required fields of the present message even
-  // they are not speicifed in the field mask, set this flag to true.
-  void set_keep_required_fields(bool value) {
-    keep_required_fields_ = value;
-  }
+  // they are not specified in the field mask, set this flag to true.
+  void set_keep_required_fields(bool value) { keep_required_fields_ = value; }
   bool keep_required_fields() const { return keep_required_fields_; }
 
  private:
diff --git a/src/google/protobuf/util/field_mask_util_test.cc b/src/google/protobuf/util/field_mask_util_test.cc
index 1481c17..401a56a 100644
--- a/src/google/protobuf/util/field_mask_util_test.cc
+++ b/src/google/protobuf/util/field_mask_util_test.cc
@@ -35,8 +35,8 @@
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/field_mask.pb.h>
-#include <google/protobuf/unittest.pb.h>
 #include <google/protobuf/test_util.h>
+#include <google/protobuf/unittest.pb.h>
 #include <gtest/gtest.h>
 
 namespace google {
@@ -113,11 +113,11 @@
   } while (std::next_permutation(name.begin(), name.end()));
 }
 
+using google::protobuf::FieldMask;
+using protobuf_unittest::NestedTestAllTypes;
 using protobuf_unittest::TestAllTypes;
 using protobuf_unittest::TestRequired;
 using protobuf_unittest::TestRequiredMessage;
-using protobuf_unittest::NestedTestAllTypes;
-using google::protobuf::FieldMask;
 
 TEST(FieldMaskUtilTest, StringFormat) {
   FieldMask mask;
@@ -707,16 +707,14 @@
   required_msg_2.clear_repeated_message();
   required_msg_2.mutable_required_message()->clear_dummy2();
   FieldMaskUtil::TrimMessage(mask, &trimmed_required_msg_2, options);
-  EXPECT_EQ(trimmed_required_msg_2.DebugString(),
-            required_msg_2.DebugString());
+  EXPECT_EQ(trimmed_required_msg_2.DebugString(), required_msg_2.DebugString());
 
   FieldMaskUtil::FromString("required_message", &mask);
   required_msg_2.mutable_required_message()->set_dummy2(7890);
   trimmed_required_msg_2.mutable_required_message()->set_dummy2(7890);
   required_msg_2.clear_optional_message();
   FieldMaskUtil::TrimMessage(mask, &trimmed_required_msg_2, options);
-  EXPECT_EQ(trimmed_required_msg_2.DebugString(),
-            required_msg_2.DebugString());
+  EXPECT_EQ(trimmed_required_msg_2.DebugString(), required_msg_2.DebugString());
 
   // Test trim required message with keep_required_fields is set false.
   FieldMaskUtil::FromString("required_message.dummy2", &mask);
@@ -725,8 +723,7 @@
   required_msg_2.mutable_required_message()->clear_c();
   options.set_keep_required_fields(false);
   FieldMaskUtil::TrimMessage(mask, &trimmed_required_msg_2, options);
-  EXPECT_EQ(trimmed_required_msg_2.DebugString(),
-            required_msg_2.DebugString());
+  EXPECT_EQ(trimmed_required_msg_2.DebugString(), required_msg_2.DebugString());
 
   // Verify that trimming an empty message has no effect. In particular, fields
   // mentioned in the field mask should not be created or changed.
diff --git a/src/google/protobuf/util/internal/datapiece.cc b/src/google/protobuf/util/internal/datapiece.cc
index be47454..55af434 100644
--- a/src/google/protobuf/util/internal/datapiece.cc
+++ b/src/google/protobuf/util/internal/datapiece.cc
@@ -47,9 +47,9 @@
 ;
 ;
 ;
-using util::error::Code;
 using util::Status;
 using util::StatusOr;
+using util::error::Code;
 
 namespace {
 
diff --git a/src/google/protobuf/util/internal/default_value_objectwriter.cc b/src/google/protobuf/util/internal/default_value_objectwriter.cc
index 3d7f27c..6c3b58b 100644
--- a/src/google/protobuf/util/internal/default_value_objectwriter.cc
+++ b/src/google/protobuf/util/internal/default_value_objectwriter.cc
@@ -481,7 +481,9 @@
     case google::protobuf::Field_Kind_TYPE_ENUM: {
       return FindEnumDefault(field, typeinfo, use_ints_for_enums);
     }
-    default: { return DataPiece::NullData(); }
+    default: {
+      return DataPiece::NullData();
+    }
   }
 }
 
diff --git a/src/google/protobuf/util/internal/json_escaping.cc b/src/google/protobuf/util/internal/json_escaping.cc
index d167359..5347c7b 100644
--- a/src/google/protobuf/util/internal/json_escaping.cc
+++ b/src/google/protobuf/util/internal/json_escaping.cc
@@ -50,39 +50,30 @@
 // kCommonEscapes[ch] is the escaped string of ch, if escaping is needed;
 //                    or an empty string, if escaping is not needed.
 static const char kCommonEscapes[160][7] = {
-  // C0 (ASCII and derivatives) control characters
-  "\\u0000", "\\u0001", "\\u0002", "\\u0003",  // 0x00
-  "\\u0004", "\\u0005", "\\u0006", "\\u0007",
-  "\\b",     "\\t",     "\\n",     "\\u000b",
-  "\\f",     "\\r",     "\\u000e", "\\u000f",
-  "\\u0010", "\\u0011", "\\u0012", "\\u0013",  // 0x10
-  "\\u0014", "\\u0015", "\\u0016", "\\u0017",
-  "\\u0018", "\\u0019", "\\u001a", "\\u001b",
-  "\\u001c", "\\u001d", "\\u001e", "\\u001f",
-  // Escaping of " and \ are required by www.json.org string definition.
-  // Escaping of < and > are required for HTML security.
-  "", "", "\\\"", "", "",        "", "",        "",  // 0x20
-  "", "", "",     "", "",        "", "",        "",
-  "", "", "",     "", "",        "", "",        "",  // 0x30
-  "", "", "",     "", "\\u003c", "", "\\u003e", "",
-  "", "", "",     "", "",        "", "",        "",  // 0x40
-  "", "", "",     "", "",        "", "",        "",
-  "", "", "",     "", "",        "", "",        "",  // 0x50
-  "", "", "",     "", "\\\\",    "", "",        "",
-  "", "", "",     "", "",        "", "",        "",  // 0x60
-  "", "", "",     "", "",        "", "",        "",
-  "", "", "",     "", "",        "", "",        "",  // 0x70
-  "", "", "",     "", "",        "", "",        "\\u007f",
-  // C1 (ISO 8859 and Unicode) extended control characters
-  "\\u0080", "\\u0081", "\\u0082", "\\u0083",  // 0x80
-  "\\u0084", "\\u0085", "\\u0086", "\\u0087",
-  "\\u0088", "\\u0089", "\\u008a", "\\u008b",
-  "\\u008c", "\\u008d", "\\u008e", "\\u008f",
-  "\\u0090", "\\u0091", "\\u0092", "\\u0093",  // 0x90
-  "\\u0094", "\\u0095", "\\u0096", "\\u0097",
-  "\\u0098", "\\u0099", "\\u009a", "\\u009b",
-  "\\u009c", "\\u009d", "\\u009e", "\\u009f"
-};
+    // C0 (ASCII and derivatives) control characters
+    "\\u0000", "\\u0001", "\\u0002", "\\u0003",  // 0x00
+    "\\u0004", "\\u0005", "\\u0006", "\\u0007", "\\b", "\\t", "\\n", "\\u000b",
+    "\\f", "\\r", "\\u000e", "\\u000f", "\\u0010", "\\u0011", "\\u0012",
+    "\\u0013",  // 0x10
+    "\\u0014", "\\u0015", "\\u0016", "\\u0017", "\\u0018", "\\u0019", "\\u001a",
+    "\\u001b", "\\u001c", "\\u001d", "\\u001e", "\\u001f",
+    // Escaping of " and \ are required by www.json.org string definition.
+    // Escaping of < and > are required for HTML security.
+    "", "", "\\\"", "", "", "", "", "",                              // 0x20
+    "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",  // 0x30
+    "", "", "", "", "\\u003c", "", "\\u003e", "", "", "", "", "", "", "", "",
+    "",                                                                  // 0x40
+    "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",      // 0x50
+    "", "", "", "", "\\\\", "", "", "", "", "", "", "", "", "", "", "",  // 0x60
+    "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",      // 0x70
+    "", "", "", "", "", "", "", "\\u007f",
+    // C1 (ISO 8859 and Unicode) extended control characters
+    "\\u0080", "\\u0081", "\\u0082", "\\u0083",  // 0x80
+    "\\u0084", "\\u0085", "\\u0086", "\\u0087", "\\u0088", "\\u0089", "\\u008a",
+    "\\u008b", "\\u008c", "\\u008d", "\\u008e", "\\u008f", "\\u0090", "\\u0091",
+    "\\u0092", "\\u0093",  // 0x90
+    "\\u0094", "\\u0095", "\\u0096", "\\u0097", "\\u0098", "\\u0099", "\\u009a",
+    "\\u009b", "\\u009c", "\\u009d", "\\u009e", "\\u009f"};
 
 // Determines if the given char value is a unicode surrogate code unit (either
 // high-surrogate or low-surrogate).
@@ -102,9 +93,9 @@
 // Returns the low surrogate for the given unicode code point. The result is
 // meaningless if the given code point is not a supplementary character.
 inline uint16 ToLowSurrogate(uint32 cp) {
-  return (cp & (JsonEscaping::kMaxLowSurrogate
-                - JsonEscaping::kMinLowSurrogate))
-      + JsonEscaping::kMinLowSurrogate;
+  return (cp &
+          (JsonEscaping::kMaxLowSurrogate - JsonEscaping::kMinLowSurrogate)) +
+         JsonEscaping::kMinLowSurrogate;
 }
 
 // Returns the high surrogate for the given unicode code point. The result is
@@ -328,10 +319,10 @@
       ok = ReadCodePoint(str, i, &cp, &num_left, &num_read);
       if (num_left > 0 || !ok) break;  // case iii or iv
       escaped = EscapeCodePoint(cp, buffer, cp_was_split);
-      if (!escaped.empty()) break;     // case i or ii
+      if (!escaped.empty()) break;  // case i or ii
       i += num_read;
       num_read = 0;
-    } while (i < str.length());        // case iv
+    } while (i < str.length());  // case iv
     // First copy the un-escaped prefix, if any, to the output ByteSink.
     if (i > 0) input->CopyTo(output, i);
     if (num_read > 0) input->Skip(num_read);
diff --git a/src/google/protobuf/util/internal/json_stream_parser_test.cc b/src/google/protobuf/util/internal/json_stream_parser_test.cc
index d0980f9..7916085 100644
--- a/src/google/protobuf/util/internal/json_stream_parser_test.cc
+++ b/src/google/protobuf/util/internal/json_stream_parser_test.cc
@@ -118,7 +118,7 @@
         result = parser.FinishParse();
       }
     }
-    if (result.ok()){
+    if (result.ok()) {
       EXPECT_EQ(parser.recursion_depth(), 0);
     }
     return result;
@@ -138,8 +138,7 @@
   void DoErrorTest(StringPiece json, int split,
                    StringPiece error_prefix, bool coerce_utf8 = false,
                    bool allow_empty_null = false) {
-    util::Status result =
-        RunTest(json, split, coerce_utf8, allow_empty_null);
+    util::Status result = RunTest(json, split, coerce_utf8, allow_empty_null);
     EXPECT_EQ(util::error::INVALID_ARGUMENT, result.code());
     StringPiece error_message(result.error_message());
     EXPECT_EQ(error_prefix, error_message.substr(0, error_prefix.size()));
diff --git a/src/google/protobuf/util/internal/proto_writer.cc b/src/google/protobuf/util/internal/proto_writer.cc
index 222ffc3..74fe0f4 100644
--- a/src/google/protobuf/util/internal/proto_writer.cc
+++ b/src/google/protobuf/util/internal/proto_writer.cc
@@ -313,10 +313,10 @@
       typeinfo_(this->parent()->typeinfo_),
       proto3_(type.syntax() == google::protobuf::SYNTAX_PROTO3),
       type_(type),
-      size_index_(
-          !is_list && field->kind() == google::protobuf::Field_Kind_TYPE_MESSAGE
-              ? ow_->size_insert_.size()
-              : -1),
+      size_index_(!is_list && field->kind() ==
+                                  google::protobuf::Field_Kind_TYPE_MESSAGE
+                      ? ow_->size_insert_.size()
+                      : -1),
       array_index_(is_list ? 0 : -1),
       // oneof_indices_ values are 1-indexed (0 means not present).
       oneof_indices_(type_.oneofs_size() + 1) {
diff --git a/src/google/protobuf/util/internal/protostream_objectsource.cc b/src/google/protobuf/util/internal/protostream_objectsource.cc
index 7accf05..a4e7f34 100644
--- a/src/google/protobuf/util/internal/protostream_objectsource.cc
+++ b/src/google/protobuf/util/internal/protostream_objectsource.cc
@@ -64,7 +64,7 @@
 namespace error {
 using util::error::Code;
 using util::error::INTERNAL;
-}
+}  // namespace error
 namespace converter {
 using ::PROTOBUF_NAMESPACE_ID::internal::WireFormat;
 using ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite;
diff --git a/src/google/protobuf/util/internal/protostream_objectsource.h b/src/google/protobuf/util/internal/protostream_objectsource.h
index 804f6e6..af51a27 100644
--- a/src/google/protobuf/util/internal/protostream_objectsource.h
+++ b/src/google/protobuf/util/internal/protostream_objectsource.h
@@ -37,9 +37,9 @@
 
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/type.pb.h>
+#include <google/protobuf/util/internal/type_info.h>
 #include <google/protobuf/util/internal/object_source.h>
 #include <google/protobuf/util/internal/object_writer.h>
-#include <google/protobuf/util/internal/type_info.h>
 #include <google/protobuf/util/type_resolver.h>
 #include <google/protobuf/stubs/stringpiece.h>
 #include <google/protobuf/stubs/hash.h>
@@ -175,10 +175,9 @@
   // Renders a NWP map.
   // Returns the next tag after reading all map entries. The caller should use
   // this tag before reading more tags from the stream.
-  util::StatusOr<uint32>
-      RenderMap(const google::protobuf::Field* field,
-                StringPiece name, uint32 list_tag,
-                ObjectWriter* ow) const;
+  util::StatusOr<uint32> RenderMap(const google::protobuf::Field* field,
+                                     StringPiece name, uint32 list_tag,
+                                     ObjectWriter* ow) const;
 
   // Renders a packed repeating field. A packed field is stored as:
   // {tag length item1 item2 item3} instead of the less efficient
diff --git a/src/google/protobuf/util/internal/protostream_objectsource_test.cc b/src/google/protobuf/util/internal/protostream_objectsource_test.cc
index 686aa08..dc2875a 100644
--- a/src/google/protobuf/util/internal/protostream_objectsource_test.cc
+++ b/src/google/protobuf/util/internal/protostream_objectsource_test.cc
@@ -57,6 +57,8 @@
 namespace util {
 namespace converter {
 
+using io::ArrayInputStream;
+using io::CodedInputStream;
 using proto_util_converter::testing::AnyM;
 using proto_util_converter::testing::AnyOut;
 using proto_util_converter::testing::Author;
@@ -75,8 +77,6 @@
 using proto_util_converter::testing::Proto3Message;
 using proto_util_converter::testing::StructType;
 using proto_util_converter::testing::TimestampDuration;
-using io::ArrayInputStream;
-using io::CodedInputStream;
 using ::testing::_;
 using util::Status;
 
diff --git a/src/google/protobuf/util/internal/protostream_objectwriter.cc b/src/google/protobuf/util/internal/protostream_objectwriter.cc
index a3c3065..7865f78 100644
--- a/src/google/protobuf/util/internal/protostream_objectwriter.cc
+++ b/src/google/protobuf/util/internal/protostream_objectwriter.cc
@@ -57,10 +57,10 @@
 namespace converter {
 
 using ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite;
+using std::placeholders::_1;
 using util::Status;
 using util::StatusOr;
 using util::error::INVALID_ARGUMENT;
-using std::placeholders::_1;
 
 
 ProtoStreamObjectWriter::ProtoStreamObjectWriter(
@@ -359,9 +359,9 @@
 
   // Create our object writer and initialize it with the first StartObject
   // call.
-  ow_.reset(new ProtoStreamObjectWriter(
-      parent_->typeinfo(), *type, &output_, parent_->listener(),
-      parent_->options_));
+  ow_.reset(new ProtoStreamObjectWriter(parent_->typeinfo(), *type, &output_,
+                                        parent_->listener(),
+                                        parent_->options_));
 
   // Don't call StartObject() for well-known types yet. Depending on the
   // type of actual data, we may not need to call StartObject(). For
@@ -985,9 +985,9 @@
                                data.ValueAsStringOrDefault("")));
   }
 
-// TODO(tsun): figure out how to do proto descriptor based snake case
-// conversions as much as possible. Because ToSnakeCase sometimes returns the
-// wrong value.
+  // TODO(tsun): figure out how to do proto descriptor based snake case
+  // conversions as much as possible. Because ToSnakeCase sometimes returns the
+  // wrong value.
   return DecodeCompactFieldMaskPaths(data.str(),
                                      std::bind(&RenderOneFieldPath, ow, _1));
 }
diff --git a/src/google/protobuf/util/internal/protostream_objectwriter_test.cc b/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
index 5eda41c..006e85b 100644
--- a/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
+++ b/src/google/protobuf/util/internal/protostream_objectwriter_test.cc
@@ -91,9 +91,9 @@
 }  // namespace
 
 #if __cplusplus >= 201103L
-  using std::get;
+using std::get;
 #else
-  using std::tr1::get;
+using std::tr1::get;
 #endif
 
 class BaseProtoStreamObjectWriterTest
@@ -183,9 +183,7 @@
   ProtoStreamObjectWriterTest()
       : BaseProtoStreamObjectWriterTest(Book::descriptor()) {}
 
-  void ResetProtoWriter() {
-    ResetTypeInfo(Book::descriptor());
-  }
+  void ResetProtoWriter() { ResetTypeInfo(Book::descriptor()); }
 
   virtual ~ProtoStreamObjectWriterTest() {}
 };
@@ -1024,9 +1022,7 @@
   expected.set_enum_value(static_cast<Proto3Message::NestedEnum>(12345));
 
   EXPECT_CALL(listener_, InvalidValue(_, _, _)).Times(0);
-  ow_->StartObject("")
-      ->RenderInt32("enumValue", 12345)
-      ->EndObject();
+  ow_->StartObject("")->RenderInt32("enumValue", 12345)->EndObject();
   CheckOutput(expected);
 }
 
diff --git a/src/google/protobuf/util/internal/type_info_test_helper.cc b/src/google/protobuf/util/internal/type_info_test_helper.cc
index 9106f11..cc2dcd7 100644
--- a/src/google/protobuf/util/internal/type_info_test_helper.cc
+++ b/src/google/protobuf/util/internal/type_info_test_helper.cc
@@ -33,7 +33,6 @@
 #include <memory>
 #include <vector>
 
-
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
 #include <google/protobuf/descriptor.h>
diff --git a/src/google/protobuf/util/json_util.cc b/src/google/protobuf/util/json_util.cc
index ed50b1d..52ce331 100644
--- a/src/google/protobuf/util/json_util.cc
+++ b/src/google/protobuf/util/json_util.cc
@@ -98,8 +98,8 @@
   converter::JsonObjectWriter json_writer(options.add_whitespace ? " " : "",
                                           &out_stream);
   if (options.always_print_primitive_fields) {
-    converter::DefaultValueObjectWriter default_value_writer(
-        resolver, type, &json_writer);
+    converter::DefaultValueObjectWriter default_value_writer(resolver, type,
+                                                             &json_writer);
     default_value_writer.set_preserve_proto_field_names(
         options.preserve_proto_field_names);
     default_value_writer.set_print_enums_as_ints(
@@ -129,9 +129,9 @@
 
   util::Status GetStatus() { return status_; }
 
-  virtual void InvalidName(const converter::LocationTrackerInterface& loc,
-                           StringPiece unknown_name,
-                           StringPiece message) {
+  void InvalidName(const converter::LocationTrackerInterface& loc,
+                   StringPiece unknown_name,
+                   StringPiece message) override {
     std::string loc_string = GetLocString(loc);
     if (!loc_string.empty()) {
       loc_string.append(" ");
@@ -141,17 +141,17 @@
                        StrCat(loc_string, unknown_name, ": ", message));
   }
 
-  virtual void InvalidValue(const converter::LocationTrackerInterface& loc,
-                            StringPiece type_name,
-                            StringPiece value) {
+  void InvalidValue(const converter::LocationTrackerInterface& loc,
+                    StringPiece type_name,
+                    StringPiece value) override {
     status_ = util::Status(
         util::error::INVALID_ARGUMENT,
         StrCat(GetLocString(loc), ": invalid value ", string(value),
                      " for type ", string(type_name)));
   }
 
-  virtual void MissingField(const converter::LocationTrackerInterface& loc,
-                            StringPiece missing_name) {
+  void MissingField(const converter::LocationTrackerInterface& loc,
+                    StringPiece missing_name) override {
     status_ = util::Status(util::error::INVALID_ARGUMENT,
                              StrCat(GetLocString(loc), ": missing field ",
                                           std::string(missing_name)));
@@ -188,9 +188,8 @@
       options.ignore_unknown_fields;
   proto_writer_options.case_insensitive_enum_parsing =
       options.case_insensitive_enum_parsing;
-  converter::ProtoStreamObjectWriter proto_writer(resolver, type, &sink,
-                                                  &listener,
-                                                  proto_writer_options);
+  converter::ProtoStreamObjectWriter proto_writer(
+      resolver, type, &sink, &listener, proto_writer_options);
 
   converter::JsonStreamParser parser(&proto_writer);
   const void* buffer;
@@ -212,8 +211,8 @@
                                   const JsonParseOptions& options) {
   io::ArrayInputStream input_stream(json_input.data(), json_input.size());
   io::StringOutputStream output_stream(binary_output);
-  return JsonToBinaryStream(
-      resolver, type_url, &input_stream, &output_stream, options);
+  return JsonToBinaryStream(resolver, type_url, &input_stream, &output_stream,
+                            options);
 }
 
 namespace {
@@ -265,8 +264,8 @@
           ? GetGeneratedTypeResolver()
           : NewTypeResolverForDescriptorPool(kTypeUrlPrefix, pool);
   std::string binary;
-  util::Status result = JsonToBinaryString(
-      resolver, GetTypeUrl(*message), input, &binary, options);
+  util::Status result = JsonToBinaryString(resolver, GetTypeUrl(*message),
+                                             input, &binary, options);
   if (result.ok() && !message->ParseFromString(binary)) {
     result =
         util::Status(util::error::INVALID_ARGUMENT,
diff --git a/src/google/protobuf/util/json_util.h b/src/google/protobuf/util/json_util.h
index 2e40615..39b6b5a 100644
--- a/src/google/protobuf/util/json_util.h
+++ b/src/google/protobuf/util/json_util.h
@@ -133,8 +133,9 @@
 }
 
 PROTOBUF_EXPORT util::Status BinaryToJsonString(
-    TypeResolver* resolver, const std::string& type_url, const std::string& binary_input,
-    std::string* json_output, const JsonPrintOptions& options);
+    TypeResolver* resolver, const std::string& type_url,
+    const std::string& binary_input, std::string* json_output,
+    const JsonPrintOptions& options);
 
 inline util::Status BinaryToJsonString(TypeResolver* resolver,
                                          const std::string& type_url,
@@ -155,8 +156,7 @@
     io::ZeroCopyOutputStream* binary_output, const JsonParseOptions& options);
 
 inline util::Status JsonToBinaryStream(
-    TypeResolver* resolver,
-    const std::string& type_url,
+    TypeResolver* resolver, const std::string& type_url,
     io::ZeroCopyInputStream* json_input,
     io::ZeroCopyOutputStream* binary_output) {
   return JsonToBinaryStream(resolver, type_url, json_input, binary_output,
diff --git a/src/google/protobuf/util/json_util_test.cc b/src/google/protobuf/util/json_util_test.cc
index dedcff8..9f60543 100644
--- a/src/google/protobuf/util/json_util_test.cc
+++ b/src/google/protobuf/util/json_util_test.cc
@@ -49,14 +49,14 @@
 namespace util {
 namespace {
 
-using proto_util_converter::testing::MapIn;
 using proto3::BAR;
 using proto3::FOO;
+using proto3::TestAny;
 using proto3::TestEnumValue;
 using proto3::TestMap;
 using proto3::TestMessage;
 using proto3::TestOneof;
-using proto3::TestAny;
+using proto_util_converter::testing::MapIn;
 
 static const char kTypeUrlPrefix[] = "type.googleapis.com";
 
@@ -67,8 +67,7 @@
 // tests are contained in the //net/proto2/util/converter directory.
 class JsonUtilTest : public ::testing::Test {
  protected:
-  JsonUtilTest() {
-  }
+  JsonUtilTest() {}
 
   std::string ToJson(const Message& message, const JsonPrintOptions& options) {
     std::string result;
@@ -339,8 +338,9 @@
   DescriptorPool pool(&database);
   // A dynamic version of the test proto.
   DynamicMessageFactory factory;
-  std::unique_ptr<Message> message(factory.GetPrototype(
-      pool.FindMessageTypeByName("proto3.TestMessage"))->New());
+  std::unique_ptr<Message> message(
+      factory.GetPrototype(pool.FindMessageTypeByName("proto3.TestMessage"))
+          ->New());
   EXPECT_TRUE(FromJson(input, message.get()));
 
   // Convert to generated message for easy inspection.
@@ -498,7 +498,9 @@
 class SegmentedZeroCopyOutputStream : public io::ZeroCopyOutputStream {
  public:
   explicit SegmentedZeroCopyOutputStream(std::list<Segment> segments)
-      : segments_(segments), last_segment_(static_cast<char*>(NULL), 0), byte_count_(0) {}
+      : segments_(segments),
+        last_segment_(static_cast<char*>(NULL), 0),
+        byte_count_(0) {}
 
   virtual bool Next(void** buffer, int* length) {
     if (segments_.empty()) {
@@ -627,8 +629,8 @@
   TypeResolver* resolver = NewTypeResolverForDescriptorPool(
       "type.googleapis.com", DescriptorPool::generated_pool());
 
-  auto result_status = util::JsonToBinaryStream(
-      resolver, message_type, &input_stream, &output_stream);
+  auto result_status = util::JsonToBinaryStream(resolver, message_type,
+                                                &input_stream, &output_stream);
 
   delete resolver;
 
diff --git a/src/google/protobuf/util/message_differencer.cc b/src/google/protobuf/util/message_differencer.cc
index 57e9987..92d113d 100644
--- a/src/google/protobuf/util/message_differencer.cc
+++ b/src/google/protobuf/util/message_differencer.cc
@@ -53,6 +53,8 @@
 #include <google/protobuf/stubs/strutil.h>
 
 
+#include <google/protobuf/port_def.inc>
+
 namespace google {
 namespace protobuf {
 
@@ -72,19 +74,25 @@
   void ReportAdded(
       const google::protobuf::Message& message1, const google::protobuf::Message& message2,
       const std::vector<google::protobuf::util::MessageDifferencer::SpecificField>&
-          field_path) override { ++num_diffs_; }
+          field_path) override {
+    ++num_diffs_;
+  }
 
   // Report that a field has been deleted from Message1.
   void ReportDeleted(
       const google::protobuf::Message& message1, const google::protobuf::Message& message2,
       const std::vector<google::protobuf::util::MessageDifferencer::SpecificField>&
-          field_path) override { ++num_diffs_; }
+          field_path) override {
+    ++num_diffs_;
+  }
 
   // Report that the value of a field has been modified.
   void ReportModified(
       const google::protobuf::Message& message1, const google::protobuf::Message& message2,
       const std::vector<google::protobuf::util::MessageDifferencer::SpecificField>&
-          field_path) override { ++num_diffs_; }
+          field_path) override {
+    ++num_diffs_;
+  }
 
  private:
   int32 num_diffs_;
@@ -101,17 +109,16 @@
   MultipleFieldsMapKeyComparator(
       MessageDifferencer* message_differencer,
       const std::vector<std::vector<const FieldDescriptor*> >& key_field_paths)
-        : message_differencer_(message_differencer),
-          key_field_paths_(key_field_paths) {
+      : message_differencer_(message_differencer),
+        key_field_paths_(key_field_paths) {
     GOOGLE_CHECK(!key_field_paths_.empty());
     for (int i = 0; i < key_field_paths_.size(); ++i) {
       GOOGLE_CHECK(!key_field_paths_[i].empty());
     }
   }
-  MultipleFieldsMapKeyComparator(
-      MessageDifferencer* message_differencer,
-      const FieldDescriptor* key)
-        : message_differencer_(message_differencer) {
+  MultipleFieldsMapKeyComparator(MessageDifferencer* message_differencer,
+                                 const FieldDescriptor* key)
+      : message_differencer_(message_differencer) {
     std::vector<const FieldDescriptor*> key_field_path;
     key_field_path.push_back(key);
     key_field_paths_.push_back(key_field_path);
@@ -129,8 +136,7 @@
 
  private:
   bool IsMatchInternal(
-      const Message& message1,
-      const Message& message2,
+      const Message& message1, const Message& message2,
       const std::vector<SpecificField>& parent_fields,
       const std::vector<const FieldDescriptor*>& key_field_path,
       int path_index) const {
@@ -139,12 +145,12 @@
     if (path_index == key_field_path.size() - 1) {
       if (field->is_repeated()) {
         if (!message_differencer_->CompareRepeatedField(
-            message1, message2, field, &current_parent_fields)) {
+                message1, message2, field, &current_parent_fields)) {
           return false;
         }
       } else {
         if (!message_differencer_->CompareFieldValueUsingParentFields(
-            message1, message2, field, -1, -1, &current_parent_fields)) {
+                message1, message2, field, -1, -1, &current_parent_fields)) {
           return false;
         }
       }
@@ -163,12 +169,10 @@
       SpecificField specific_field;
       specific_field.field = field;
       current_parent_fields.push_back(specific_field);
-      return IsMatchInternal(
-          reflection1->GetMessage(message1, field),
-          reflection2->GetMessage(message2, field),
-          current_parent_fields,
-          key_field_path,
-          path_index + 1);
+      return IsMatchInternal(reflection1->GetMessage(message1, field),
+                             reflection2->GetMessage(message2, field),
+                             current_parent_fields, key_field_path,
+                             path_index + 1);
     }
   }
   MessageDifferencer* message_differencer_;
@@ -241,8 +245,7 @@
 bool MessageDifferencer::ApproximatelyEquals(const Message& message1,
                                              const Message& message2) {
   MessageDifferencer differencer;
-  differencer.set_float_comparison(
-      MessageDifferencer::APPROXIMATE);
+  differencer.set_float_comparison(MessageDifferencer::APPROXIMATE);
 
   return differencer.Compare(message1, message2);
 }
@@ -291,18 +294,14 @@
   message_field_comparison_ = comparison;
 }
 
-void MessageDifferencer::set_scope(Scope scope) {
-  scope_ = scope;
-}
+void MessageDifferencer::set_scope(Scope scope) { scope_ = scope; }
 
-MessageDifferencer::Scope MessageDifferencer::scope() {
-  return scope_;
-}
+MessageDifferencer::Scope MessageDifferencer::scope() { return scope_; }
 
 void MessageDifferencer::set_float_comparison(FloatComparison comparison) {
   default_field_comparator_.set_float_comparison(
-      comparison == EXACT ?
-      DefaultFieldComparator::EXACT : DefaultFieldComparator::APPROXIMATE);
+      comparison == EXACT ? DefaultFieldComparator::EXACT
+                          : DefaultFieldComparator::APPROXIMATE);
 }
 
 void MessageDifferencer::set_repeated_field_comparison(
@@ -313,23 +312,19 @@
 void MessageDifferencer::CheckRepeatedFieldComparisons(
     const FieldDescriptor* field,
     const RepeatedFieldComparison& new_comparison) {
-  GOOGLE_CHECK(field->is_repeated()) << "Field must be repeated: "
-                               << field->full_name();
+  GOOGLE_CHECK(field->is_repeated())
+      << "Field must be repeated: " << field->full_name();
   const MapKeyComparator* key_comparator = GetMapKeyComparator(field);
   GOOGLE_CHECK(key_comparator == NULL)
-      << "Cannot treat this repeated field as both MAP and "
-      << new_comparison
+      << "Cannot treat this repeated field as both MAP and " << new_comparison
       << " for"
       << " comparison.  Field name is: " << field->full_name();
   GOOGLE_CHECK(repeated_field_comparisons_.find(field) ==
-        repeated_field_comparisons_.end() ||
+            repeated_field_comparisons_.end() ||
         repeated_field_comparisons_[field] == new_comparison)
       << "Cannot treat the same field as both "
-      << repeated_field_comparisons_[field]
-      << " and "
-      << new_comparison
-      <<". Field name is: "
-      << field->full_name();
+      << repeated_field_comparisons_[field] << " and " << new_comparison
+      << ". Field name is: " << field->full_name();
 }
 
 void MessageDifferencer::TreatAsSet(const FieldDescriptor* field) {
@@ -360,8 +355,7 @@
 void MessageDifferencer::TreatAsMap(const FieldDescriptor* field,
                                     const FieldDescriptor* key) {
   GOOGLE_CHECK_EQ(FieldDescriptor::CPPTYPE_MESSAGE, field->cpp_type())
-      << "Field has to be message type.  Field name is: "
-      << field->full_name();
+      << "Field has to be message type.  Field name is: " << field->full_name();
   GOOGLE_CHECK(key->containing_type() == field->message_type())
       << key->full_name()
       << " must be a direct subfield within the repeated field "
@@ -370,8 +364,7 @@
         repeated_field_comparisons_.end())
       << "Cannot treat the same field as both "
       << repeated_field_comparisons_[field]
-      << " and MAP. Field name is: "
-      << field->full_name();
+      << " and MAP. Field name is: " << field->full_name();
   MapKeyComparator* key_comparator =
       new MultipleFieldsMapKeyComparator(this, key);
   owned_key_comparators_.push_back(key_comparator);
@@ -393,11 +386,10 @@
 void MessageDifferencer::TreatAsMapWithMultipleFieldPathsAsKey(
     const FieldDescriptor* field,
     const std::vector<std::vector<const FieldDescriptor*> >& key_field_paths) {
-  GOOGLE_CHECK(field->is_repeated()) << "Field must be repeated: "
-                              << field->full_name();
+  GOOGLE_CHECK(field->is_repeated())
+      << "Field must be repeated: " << field->full_name();
   GOOGLE_CHECK_EQ(FieldDescriptor::CPPTYPE_MESSAGE, field->cpp_type())
-      << "Field has to be message type.  Field name is: "
-      << field->full_name();
+      << "Field has to be message type.  Field name is: " << field->full_name();
   for (int i = 0; i < key_field_paths.size(); ++i) {
     const std::vector<const FieldDescriptor*>& key_field_path =
         key_field_paths[i];
@@ -419,10 +411,9 @@
   }
   GOOGLE_CHECK(repeated_field_comparisons_.find(field) ==
         repeated_field_comparisons_.end())
-    << "Cannot treat the same field as both "
-    << repeated_field_comparisons_[field]
-    << " and MAP. Field name is: "
-    << field->full_name();
+      << "Cannot treat the same field as both "
+      << repeated_field_comparisons_[field]
+      << " and MAP. Field name is: " << field->full_name();
   MapKeyComparator* key_comparator =
       new MultipleFieldsMapKeyComparator(this, key_field_paths);
   owned_key_comparators_.push_back(key_comparator);
@@ -430,16 +421,14 @@
 }
 
 void MessageDifferencer::TreatAsMapUsingKeyComparator(
-    const FieldDescriptor* field,
-    const MapKeyComparator* key_comparator) {
-  GOOGLE_CHECK(field->is_repeated()) << "Field must be repeated: "
-                               << field->full_name();
+    const FieldDescriptor* field, const MapKeyComparator* key_comparator) {
+  GOOGLE_CHECK(field->is_repeated())
+      << "Field must be repeated: " << field->full_name();
   GOOGLE_CHECK(repeated_field_comparisons_.find(field) ==
         repeated_field_comparisons_.end())
       << "Cannot treat the same field as both "
       << repeated_field_comparisons_[field]
-      << " and MAP. Field name is: "
-      << field->full_name();
+      << " and MAP. Field name is: " << field->full_name();
   map_field_key_comparator_[field] = key_comparator;
 }
 
@@ -510,8 +499,7 @@
 }
 
 bool MessageDifferencer::CompareWithFields(
-    const Message& message1,
-    const Message& message2,
+    const Message& message1, const Message& message2,
     const std::vector<const FieldDescriptor*>& message1_fields_arg,
     const std::vector<const FieldDescriptor*>& message2_fields_arg) {
   if (message1.GetDescriptor() != message2.GetDescriptor()) {
@@ -549,16 +537,14 @@
   return result;
 }
 
-bool MessageDifferencer::Compare(
-    const Message& message1,
-    const Message& message2,
-    std::vector<SpecificField>* parent_fields) {
+bool MessageDifferencer::Compare(const Message& message1,
+                                 const Message& message2,
+                                 std::vector<SpecificField>* parent_fields) {
   const Descriptor* descriptor1 = message1.GetDescriptor();
   const Descriptor* descriptor2 = message2.GetDescriptor();
   if (descriptor1 != descriptor2) {
     GOOGLE_LOG(DFATAL) << "Comparison between two messages with different "
-                << "descriptors. "
-                << descriptor1->full_name() << " vs "
+                << "descriptors. " << descriptor1->full_name() << " vs "
                 << descriptor2->full_name();
     return false;
   }
@@ -577,11 +563,6 @@
   const Reflection* reflection1 = message1.GetReflection();
   const Reflection* reflection2 = message2.GetReflection();
 
-  std::vector<const FieldDescriptor*> message1_fields =
-      RetrieveFields(message1, true);
-  std::vector<const FieldDescriptor*> message2_fields =
-      RetrieveFields(message2, false);
-
   bool unknown_compare_result = true;
   // Ignore unknown fields in EQUIVALENT mode
   if (message_field_comparison_ != EQUIVALENT) {
@@ -589,9 +570,8 @@
         &reflection1->GetUnknownFields(message1);
     const UnknownFieldSet* unknown_field_set2 =
         &reflection2->GetUnknownFields(message2);
-    if (!CompareUnknownFields(message1, message2,
-                              *unknown_field_set1, *unknown_field_set2,
-                              parent_fields)) {
+    if (!CompareUnknownFields(message1, message2, *unknown_field_set1,
+                              *unknown_field_set2, parent_fields)) {
       if (reporter_ == NULL) {
         return false;
       };
@@ -599,6 +579,11 @@
     }
   }
 
+  std::vector<const FieldDescriptor*> message1_fields =
+      RetrieveFields(message1, true);
+  std::vector<const FieldDescriptor*> message2_fields =
+      RetrieveFields(message2, false);
+
   return CompareRequestedFieldsUsingSettings(
       message1, message2,
       message1_fields, message2_fields,
@@ -751,8 +736,9 @@
 
       if (reporter_ != NULL) {
         assert(field1 != NULL);
-        int count = field1->is_repeated() ?
-            reflection1->FieldSize(message1, field1) : 1;
+        int count = field1->is_repeated()
+                        ? reflection1->FieldSize(message1, field1)
+                        : 1;
 
         for (int i = 0; i < count; ++i) {
           SpecificField specific_field;
@@ -791,8 +777,9 @@
       }
 
       if (reporter_ != NULL) {
-        int count = field2->is_repeated() ?
-            reflection2->FieldSize(message2, field2) : 1;
+        int count = field2->is_repeated()
+                        ? reflection2->FieldSize(message2, field2)
+                        : 1;
 
         for (int i = 0; i < count; ++i) {
           SpecificField specific_field;
@@ -837,8 +824,8 @@
     bool fieldDifferent = false;
     assert(field1 != NULL);
     if (field1->is_repeated()) {
-      fieldDifferent = !CompareRepeatedField(message1, message2, field1,
-                                             parent_fields);
+      fieldDifferent =
+          !CompareRepeatedField(message1, message2, field1, parent_fields);
       if (fieldDifferent) {
         if (reporter_ == NULL) return false;
         isDifferent = true;
@@ -881,9 +868,9 @@
     Reporter* reporter, int index1, int index2) {
   std::vector<SpecificField> current_parent_fields(parent_fields);
   if (repeated_field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
-    return CompareFieldValueUsingParentFields(
-        *message1, *message2, repeated_field, index1, index2,
-        &current_parent_fields);
+    return CompareFieldValueUsingParentFields(*message1, *message2,
+                                              repeated_field, index1, index2,
+                                              &current_parent_fields);
   }
   // Back up the Reporter and output_string_.  They will be reset in the
   // following code.
@@ -894,9 +881,9 @@
   bool match;
 
   if (key_comparator == NULL) {
-    match = CompareFieldValueUsingParentFields(
-        *message1, *message2, repeated_field, index1, index2,
-        &current_parent_fields);
+    match = CompareFieldValueUsingParentFields(*message1, *message2,
+                                               repeated_field, index1, index2,
+                                               &current_parent_fields);
   } else {
     const Reflection* reflection1 = message1->GetReflection();
     const Reflection* reflection2 = message2->GetReflection();
@@ -918,8 +905,7 @@
 }
 
 bool MessageDifferencer::CompareRepeatedField(
-    const Message& message1,
-    const Message& message2,
+    const Message& message1, const Message& message2,
     const FieldDescriptor* repeated_field,
     std::vector<SpecificField>* parent_fields) {
   // the input FieldDescriptor is guaranteed to be repeated field.
@@ -1048,8 +1034,7 @@
 bool MessageDifferencer::CompareFieldValue(const Message& message1,
                                            const Message& message2,
                                            const FieldDescriptor* field,
-                                           int index1,
-                                           int index2) {
+                                           int index1, int index2) {
   return CompareFieldValueUsingParentFields(message1, message2, field, index1,
                                             index2, NULL);
 }
@@ -1068,12 +1053,14 @@
     // methods.
     const Reflection* reflection1 = message1.GetReflection();
     const Reflection* reflection2 = message2.GetReflection();
-    const Message& m1 = field->is_repeated() ?
-        reflection1->GetRepeatedMessage(message1, field, index1) :
-        reflection1->GetMessage(message1, field);
-    const Message& m2 = field->is_repeated() ?
-        reflection2->GetRepeatedMessage(message2, field, index2) :
-        reflection2->GetMessage(message2, field);
+    const Message& m1 =
+        field->is_repeated()
+            ? reflection1->GetRepeatedMessage(message1, field, index1)
+            : reflection1->GetMessage(message1, field);
+    const Message& m2 =
+        field->is_repeated()
+            ? reflection2->GetRepeatedMessage(message2, field, index2)
+            : reflection2->GetMessage(message2, field);
 
     // parent_fields is used in calls to Reporter methods.
     if (parent_fields != NULL) {
@@ -1134,12 +1121,11 @@
 
 bool MessageDifferencer::IsTreatedAsSubset(const FieldDescriptor* field) {
   return scope_ == PARTIAL &&
-      (IsTreatedAsSet(field) || GetMapKeyComparator(field) != NULL);
+         (IsTreatedAsSet(field) || GetMapKeyComparator(field) != NULL);
 }
 
 bool MessageDifferencer::IsIgnored(
-    const Message& message1,
-    const Message& message2,
+    const Message& message1, const Message& message2,
     const FieldDescriptor* field,
     const std::vector<SpecificField>& parent_fields) {
   if (ignored_fields_.find(field) != ignored_fields_.end()) {
@@ -1282,8 +1268,13 @@
   int index1 = 0;
   int index2 = 0;
   while (index1 < fields1.size() || index2 < fields2.size()) {
-    enum { ADDITION, DELETION, MODIFICATION, COMPARE_GROUPS,
-      NO_CHANGE } change_type;
+    enum {
+      ADDITION,
+      DELETION,
+      MODIFICATION,
+      COMPARE_GROUPS,
+      NO_CHANGE
+    } change_type;
 
     // focus_field is the field we're currently reporting on.  (In the case
     // of a modification, it's the field on the left side.)
@@ -1292,7 +1283,7 @@
 
     if (index2 == fields2.size() ||
         (index1 < fields1.size() &&
-          is_before(fields1[index1], fields2[index2]))) {
+         is_before(fields1[index1], fields2[index2]))) {
       // fields1[index1] is not present in fields2.
       change_type = DELETION;
       focus_field = fields1[index1].second;
@@ -1414,10 +1405,9 @@
         ++index2;
         break;
       case COMPARE_GROUPS:
-        if (!CompareUnknownFields(message1, message2,
-                                  fields1[index1].second->group(),
-                                  fields2[index2].second->group(),
-                                  parent_field)) {
+        if (!CompareUnknownFields(
+                message1, message2, fields1[index1].second->group(),
+                fields2[index2].second->group(), parent_field)) {
           if (reporter_ == NULL) return false;
           is_different = true;
           reporter_->ReportModified(message1, message2, *parent_field);
@@ -1461,6 +1451,7 @@
   // If early_return is true, this method will return 0 immediately when it
   // finds that not all nodes on the left side can be matched.
   int FindMaximumMatch(bool early_return);
+
  private:
   // Determines whether the node on the left side of the bipartial graph
   // matches the one on the right side.
@@ -1582,20 +1573,17 @@
 
   bool success = true;
   // Find potential match if this is a special repeated field.
-  if (key_comparator != nullptr ||
-      IsTreatedAsSet(repeated_field) ||
+  if (key_comparator != nullptr || IsTreatedAsSet(repeated_field) ||
       IsTreatedAsSmartSet(repeated_field) ||
       IsTreatedAsSmartList(repeated_field)) {
     if (scope_ == PARTIAL) {
       // When partial matching is enabled, Compare(a, b) && Compare(a, c)
       // doesn't necessarily imply Compare(b, c). Therefore a naive greedy
       // algorithm will fail to find a maximum matching.
-      // Here we use the argumenting path algorithm.
-      MaximumMatcher::NodeMatchCallback* callback =
-          ::google::protobuf::NewPermanentCallback(
-              this, &MessageDifferencer::IsMatch,
-              repeated_field, key_comparator,
-              &message1, &message2, parent_fields, nullptr);
+      // Here we use the augmenting path algorithm.
+      MaximumMatcher::NodeMatchCallback* callback = ::google::protobuf::NewPermanentCallback(
+          this, &MessageDifferencer::IsMatch, repeated_field, key_comparator,
+          &message1, &message2, parent_fields, nullptr);
       MaximumMatcher matcher(count1, count2, callback, match_list1,
                              match_list2);
       // If diff info is not needed, we should end the matching process as
@@ -1637,13 +1625,12 @@
 
           if (is_treated_as_smart_set) {
             num_diffs_reporter.Reset();
-            match = IsMatch(repeated_field, key_comparator,
-                            &message1, &message2, parent_fields,
-                            &num_diffs_reporter, i, j);
+            match =
+                IsMatch(repeated_field, key_comparator, &message1, &message2,
+                        parent_fields, &num_diffs_reporter, i, j);
           } else {
-            match = IsMatch(repeated_field, key_comparator,
-                            &message1, &message2, parent_fields,
-                            nullptr, i, j);
+            match = IsMatch(repeated_field, key_comparator, &message1,
+                            &message2, parent_fields, nullptr, i, j);
           }
 
           if (is_treated_as_smart_set) {
@@ -1704,15 +1691,16 @@
     const Message& message1, const Message& message2,
     const FieldDescriptor* field, int index1, int index2,
     const FieldContext* field_context) {
-  FieldComparator* comparator = field_comparator_ != NULL ?
-      field_comparator_ : &default_field_comparator_;
-  return comparator->Compare(message1, message2, field,
-                             index1, index2, field_context);
+  FieldComparator* comparator = field_comparator_ != NULL
+                                    ? field_comparator_
+                                    : &default_field_comparator_;
+  return comparator->Compare(message1, message2, field, index1, index2,
+                             field_context);
 }
 
 // ===========================================================================
 
-MessageDifferencer::Reporter::Reporter() { }
+MessageDifferencer::Reporter::Reporter() {}
 MessageDifferencer::Reporter::~Reporter() {}
 
 // ===========================================================================
@@ -1730,14 +1718,15 @@
 // Note that the printer's delimiter is not used, because if we are given a
 // printer, we don't know its delimiter.
 MessageDifferencer::StreamReporter::StreamReporter(
-    io::ZeroCopyOutputStream* output) : printer_(new io::Printer(output, '$')),
-                                        delete_printer_(true),
-                                        report_modified_aggregates_(false) { }
+    io::ZeroCopyOutputStream* output)
+    : printer_(new io::Printer(output, '$')),
+      delete_printer_(true),
+      report_modified_aggregates_(false) {}
 
-MessageDifferencer::StreamReporter::StreamReporter(
-    io::Printer* printer) : printer_(printer),
-                            delete_printer_(false),
-                            report_modified_aggregates_(false) { }
+MessageDifferencer::StreamReporter::StreamReporter(io::Printer* printer)
+    : printer_(printer),
+      delete_printer_(false),
+      report_modified_aggregates_(false) {}
 
 MessageDifferencer::StreamReporter::~StreamReporter() {
   if (delete_printer_) delete printer_;
@@ -1754,8 +1743,7 @@
 
     if (specific_field.field != NULL) {
       if (specific_field.field->is_extension()) {
-        printer_->Print("($name$)", "name",
-                        specific_field.field->full_name());
+        printer_->Print("($name$)", "name", specific_field.field->full_name());
       } else {
         printer_->PrintRaw(specific_field.field->name());
       }
@@ -1782,10 +1770,9 @@
   PrintPath(field_path, left_side);
 }
 
-void MessageDifferencer::
-StreamReporter::PrintValue(const Message& message,
-                           const std::vector<SpecificField>& field_path,
-                           bool left_side) {
+void MessageDifferencer::StreamReporter::PrintValue(
+    const Message& message, const std::vector<SpecificField>& field_path,
+    bool left_side) {
   const SpecificField& specific_field = field_path.back();
   const FieldDescriptor* field = specific_field.field;
   if (field != NULL) {
@@ -1793,9 +1780,10 @@
     int index = left_side ? specific_field.index : specific_field.new_index;
     if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
       const Reflection* reflection = message.GetReflection();
-      const Message& field_message = field->is_repeated() ?
-          reflection->GetRepeatedMessage(message, field, index) :
-          reflection->GetMessage(message, field);
+      const Message& field_message =
+          field->is_repeated()
+              ? reflection->GetRepeatedMessage(message, field, index)
+              : reflection->GetMessage(message, field);
       output = field_message.ShortDebugString();
       if (output.empty()) {
         printer_->Print("{ }");
@@ -1808,19 +1796,17 @@
     }
   } else {
     const UnknownFieldSet* unknown_fields =
-        (left_side ?
-         specific_field.unknown_field_set1 :
-         specific_field.unknown_field_set2);
-    const UnknownField* unknown_field = &unknown_fields->field(
-        left_side ?
-        specific_field.unknown_field_index1 :
-        specific_field.unknown_field_index2);
+        (left_side ? specific_field.unknown_field_set1
+                   : specific_field.unknown_field_set2);
+    const UnknownField* unknown_field =
+        &unknown_fields->field(left_side ? specific_field.unknown_field_index1
+                                         : specific_field.unknown_field_index2);
     PrintUnknownFieldValue(unknown_field);
   }
 }
 
-void MessageDifferencer::
-StreamReporter::PrintUnknownFieldValue(const UnknownField* unknown_field) {
+void MessageDifferencer::StreamReporter::PrintUnknownFieldValue(
+    const UnknownField* unknown_field) {
   GOOGLE_CHECK(unknown_field != NULL) << " Cannot print NULL unknown_field.";
 
   std::string output;
@@ -1837,8 +1823,8 @@
           "0x", strings::Hex(unknown_field->fixed64(), strings::ZERO_PAD_16));
       break;
     case UnknownField::TYPE_LENGTH_DELIMITED:
-      output = StringPrintf("\"%s\"",
-          CEscape(unknown_field->length_delimited()).c_str());
+      output = StringPrintf(
+          "\"%s\"", CEscape(unknown_field->length_delimited()).c_str());
       break;
     case UnknownField::TYPE_GROUP:
       // TODO(kenton):  Print the contents of the group like we do for
@@ -1855,8 +1841,7 @@
 }
 
 void MessageDifferencer::StreamReporter::ReportAdded(
-    const Message& message1,
-    const Message& message2,
+    const Message& message1, const Message& message2,
     const std::vector<SpecificField>& field_path) {
   printer_->Print("added: ");
   PrintPath(field_path, false, message2);
@@ -1866,8 +1851,7 @@
 }
 
 void MessageDifferencer::StreamReporter::ReportDeleted(
-    const Message& message1,
-    const Message& message2,
+    const Message& message1, const Message& message2,
     const std::vector<SpecificField>& field_path) {
   printer_->Print("deleted: ");
   PrintPath(field_path, true, message1);
@@ -1877,8 +1861,7 @@
 }
 
 void MessageDifferencer::StreamReporter::ReportModified(
-    const Message& message1,
-    const Message& message2,
+    const Message& message1, const Message& message2,
     const std::vector<SpecificField>& field_path) {
   if (!report_modified_aggregates_ && field_path.back().field == NULL) {
     if (field_path.back().unknown_field_type == UnknownField::TYPE_GROUP) {
@@ -1907,8 +1890,7 @@
 }
 
 void MessageDifferencer::StreamReporter::ReportMoved(
-    const Message& message1,
-    const Message& message2,
+    const Message& message1, const Message& message2,
     const std::vector<SpecificField>& field_path) {
   printer_->Print("moved: ");
   PrintPath(field_path, true, message1);
@@ -1920,8 +1902,7 @@
 }
 
 void MessageDifferencer::StreamReporter::ReportMatched(
-    const Message& message1,
-    const Message& message2,
+    const Message& message1, const Message& message2,
     const std::vector<SpecificField>& field_path) {
   printer_->Print("matched: ");
   PrintPath(field_path, true, message1);
@@ -1935,8 +1916,7 @@
 }
 
 void MessageDifferencer::StreamReporter::ReportIgnored(
-    const Message& message1,
-    const Message& message2,
+    const Message& message1, const Message& message2,
     const std::vector<SpecificField>& field_path) {
   printer_->Print("ignored: ");
   PrintPath(field_path, true, message1);
@@ -1965,7 +1945,6 @@
   return new MultipleFieldsMapKeyComparator(this, key_field_paths);
 }
 
-
 }  // namespace util
 }  // namespace protobuf
 }  // namespace google
diff --git a/src/google/protobuf/util/message_differencer.h b/src/google/protobuf/util/message_differencer.h
index 7504227..e36a72b 100644
--- a/src/google/protobuf/util/message_differencer.h
+++ b/src/google/protobuf/util/message_differencer.h
@@ -48,7 +48,7 @@
 #include <string>
 #include <vector>
 #include <google/protobuf/descriptor.h>  // FieldDescriptor
-#include <google/protobuf/message.h>  // Message
+#include <google/protobuf/message.h>     // Message
 #include <google/protobuf/unknown_field_set.h>
 #include <google/protobuf/util/field_comparator.h>
 
@@ -70,7 +70,6 @@
 class DefaultFieldComparator;
 class FieldContext;  // declared below MessageDifferencer
 
-
 // A basic differencer that can be used to determine
 // the differences between two specified Protocol Messages. If any differences
 // are found, the Compare method will return false, and any differencer reporter
@@ -224,20 +223,17 @@
     virtual ~Reporter();
 
     // Reports that a field has been added into Message2.
-    virtual void ReportAdded(
-        const Message& message1, const Message& message2,
-        const std::vector<SpecificField>& field_path) = 0;
+    virtual void ReportAdded(const Message& message1, const Message& message2,
+                             const std::vector<SpecificField>& field_path) = 0;
 
     // Reports that a field has been deleted from Message1.
     virtual void ReportDeleted(
-        const Message& message1,
-        const Message& message2,
+        const Message& message1, const Message& message2,
         const std::vector<SpecificField>& field_path) = 0;
 
     // Reports that the value of a field has been modified.
     virtual void ReportModified(
-        const Message& message1,
-        const Message& message2,
+        const Message& message1, const Message& message2,
         const std::vector<SpecificField>& field_path) = 0;
 
     // Reports that a repeated field has been moved to another location.  This
@@ -246,18 +242,16 @@
     // mutually exclusive. If a field has been both moved and modified, then
     // only ReportModified will be called.
     virtual void ReportMoved(
-        const Message& /* message1 */,
-        const Message& /* message2 */,
-        const std::vector<SpecificField>& /* field_path */) { }
+        const Message& /* message1 */, const Message& /* message2 */,
+        const std::vector<SpecificField>& /* field_path */) {}
 
     // Reports that two fields match. Useful for doing side-by-side diffs.
     // This function is mutually exclusive with ReportModified and ReportMoved.
     // Note that you must call set_report_matches(true) before calling Compare
     // to make use of this function.
     virtual void ReportMatched(
-        const Message& /* message1 */,
-        const Message& /* message2 */,
-        const std::vector<SpecificField>& /* field_path */) { }
+        const Message& /* message1 */, const Message& /* message2 */,
+        const std::vector<SpecificField>& /* field_path */) {}
 
     // Reports that two fields would have been compared, but the
     // comparison has been skipped because the field was marked as
@@ -279,9 +273,8 @@
     // the fields are equal or not (perhaps with a second call to
     // Compare()), if it cares.
     virtual void ReportIgnored(
-        const Message& /* message1 */,
-        const Message& /* message2 */,
-        const std::vector<SpecificField>& /* field_path */) { }
+        const Message& /* message1 */, const Message& /* message2 */,
+        const std::vector<SpecificField>& /* field_path */) {}
 
     // Report that an unknown field is ignored. (see comment above).
     // Note this is a different function since the last SpecificField in field
@@ -302,8 +295,7 @@
     virtual ~MapKeyComparator();
 
     virtual bool IsMatch(
-        const Message& /* message1 */,
-        const Message& /* message2 */,
+        const Message& /* message1 */, const Message& /* message2 */,
         const std::vector<SpecificField>& /* parent_fields */) const {
       GOOGLE_CHECK(false) << "IsMatch() is not implemented.";
       return false;
@@ -326,8 +318,7 @@
 
     // Returns true if the field should be ignored.
     virtual bool IsIgnored(
-        const Message& /* message1 */,
-        const Message& /* message2 */,
+        const Message& /* message1 */, const Message& /* message2 */,
         const FieldDescriptor* /* field */,
         const std::vector<SpecificField>& /* parent_fields */) = 0;
 
@@ -372,13 +363,13 @@
   };
 
   enum RepeatedFieldComparison {
-    AS_LIST,      // Repeated fields are compared in order.  Differing values at
-                  // the same index are reported using ReportModified().  If the
-                  // repeated fields have different numbers of elements, the
-                  // unpaired elements are reported using ReportAdded() or
-                  // ReportDeleted().
-    AS_SET,       // Treat all the repeated fields as sets.
-                  // See TreatAsSet(), as below.
+    AS_LIST,  // Repeated fields are compared in order.  Differing values at
+              // the same index are reported using ReportModified().  If the
+              // repeated fields have different numbers of elements, the
+              // unpaired elements are reported using ReportAdded() or
+              // ReportDeleted().
+    AS_SET,   // Treat all the repeated fields as sets.
+              // See TreatAsSet(), as below.
     AS_SMART_LIST,  // Similar to AS_SET, but preserve the order and find the
                     // longest matching sequence from the first matching
                     // element. To use an optimal solution, call
@@ -484,9 +475,8 @@
   // first key matching step. Rather than comparing some specified fields, it
   // will invoke the IsMatch method of the given 'key_comparator' to decide if
   // two elements have the same key.
-  void TreatAsMapUsingKeyComparator(
-      const FieldDescriptor* field,
-      const MapKeyComparator* key_comparator);
+  void TreatAsMapUsingKeyComparator(const FieldDescriptor* field,
+                                    const MapKeyComparator* key_comparator);
 
   // Initiates and returns a new instance of MultipleFieldsMapKeyComparator.
   MapKeyComparator* CreateMultipleFieldsMapKeyComparator(
@@ -543,9 +533,7 @@
   // Tells the differencer whether or not to report moves (in a set or map
   // repeated field). This method must be called before Compare. The default for
   // a new differencer is true.
-  void set_report_moves(bool report_moves) {
-    report_moves_ = report_moves;
-  }
+  void set_report_moves(bool report_moves) { report_moves_ = report_moves; }
 
   // Tells the differencer whether or not to report ignored values. This method
   // must be called before Compare. The default for a new differencer is true.
@@ -757,11 +745,8 @@
                             std::vector<SpecificField>* parent_fields);
 
   // Shorthand for CompareFieldValueUsingParentFields with NULL parent_fields.
-  bool CompareFieldValue(const Message& message1,
-                         const Message& message2,
-                         const FieldDescriptor* field,
-                         int index1,
-                         int index2);
+  bool CompareFieldValue(const Message& message1, const Message& message2,
+                         const FieldDescriptor* field, int index1, int index2);
 
   // Compares the specified field on the two messages, returning
   // true if they are the same, false otherwise. For repeated fields,
@@ -773,11 +758,8 @@
   // To avoid confusing users you should not set it to NULL unless you modified
   // Reporter to handle the change of parent_fields correctly.
   bool CompareFieldValueUsingParentFields(
-      const Message& message1,
-      const Message& message2,
-      const FieldDescriptor* field,
-      int index1,
-      int index2,
+      const Message& message1, const Message& message2,
+      const FieldDescriptor* field, int index1, int index2,
       std::vector<SpecificField>* parent_fields);
 
   // Compares the specified field on the two messages, returning comparison
@@ -791,8 +773,8 @@
   // if the key_comprator is NULL, this function returns true when the two
   // elements are equal.
   bool IsMatch(const FieldDescriptor* repeated_field,
-               const MapKeyComparator* key_comparator,
-               const Message* message1, const Message* message2,
+               const MapKeyComparator* key_comparator, const Message* message1,
+               const Message* message2,
                const std::vector<SpecificField>& parent_fields,
                Reporter* reporter, int index1, int index2);
 
@@ -816,11 +798,9 @@
 
   // Returns true if this field is to be ignored when this
   // MessageDifferencer compares messages.
-  bool IsIgnored(
-      const Message& message1,
-      const Message& message2,
-      const FieldDescriptor* field,
-      const std::vector<SpecificField>& parent_fields);
+  bool IsIgnored(const Message& message1, const Message& message2,
+                 const FieldDescriptor* field,
+                 const std::vector<SpecificField>& parent_fields);
 
   // Returns true if this unknown field is to be ignored when this
   // MessageDifferencer compares messages.
@@ -841,12 +821,10 @@
   // that the comparison succeeds when this method returns true (you need to
   // double-check in this case).
   bool MatchRepeatedFieldIndices(
-      const Message& message1,
-      const Message& message2,
+      const Message& message1, const Message& message2,
       const FieldDescriptor* repeated_field,
       const std::vector<SpecificField>& parent_fields,
-      std::vector<int>* match_list1,
-      std::vector<int>* match_list2);
+      std::vector<int>* match_list1, std::vector<int>* match_list2);
 
   // If "any" is of type google.protobuf.Any, extract its payload using
   // DynamicMessageFactory and store in "data".
@@ -863,8 +841,8 @@
 
   // Defines a map between field descriptors and their MapKeyComparators.
   // Used for repeated fields when they are configured as TreatAsMap.
-  typedef std::map<const FieldDescriptor*,
-              const MapKeyComparator*> FieldKeyComparatorMap;
+  typedef std::map<const FieldDescriptor*, const MapKeyComparator*>
+      FieldKeyComparatorMap;
 
   // Defines a set to store field descriptors.  Used for repeated fields when
   // they are configured as TreatAsSet.
@@ -899,8 +877,8 @@
   std::string* output_string_;
 
   // Callback to post-process the matched indices to support SMART_LIST.
-  std::function<void(std::vector<int>*,
-                     std::vector<int>*)> match_indices_for_smart_list_callback_;
+  std::function<void(std::vector<int>*, std::vector<int>*)>
+      match_indices_for_smart_list_callback_;
 
   std::unique_ptr<DynamicMessageFactory> dynamic_message_factory_;
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageDifferencer);
diff --git a/src/google/protobuf/util/message_differencer_unittest.cc b/src/google/protobuf/util/message_differencer_unittest.cc
index cacfc1f..702f99f 100644
--- a/src/google/protobuf/util/message_differencer_unittest.cc
+++ b/src/google/protobuf/util/message_differencer_unittest.cc
@@ -41,18 +41,18 @@
 
 #include <google/protobuf/stubs/strutil.h>
 
-#include <google/protobuf/util/field_comparator.h>
-#include <google/protobuf/util/message_differencer.h>
-#include <google/protobuf/util/message_differencer_unittest.pb.h>
+#include <google/protobuf/any_test.pb.h>
+#include <google/protobuf/map_test_util.h>
+#include <google/protobuf/map_unittest.pb.h>
+#include <google/protobuf/test_util.h>
+#include <google/protobuf/unittest.pb.h>
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
 #include <google/protobuf/text_format.h>
 #include <google/protobuf/wire_format.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/io/coded_stream.h>
-#include <google/protobuf/any_test.pb.h>
-#include <google/protobuf/map_unittest.pb.h>
-#include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/map_test_util.h>
-#include <google/protobuf/test_util.h>
+#include <google/protobuf/util/message_differencer_unittest.pb.h>
+#include <google/protobuf/util/field_comparator.h>
+#include <google/protobuf/util/message_differencer.h>
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
@@ -79,8 +79,7 @@
 }
 
 void ExpectEqualsWithDifferencer(util::MessageDifferencer* differencer,
-                                 const Message& msg1,
-                                 const Message& msg2) {
+                                 const Message& msg1, const Message& msg2) {
   differencer->set_scope(util::MessageDifferencer::FULL);
   EXPECT_TRUE(differencer->Compare(msg1, msg2));
 
@@ -298,7 +297,6 @@
   EXPECT_FALSE(util::MessageDifferencer::Equivalent(msg1, msg2));
 }
 
-
 TEST(MessageDifferencerTest, BasicEquivalencyNonSetTest) {
   // Create the testing protos
   unittest::TestAllTypes msg1;
@@ -308,7 +306,6 @@
   EXPECT_TRUE(util::MessageDifferencer::Equivalent(msg1, msg2));
 }
 
-
 TEST(MessageDifferencerTest, BasicInequivalencyNonSetTest) {
   // Create the testing protos
   unittest::TestAllTypes msg1;
@@ -320,7 +317,6 @@
   EXPECT_FALSE(util::MessageDifferencer::Equivalent(msg1, msg2));
 }
 
-
 TEST(MessageDifferencerTest, BasicPartialEquivalencyTest) {
   // Create the testing protos
   unittest::TestAllTypes msg1;
@@ -479,8 +475,7 @@
   TestUtil::SetAllFields(&msg2);
 
   // Compare
-  EXPECT_TRUE(util::MessageDifferencer::ApproximatelyEquivalent(msg1,
-                                                                msg2));
+  EXPECT_TRUE(util::MessageDifferencer::ApproximatelyEquivalent(msg1, msg2));
 }
 
 TEST(MessageDifferencerTest, ApproximateModifiedEquivalencyTest) {
@@ -501,8 +496,7 @@
   ASSERT_NE(v1, v2) << "Should not be the same: " << v1 << ", " << v2;
   ASSERT_FLOAT_EQ(v1, v2) << "Should be approx. equal: " << v1 << ", " << v2;
   EXPECT_FALSE(util::MessageDifferencer::Equals(msg1, msg2));
-  EXPECT_TRUE(util::MessageDifferencer::ApproximatelyEquivalent(msg1,
-                                                                msg2));
+  EXPECT_TRUE(util::MessageDifferencer::ApproximatelyEquivalent(msg1, msg2));
 
   // Modify the equivalency requirement too
   msg1.clear_optional_int32();
@@ -512,8 +506,7 @@
   EXPECT_FALSE(util::MessageDifferencer::Equals(msg1, msg2));
   EXPECT_FALSE(util::MessageDifferencer::Equivalent(msg1, msg2));
   EXPECT_FALSE(util::MessageDifferencer::ApproximatelyEquals(msg1, msg2));
-  EXPECT_TRUE(util::MessageDifferencer::ApproximatelyEquivalent(msg1,
-                                                                msg2));
+  EXPECT_TRUE(util::MessageDifferencer::ApproximatelyEquivalent(msg1, msg2));
 }
 
 TEST(MessageDifferencerTest, ApproximateInequivalencyTest) {
@@ -526,22 +519,19 @@
 
   // Should fail on equivalency
   msg1.set_optional_int32(-1);
-  EXPECT_FALSE(util::MessageDifferencer::ApproximatelyEquivalent(msg1,
-                                                                 msg2));
+  EXPECT_FALSE(util::MessageDifferencer::ApproximatelyEquivalent(msg1, msg2));
 
   // Make these fields the same again.
   msg1.set_optional_int32(0);
   msg2.set_optional_int32(0);
-  EXPECT_TRUE(util::MessageDifferencer::ApproximatelyEquivalent(msg1,
-                                                                msg2));
+  EXPECT_TRUE(util::MessageDifferencer::ApproximatelyEquivalent(msg1, msg2));
 
   // Should fail on approximate equality check
   const float v1 = 2.3f;
   const float v2 = 9.3f;
   msg1.set_optional_float(v1);
   msg2.set_optional_float(v2);
-  EXPECT_FALSE(util::MessageDifferencer::ApproximatelyEquivalent(msg1,
-                                                                 msg2));
+  EXPECT_FALSE(util::MessageDifferencer::ApproximatelyEquivalent(msg1, msg2));
 }
 
 TEST(MessageDifferencerTest, WithinFractionOrMarginFloatTest) {
@@ -715,7 +705,6 @@
   EXPECT_TRUE(util::MessageDifferencer::Equals(msg1, msg2));
 }
 
-
 TEST(MessageDifferencerTest, BasicFieldOrderingInequalityTest) {
   // Create the testing protos
   unittest::TestFieldOrderings msg1;
@@ -743,7 +732,6 @@
   EXPECT_TRUE(util::MessageDifferencer::Equals(msg1, msg2));
 }
 
-
 TEST(MessageDifferencerTest, BasicExtensionInequalityTest) {
   // Create the testing protos
   unittest::TestAllExtensions msg1;
@@ -845,12 +833,12 @@
   std::vector<const FieldDescriptor*> empty_fields;
 
   util::MessageDifferencer differencer;
-  EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2,
-                                            empty_fields, empty_fields));
+  EXPECT_TRUE(
+      differencer.CompareWithFields(msg1, msg2, empty_fields, empty_fields));
 
   TestUtil::SetAllFields(&msg2);
-  EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2,
-                                            empty_fields, empty_fields));
+  EXPECT_TRUE(
+      differencer.CompareWithFields(msg1, msg2, empty_fields, empty_fields));
 }
 
 TEST(MessageDifferencerTest, SpecifiedFieldsCompareWithSelf) {
@@ -871,8 +859,8 @@
         compare_fields.push_back(fields[i]);
       }
     }
-    EXPECT_TRUE(differencer.CompareWithFields(msg1, msg1,
-                                              compare_fields, compare_fields));
+    EXPECT_TRUE(differencer.CompareWithFields(msg1, msg1, compare_fields,
+                                              compare_fields));
   }
   {
     // Specify a different set of fields to compare, even though we're using the
@@ -887,8 +875,8 @@
         compare_fields2.push_back(fields[i]);
       }
     }
-    EXPECT_FALSE(differencer.CompareWithFields(
-        msg1, msg1, compare_fields1, compare_fields2));
+    EXPECT_FALSE(differencer.CompareWithFields(msg1, msg1, compare_fields1,
+                                               compare_fields2));
   }
 }
 
@@ -934,8 +922,8 @@
   }
 
   util::MessageDifferencer differencer;
-  EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2,
-                                            compare_fields, compare_fields));
+  EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, compare_fields,
+                                            compare_fields));
 }
 
 TEST(MessageDifferencerTest,
@@ -964,8 +952,8 @@
 
   util::MessageDifferencer differencer;
   EXPECT_FALSE(differencer.Compare(msg1, msg2));
-  EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2,
-                                            compare_fields, compare_fields));
+  EXPECT_TRUE(differencer.CompareWithFields(msg1, msg2, compare_fields,
+                                            compare_fields));
 }
 
 TEST(MessageDifferencerTest, SpecifiedFieldsDetectsDifferencesTest) {
@@ -989,8 +977,8 @@
   }
 
   util::MessageDifferencer differencer;
-  EXPECT_FALSE(differencer.CompareWithFields(msg1, msg2,
-                                             compare_fields, compare_fields));
+  EXPECT_FALSE(differencer.CompareWithFields(msg1, msg2, compare_fields,
+                                             compare_fields));
 }
 
 TEST(MessageDifferencerTest, SpecifiedFieldsEquivalenceAllTest) {
@@ -1080,18 +1068,20 @@
   differencer.set_repeated_field_comparison(
       util::MessageDifferencer::AS_SMART_LIST);
   EXPECT_FALSE(differencer.Compare(msg1, msg2));
-  EXPECT_EQ("deleted: rv[0]: 1\n"
-            "added: rv[0]: 9\n"
-            "added: rv[1]: 0\n"
-            "moved: rv[1] -> rv[2] : 2\n"
-            "added: rv[3]: 7\n"
-            "moved: rv[2] -> rv[4] : 3\n"
-            "deleted: rv[3]: 9\n"
-            "moved: rv[4] -> rv[5] : 4\n"
-            "moved: rv[5] -> rv[6] : 5\n"
-            "deleted: rv[6]: 7\n"
-            "added: rv[7]: 6\n"
-            "moved: rv[7] -> rv[8] : 2\n", diff_report);
+  EXPECT_EQ(
+      "deleted: rv[0]: 1\n"
+      "added: rv[0]: 9\n"
+      "added: rv[1]: 0\n"
+      "moved: rv[1] -> rv[2] : 2\n"
+      "added: rv[3]: 7\n"
+      "moved: rv[2] -> rv[4] : 3\n"
+      "deleted: rv[3]: 9\n"
+      "moved: rv[4] -> rv[5] : 4\n"
+      "moved: rv[5] -> rv[6] : 5\n"
+      "deleted: rv[6]: 7\n"
+      "added: rv[7]: 6\n"
+      "moved: rv[7] -> rv[8] : 2\n",
+      diff_report);
 
   // Compare two sub messages
   // a: 1, 2, 3,    4, 5
@@ -1110,12 +1100,14 @@
   differencer.set_repeated_field_comparison(
       util::MessageDifferencer::AS_SMART_LIST);
   EXPECT_FALSE(differencer.Compare(msg1, msg2));
-  EXPECT_EQ("deleted: rm[0]: { a: 1 }\n"
-            "moved: rm[1] -> rm[0] : { a: 2 }\n"
-            "deleted: rm[2]: { a: 3 }\n"
-            "added: rm[1]: { a: 6 }\n"
-            "moved: rm[3] -> rm[2] : { a: 4 }\n"
-            "deleted: rm[4]: { a: 5 }\n", diff_report);
+  EXPECT_EQ(
+      "deleted: rm[0]: { a: 1 }\n"
+      "moved: rm[1] -> rm[0] : { a: 2 }\n"
+      "deleted: rm[2]: { a: 3 }\n"
+      "added: rm[1]: { a: 6 }\n"
+      "moved: rm[3] -> rm[2] : { a: 4 }\n"
+      "deleted: rm[4]: { a: 5 }\n",
+      diff_report);
 }
 
 TEST(MessageDifferencerTest, RepeatedFieldSmartSetTest) {
@@ -1126,15 +1118,24 @@
   protobuf_unittest::TestField elem1_2, elem2_2, elem3_2;
 
   // Only one field is different for each pair of elememts
-  elem1_1.set_a(1);  elem1_2.set_a(0);
-  elem1_1.set_b(1);  elem1_2.set_b(1);
-  elem1_1.set_c(1);  elem1_2.set_c(1);
-  elem2_1.set_a(2);  elem2_2.set_a(2);
-  elem2_1.set_b(2);  elem2_2.set_b(0);
-  elem2_1.set_c(2);  elem2_2.set_c(2);
-  elem3_1.set_a(3);  elem3_2.set_a(3);
-  elem3_1.set_b(3);  elem3_2.set_b(0);
-  elem3_1.set_c(3);  elem3_2.set_c(3);
+  elem1_1.set_a(1);
+  elem1_2.set_a(0);
+  elem1_1.set_b(1);
+  elem1_2.set_b(1);
+  elem1_1.set_c(1);
+  elem1_2.set_c(1);
+  elem2_1.set_a(2);
+  elem2_2.set_a(2);
+  elem2_1.set_b(2);
+  elem2_2.set_b(0);
+  elem2_1.set_c(2);
+  elem2_2.set_c(2);
+  elem3_1.set_a(3);
+  elem3_2.set_a(3);
+  elem3_1.set_b(3);
+  elem3_2.set_b(0);
+  elem3_1.set_c(3);
+  elem3_2.set_c(3);
 
   *msg1.add_rm() = elem1_1;
   *msg1.add_rm() = elem2_1;
@@ -1150,9 +1151,11 @@
   differencer.set_repeated_field_comparison(
       util::MessageDifferencer::AS_SMART_SET);
   EXPECT_FALSE(differencer.Compare(msg1, msg2));
-  EXPECT_EQ("modified: rm[0].a -> rm[1].a: 1 -> 0\n"
-            "modified: rm[1].b -> rm[2].b: 2 -> 0\n"
-            "modified: rm[2].b -> rm[0].b: 3 -> 0\n", diff_report);
+  EXPECT_EQ(
+      "modified: rm[0].a -> rm[1].a: 1 -> 0\n"
+      "modified: rm[1].b -> rm[2].b: 2 -> 0\n"
+      "modified: rm[2].b -> rm[0].b: 3 -> 0\n",
+      diff_report);
 }
 
 TEST(MessageDifferencerTest, RepeatedFieldSmartSet_MultipleMatches) {
@@ -1166,14 +1169,18 @@
   elem1_1.set_a(1);
   elem1_1.set_b(1);
   elem1_1.set_c(1);
-  elem2_1.set_a(2);  elem2_2.set_a(2);
-  elem2_1.set_b(2);  elem2_2.set_b(0);
-  elem2_1.set_c(2);  elem2_2.set_c(2);
-  elem3_1.set_a(3);  elem3_2.set_a(3);
-  elem3_1.set_b(3);  elem3_2.set_b(0);
-  elem3_1.set_c(3);  elem3_2.set_c(3);
-
-
+  elem2_1.set_a(2);
+  elem2_2.set_a(2);
+  elem2_1.set_b(2);
+  elem2_2.set_b(0);
+  elem2_1.set_c(2);
+  elem2_2.set_c(2);
+  elem3_1.set_a(3);
+  elem3_2.set_a(3);
+  elem3_1.set_b(3);
+  elem3_2.set_b(0);
+  elem3_1.set_c(3);
+  elem3_2.set_c(3);
 
   // In this testcase, elem1_1 will match with elem2_2 first and then get
   // reverted because elem2_1 matches with elem2_2 later.
@@ -1189,9 +1196,11 @@
   differencer.set_repeated_field_comparison(
       util::MessageDifferencer::AS_SMART_SET);
   EXPECT_FALSE(differencer.Compare(msg1, msg2));
-  EXPECT_EQ("modified: rm[1].b -> rm[0].b: 2 -> 0\n"
-            "modified: rm[2].b -> rm[1].b: 3 -> 0\n"
-            "deleted: rm[0]: { c: 1 a: 1 b: 1 }\n", diff_report);
+  EXPECT_EQ(
+      "modified: rm[1].b -> rm[0].b: 2 -> 0\n"
+      "modified: rm[2].b -> rm[1].b: 3 -> 0\n"
+      "deleted: rm[0]: { c: 1 a: 1 b: 1 }\n",
+      diff_report);
 }
 
 TEST(MessageDifferencerTest, RepeatedFieldSmartSet_MultipleMatchesNoReporter) {
@@ -1222,9 +1231,12 @@
   protobuf_unittest::TestDiffMessage msg2;
 
   // Create 3 elements, but in different order.
-  msg1.add_rw("b");  msg2.add_rw("a");
-  msg1.add_rw("x");  msg2.add_rw("x");
-  msg1.add_rw("a");  msg2.add_rw("b");
+  msg1.add_rw("b");
+  msg2.add_rw("a");
+  msg1.add_rw("x");
+  msg2.add_rw("x");
+  msg1.add_rw("a");
+  msg2.add_rw("b");
 
   std::string diff_report;
   util::MessageDifferencer differencer;
@@ -1232,8 +1244,10 @@
   differencer.set_repeated_field_comparison(
       util::MessageDifferencer::AS_SMART_SET);
   EXPECT_TRUE(differencer.Compare(msg1, msg2));
-  EXPECT_EQ("moved: rw[0] -> rw[2] : \"b\"\n"
-            "moved: rw[2] -> rw[0] : \"a\"\n", diff_report);
+  EXPECT_EQ(
+      "moved: rw[0] -> rw[2] : \"b\"\n"
+      "moved: rw[2] -> rw[0] : \"a\"\n",
+      diff_report);
 }
 
 TEST(MessageDifferencerTest, RepeatedFieldSetTest_SetOfSet) {
@@ -1242,22 +1256,34 @@
   protobuf_unittest::TestDiffMessage msg2;
 
   protobuf_unittest::TestDiffMessage::Item* item = msg1.add_item();
-  item->add_ra(1); item->add_ra(2); item->add_ra(3);
+  item->add_ra(1);
+  item->add_ra(2);
+  item->add_ra(3);
   item = msg1.add_item();
-  item->add_ra(5); item->add_ra(6);
+  item->add_ra(5);
+  item->add_ra(6);
   item = msg1.add_item();
-  item->add_ra(1); item->add_ra(3);
+  item->add_ra(1);
+  item->add_ra(3);
   item = msg1.add_item();
-  item->add_ra(6); item->add_ra(7); item->add_ra(8);
+  item->add_ra(6);
+  item->add_ra(7);
+  item->add_ra(8);
 
   item = msg2.add_item();
-  item->add_ra(6); item->add_ra(5);
+  item->add_ra(6);
+  item->add_ra(5);
   item = msg2.add_item();
-  item->add_ra(6); item->add_ra(8); item->add_ra(7);
+  item->add_ra(6);
+  item->add_ra(8);
+  item->add_ra(7);
   item = msg2.add_item();
-  item->add_ra(1); item->add_ra(3);
+  item->add_ra(1);
+  item->add_ra(3);
   item = msg2.add_item();
-  item->add_ra(3); item->add_ra(2); item->add_ra(1);
+  item->add_ra(3);
+  item->add_ra(2);
+  item->add_ra(1);
 
   // Compare
   util::MessageDifferencer differencer;
@@ -1275,29 +1301,41 @@
   // Treat "rw" as List
   protobuf_unittest::TestDiffMessage::Item* item = msg1.add_item();
   item->set_a(3);
-  item->add_ra(1); item->add_ra(2); item->add_ra(3);
+  item->add_ra(1);
+  item->add_ra(2);
+  item->add_ra(3);
   item = msg1.add_item();
   item->set_a(4);
-  item->add_ra(5); item->add_ra(6);
+  item->add_ra(5);
+  item->add_ra(6);
   item = msg1.add_item();
   item->set_a(1);
-  item->add_ra(1); item->add_ra(3);
+  item->add_ra(1);
+  item->add_ra(3);
   item = msg1.add_item();
   item->set_a(2);
-  item->add_ra(6); item->add_ra(7); item->add_ra(8);
+  item->add_ra(6);
+  item->add_ra(7);
+  item->add_ra(8);
 
   item = msg2.add_item();
   item->set_a(4);
-  item->add_ra(6); item->add_ra(5);
+  item->add_ra(6);
+  item->add_ra(5);
   item = msg2.add_item();
   item->set_a(2);
-  item->add_ra(6); item->add_ra(8); item->add_ra(7);
+  item->add_ra(6);
+  item->add_ra(8);
+  item->add_ra(7);
   item = msg2.add_item();
   item->set_a(1);
-  item->add_ra(1); item->add_ra(3);
+  item->add_ra(1);
+  item->add_ra(3);
   item = msg2.add_item();
   item->set_a(3);
-  item->add_ra(3); item->add_ra(2); item->add_ra(1);
+  item->add_ra(3);
+  item->add_ra(2);
+  item->add_ra(1);
 
   msg1.add_rv(3);
   msg1.add_rv(4);
@@ -1308,9 +1346,12 @@
   msg2.add_rv(0);
   msg2.add_rv(7);
 
-  msg1.add_rw("nothing"); msg2.add_rw("nothing");
-  msg1.add_rw("should"); msg2.add_rw("should");
-  msg1.add_rw("change"); msg2.add_rw("change");
+  msg1.add_rw("nothing");
+  msg2.add_rw("nothing");
+  msg1.add_rw("should");
+  msg2.add_rw("should");
+  msg1.add_rw("change");
+  msg2.add_rw("change");
 
   // Compare
   util::MessageDifferencer differencer1;
@@ -1711,9 +1752,8 @@
     : public util::MessageDifferencer::MapKeyComparator {
  public:
   typedef util::MessageDifferencer::SpecificField SpecificField;
-  virtual bool IsMatch(
-      const Message &message1, const Message &message2,
-      const std::vector<SpecificField>& parent_fields) const {
+  virtual bool IsMatch(const Message& message1, const Message& message2,
+                       const std::vector<SpecificField>& parent_fields) const {
     const Reflection* reflection1 = message1.GetReflection();
     const Reflection* reflection2 = message2.GetReflection();
     // FieldDescriptor for item.ra
@@ -1746,8 +1786,8 @@
   item->set_b("hello");
   util::MessageDifferencer differencer;
   ValueProductMapKeyComparator key_comparator;
-  differencer.TreatAsMapUsingKeyComparator(
-      GetFieldDescriptor(msg1, "item"), &key_comparator);
+  differencer.TreatAsMapUsingKeyComparator(GetFieldDescriptor(msg1, "item"),
+                                           &key_comparator);
   std::string output;
   differencer.ReportDifferencesToString(&output);
   // Though the above two messages have different values for item.ra, they
@@ -1936,19 +1976,19 @@
   const FieldDescriptor* c = GetFieldDescriptor(msg1, "c");
   const FieldDescriptor* rc = GetFieldDescriptor(msg1, "rc");
 
-  { // Ignore c
+  {  // Ignore c
     util::MessageDifferencer differencer;
     differencer.IgnoreField(c);
 
     EXPECT_FALSE(differencer.Compare(msg1, msg2));
   }
-  { // Ignore rc
+  {  // Ignore rc
     util::MessageDifferencer differencer;
     differencer.IgnoreField(rc);
 
     EXPECT_FALSE(differencer.Compare(msg1, msg2));
   }
-  { // Ignore both
+  {  // Ignore both
     util::MessageDifferencer differencer;
     differencer.IgnoreField(c);
     differencer.IgnoreField(rc);
@@ -2176,8 +2216,7 @@
                                    const FieldDescriptor* field, int index_1,
                                    int index_2,
                                    const util::FieldContext* field_context) {
-    if (field_context)
-      parent_fields_ = *(field_context->parent_fields());
+    if (field_context) parent_fields_ = *(field_context->parent_fields());
     if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
       return RECURSE;
     } else {
@@ -2229,10 +2268,10 @@
     unknown2_ = empty2_.mutable_unknown_fields();
   }
 
-  ~ComparisonTest() { }
+  ~ComparisonTest() {}
 
   void SetSpecialFieldOption(const Message& message,
-                              util::MessageDifferencer* d) {
+                             util::MessageDifferencer* d) {
     if (!ignored_field_.empty()) {
       d->IgnoreField(GetFieldDescriptor(message, ignored_field_));
     }
@@ -2281,19 +2320,15 @@
 
   std::string RunUn() { return Run(empty1_, empty2_); }
 
-  void use_equivalency() {
-    use_equivalency_ = true;
-  }
+  void use_equivalency() { use_equivalency_ = true; }
 
-  void repeated_field_as_set() {
-    repeated_field_as_set_ = true;
-  }
+  void repeated_field_as_set() { repeated_field_as_set_ = true; }
 
   void field_as_set(const std::string& field) { set_field_ = field; }
 
   void field_as_map(const string& field, const std::string& key) {
     map_field_ = field;
-    map_key_   = key;
+    map_key_ = key;
   }
 
   void ignore_field(const std::string& field) { ignored_field_ = field; }
@@ -2332,44 +2367,40 @@
 TEST_F(ComparisonTest, AdditionTest) {
   proto1_.clear_optional_int32();
 
-  EXPECT_EQ("added: optional_int32: 101\n",
-            Run());
+  EXPECT_EQ("added: optional_int32: 101\n", Run());
 }
 
 TEST_F(ComparisonTest, Addition_OrderTest) {
   orderings_proto1_.clear_my_int();
 
-  EXPECT_EQ("added: my_int: 1\n",
-            RunOrder());
+  EXPECT_EQ("added: my_int: 1\n", RunOrder());
 }
 
 TEST_F(ComparisonTest, DeletionTest) {
   proto2_.clear_optional_int32();
 
-  EXPECT_EQ("deleted: optional_int32: 101\n",
-            Run());
+  EXPECT_EQ("deleted: optional_int32: 101\n", Run());
 }
 
 TEST_F(ComparisonTest, Deletion_OrderTest) {
   orderings_proto2_.clear_my_string();
 
-  EXPECT_EQ("deleted: my_string: \"foo\"\n",
-            RunOrder());
+  EXPECT_EQ("deleted: my_string: \"foo\"\n", RunOrder());
 }
 
 TEST_F(ComparisonTest, RepeatedDeletionTest) {
   proto2_.clear_repeated_int32();
 
-  EXPECT_EQ("deleted: repeated_int32[0]: 201\n"
-            "deleted: repeated_int32[1]: 301\n",
-            Run());
+  EXPECT_EQ(
+      "deleted: repeated_int32[0]: 201\n"
+      "deleted: repeated_int32[1]: 301\n",
+      Run());
 }
 
 TEST_F(ComparisonTest, ModificationTest) {
   proto1_.set_optional_int32(-1);
 
-  EXPECT_EQ("modified: optional_int32: -1 -> 101\n",
-            Run());
+  EXPECT_EQ("modified: optional_int32: -1 -> 101\n", Run());
 }
 
 // Basic equivalency tests.
@@ -2378,8 +2409,7 @@
 
   proto1_.clear_optional_int32();
 
-  EXPECT_EQ("modified: optional_int32: 0 -> 101\n",
-            Run());
+  EXPECT_EQ("modified: optional_int32: 0 -> 101\n", Run());
 }
 
 TEST_F(ComparisonTest, EquivalencyDeletionTest) {
@@ -2387,45 +2417,39 @@
 
   proto2_.clear_optional_int32();
 
-  EXPECT_EQ("modified: optional_int32: 101 -> 0\n",
-            Run());
+  EXPECT_EQ("modified: optional_int32: 101 -> 0\n", Run());
 }
 
 // Group tests.
 TEST_F(ComparisonTest, GroupAdditionTest) {
   proto1_.mutable_optionalgroup()->clear_a();
 
-  EXPECT_EQ("added: optionalgroup.a: 117\n",
-            Run());
+  EXPECT_EQ("added: optionalgroup.a: 117\n", Run());
 }
 
 TEST_F(ComparisonTest, GroupDeletionTest) {
   proto2_.mutable_optionalgroup()->clear_a();
 
-  EXPECT_EQ("deleted: optionalgroup.a: 117\n",
-            Run());
+  EXPECT_EQ("deleted: optionalgroup.a: 117\n", Run());
 }
 
 TEST_F(ComparisonTest, GroupModificationTest) {
   proto1_.mutable_optionalgroup()->set_a(2);
 
-  EXPECT_EQ("modified: optionalgroup.a: 2 -> 117\n",
-            Run());
+  EXPECT_EQ("modified: optionalgroup.a: 2 -> 117\n", Run());
 }
 
 TEST_F(ComparisonTest, GroupFullAdditionTest) {
   proto1_.clear_optionalgroup();
 
   // Note the difference in the output between this and GroupAdditionTest.
-  EXPECT_EQ("added: optionalgroup: { a: 117 }\n",
-            Run());
+  EXPECT_EQ("added: optionalgroup: { a: 117 }\n", Run());
 }
 
 TEST_F(ComparisonTest, GroupFullDeletionTest) {
   proto2_.clear_optionalgroup();
 
-  EXPECT_EQ("deleted: optionalgroup: { a: 117 }\n",
-            Run());
+  EXPECT_EQ("deleted: optionalgroup: { a: 117 }\n", Run());
 }
 
 TEST_F(ComparisonTest, RepeatedSetOptionTest) {
@@ -2440,11 +2464,12 @@
   proto1_.add_repeatedgroup()->set_a(907);
   proto1_.add_repeatedgroup()->set_a(909);
 
-  EXPECT_EQ("moved: repeatedgroup[2] -> repeatedgroup[1] : { a: 907 }\n"
-            "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
-            "deleted: repeatedgroup[0]: { a: 317 }\n"
-            "deleted: repeatedgroup[1]: { a: 904 }\n",
-            Run());
+  EXPECT_EQ(
+      "moved: repeatedgroup[2] -> repeatedgroup[1] : { a: 907 }\n"
+      "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
+      "deleted: repeatedgroup[0]: { a: 317 }\n"
+      "deleted: repeatedgroup[1]: { a: 904 }\n",
+      Run());
 }
 
 TEST_F(ComparisonTest, RepeatedSetOptionTest_Ex) {
@@ -2463,12 +2488,13 @@
   proto1ex_.AddExtension(protobuf_unittest::repeated_nested_message_extension)
       ->set_bb(909);
 
-  EXPECT_EQ("moved: (protobuf_unittest.repeated_nested_message_extension)[2] ->"
-            " (protobuf_unittest.repeated_nested_message_extension)[0] :"
-            " { bb: 909 }\n"
-            "deleted: (protobuf_unittest.repeated_nested_message_extension)[0]:"
-            " { bb: 904 }\n",
-            RunEx());
+  EXPECT_EQ(
+      "moved: (protobuf_unittest.repeated_nested_message_extension)[2] ->"
+      " (protobuf_unittest.repeated_nested_message_extension)[0] :"
+      " { bb: 909 }\n"
+      "deleted: (protobuf_unittest.repeated_nested_message_extension)[0]:"
+      " { bb: 904 }\n",
+      RunEx());
 }
 
 TEST_F(ComparisonTest, RepeatedMapFieldTest_Group) {
@@ -2485,11 +2511,12 @@
   proto2_.add_repeatedgroup()->set_a(318);  // added
   proto2_.add_repeatedgroup()->set_a(907);  // moved to
 
-  EXPECT_EQ("moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
-            "added: repeatedgroup[1]: { a: 318 }\n"
-            "deleted: repeatedgroup[0]: { a: 317 }\n"
-            "deleted: repeatedgroup[1]: { a: 904 }\n",
-            Run());
+  EXPECT_EQ(
+      "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
+      "added: repeatedgroup[1]: { a: 318 }\n"
+      "deleted: repeatedgroup[0]: { a: 317 }\n"
+      "deleted: repeatedgroup[1]: { a: 904 }\n",
+      Run());
 }
 
 TEST_F(ComparisonTest, RepeatedMapFieldTest_MessageKey) {
@@ -2507,10 +2534,11 @@
   item = msg1.add_item();
   item->mutable_m()->set_c(2);
   item->set_b("second");
-  item = msg1.add_item(); item->set_b("null");  // empty key moved
+  item = msg1.add_item();
+  item->set_b("null");  // empty key moved
   item = msg1.add_item();
   item->mutable_m()->set_c(3);
-  item->set_b("third");   // deletion
+  item->set_b("third");  // deletion
   item = msg1.add_item();
   item->mutable_m()->set_c(2);
   item->set_b("second");  // duplicated key ( deletion )
@@ -2522,8 +2550,9 @@
   item->set_b("fourth");  // addition
   item = msg2.add_item();
   item->mutable_m()->set_c(0);
-  item->set_b("fist");    // move with change
-  item = msg2.add_item(); item->set_b("null");
+  item->set_b("fist");  // move with change
+  item = msg2.add_item();
+  item->set_b("null");
 
   EXPECT_EQ(
       "modified: item[0].b -> item[2].b: \"first\" -> \"fist\"\n"
@@ -2542,33 +2571,45 @@
   protobuf_unittest::TestDiffMessage msg2;
 
   protobuf_unittest::TestDiffMessage::Item* item = msg1.add_item();
-  item->add_ra(1); item->add_ra(2); item->add_ra(3);
+  item->add_ra(1);
+  item->add_ra(2);
+  item->add_ra(3);
   item = msg1.add_item();
-  item->add_ra(5); item->add_ra(6);
+  item->add_ra(5);
+  item->add_ra(6);
   item = msg1.add_item();
-  item->add_ra(1); item->add_ra(3);
+  item->add_ra(1);
+  item->add_ra(3);
   item = msg1.add_item();
-  item->add_ra(6); item->add_ra(7); item->add_ra(8);
+  item->add_ra(6);
+  item->add_ra(7);
+  item->add_ra(8);
 
   item = msg2.add_item();
-  item->add_ra(6); item->add_ra(5);
+  item->add_ra(6);
+  item->add_ra(5);
   item = msg2.add_item();
-  item->add_ra(6); item->add_ra(8);
+  item->add_ra(6);
+  item->add_ra(8);
   item = msg2.add_item();
-  item->add_ra(1); item->add_ra(3);
+  item->add_ra(1);
+  item->add_ra(3);
   item = msg2.add_item();
-  item->add_ra(3); item->add_ra(2); item->add_ra(1);
+  item->add_ra(3);
+  item->add_ra(2);
+  item->add_ra(1);
 
   // Compare
-  EXPECT_EQ("moved: item[0].ra[0] -> item[3].ra[2] : 1\n"
-            "moved: item[0].ra[2] -> item[3].ra[0] : 3\n"
-            "moved: item[0] -> item[3] : { ra: 1 ra: 2 ra: 3 }\n"
-            "moved: item[1].ra[0] -> item[0].ra[1] : 5\n"
-            "moved: item[1].ra[1] -> item[0].ra[0] : 6\n"
-            "moved: item[1] -> item[0] : { ra: 5 ra: 6 }\n"
-            "added: item[1]: { ra: 6 ra: 8 }\n"
-            "deleted: item[3]: { ra: 6 ra: 7 ra: 8 }\n",
-            Run(msg1, msg2));
+  EXPECT_EQ(
+      "moved: item[0].ra[0] -> item[3].ra[2] : 1\n"
+      "moved: item[0].ra[2] -> item[3].ra[0] : 3\n"
+      "moved: item[0] -> item[3] : { ra: 1 ra: 2 ra: 3 }\n"
+      "moved: item[1].ra[0] -> item[0].ra[1] : 5\n"
+      "moved: item[1].ra[1] -> item[0].ra[0] : 6\n"
+      "moved: item[1] -> item[0] : { ra: 5 ra: 6 }\n"
+      "added: item[1]: { ra: 6 ra: 8 }\n"
+      "deleted: item[3]: { ra: 6 ra: 7 ra: 8 }\n",
+      Run(msg1, msg2));
 }
 
 TEST_F(ComparisonTest, RepeatedMapFieldTest_RepeatedKey) {
@@ -2592,12 +2633,12 @@
   item->add_rb("a");
   item->set_b("fist");
 
-
-  EXPECT_EQ("modified: item[0].b -> item[1].b: \"first\" -> \"fist\"\n"
-            "moved: item[0].rb[0] -> item[1].rb[1] : \"a\"\n"
-            "moved: item[0].rb[1] -> item[1].rb[0] : \"b\"\n"
-            "added: item[0]: { b: \"second\" rb: \"c\" }\n",
-            Run(msg1, msg2));
+  EXPECT_EQ(
+      "modified: item[0].b -> item[1].b: \"first\" -> \"fist\"\n"
+      "moved: item[0].rb[0] -> item[1].rb[1] : \"a\"\n"
+      "moved: item[0].rb[1] -> item[1].rb[0] : \"b\"\n"
+      "added: item[0]: { b: \"second\" rb: \"c\" }\n",
+      Run(msg1, msg2));
 }
 
 TEST_F(ComparisonTest, RepeatedMapFieldTest_RepeatedMessageKey) {
@@ -2607,9 +2648,14 @@
   protobuf_unittest::TestDiffMessage msg2;
   protobuf_unittest::TestDiffMessage::Item* item = msg1.add_item();
   protobuf_unittest::TestField* key = item->add_rm();
-  key->set_c(2); key->add_rc(10); key->add_rc(10);
-  item = msg1.add_item(); key = item->add_rm();
-  key->set_c(0); key->add_rc(1); key->add_rc(2);
+  key->set_c(2);
+  key->add_rc(10);
+  key->add_rc(10);
+  item = msg1.add_item();
+  key = item->add_rm();
+  key->set_c(0);
+  key->add_rc(1);
+  key->add_rc(2);
   key = item->add_rm();
   key->set_c(0);
   item->add_rb("first");
@@ -2618,9 +2664,10 @@
   item->CopyFrom(msg1.item(1));
   item->add_rb("second");
 
-  EXPECT_EQ("added: item[0].rb[1]: \"second\"\n"
-            "deleted: item[0]: { rm { c: 2 rc: 10 rc: 10 } }\n",
-            Run(msg1, msg2));
+  EXPECT_EQ(
+      "added: item[0].rb[1]: \"second\"\n"
+      "deleted: item[0]: { rm { c: 2 rc: 10 rc: 10 } }\n",
+      Run(msg1, msg2));
 }
 
 TEST_F(ComparisonTest, RepeatedSetOptionTest_Unknown) {
@@ -2632,9 +2679,10 @@
   unknown2_->AddGroup(245)->AddFixed32(248, 1);
 
   // We expect it behaves the same as normal comparison.
-  EXPECT_EQ("modified: 245[0].248[0]: 0x00000001 -> 0x00000003\n"
-            "added: 245[1]: { ... }\n",
-            RunUn());
+  EXPECT_EQ(
+      "modified: 245[0].248[0]: 0x00000001 -> 0x00000003\n"
+      "added: 245[1]: { ... }\n",
+      RunUn());
 }
 
 TEST_F(ComparisonTest, Matching_Unknown) {
@@ -2646,9 +2694,10 @@
   unknown2_->AddGroup(246)->AddFixed32(248, 4);
 
   // report_match is false so only added/modified fields are expected.
-  EXPECT_EQ("added: 242[0]: \"cat\"\n"
-            "added: 246[0]: { ... }\n",
-            RunUn());
+  EXPECT_EQ(
+      "added: 242[0]: \"cat\"\n"
+      "added: 246[0]: { ... }\n",
+      RunUn());
 }
 
 TEST_F(ComparisonTest, RepeatedSetFieldTest) {
@@ -2663,55 +2712,50 @@
   proto1_.add_repeatedgroup()->set_a(907);
   proto1_.add_repeatedgroup()->set_a(909);
 
-  EXPECT_EQ("moved: repeatedgroup[2] -> repeatedgroup[1] : { a: 907 }\n"
-            "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
-            "deleted: repeatedgroup[0]: { a: 317 }\n"
-            "deleted: repeatedgroup[1]: { a: 904 }\n",
-            Run());
+  EXPECT_EQ(
+      "moved: repeatedgroup[2] -> repeatedgroup[1] : { a: 907 }\n"
+      "moved: repeatedgroup[3] -> repeatedgroup[0] : { a: 909 }\n"
+      "deleted: repeatedgroup[0]: { a: 317 }\n"
+      "deleted: repeatedgroup[1]: { a: 904 }\n",
+      Run());
 }
 
 // Embedded message tests.
 TEST_F(ComparisonTest, EmbeddedAdditionTest) {
   proto1_.mutable_optional_nested_message()->clear_bb();
 
-  EXPECT_EQ("added: optional_nested_message.bb: 118\n",
-            Run());
+  EXPECT_EQ("added: optional_nested_message.bb: 118\n", Run());
 }
 
 TEST_F(ComparisonTest, EmbeddedDeletionTest) {
   proto2_.mutable_optional_nested_message()->clear_bb();
 
-  EXPECT_EQ("deleted: optional_nested_message.bb: 118\n",
-            Run());
+  EXPECT_EQ("deleted: optional_nested_message.bb: 118\n", Run());
 }
 
 TEST_F(ComparisonTest, EmbeddedModificationTest) {
   proto1_.mutable_optional_nested_message()->set_bb(2);
 
-  EXPECT_EQ("modified: optional_nested_message.bb: 2 -> 118\n",
-            Run());
+  EXPECT_EQ("modified: optional_nested_message.bb: 2 -> 118\n", Run());
 }
 
 TEST_F(ComparisonTest, EmbeddedFullAdditionTest) {
   proto1_.clear_optional_nested_message();
 
-  EXPECT_EQ("added: optional_nested_message: { bb: 118 }\n",
-            Run());
+  EXPECT_EQ("added: optional_nested_message: { bb: 118 }\n", Run());
 }
 
 TEST_F(ComparisonTest, EmbeddedPartialAdditionTest) {
   proto1_.clear_optional_nested_message();
   proto2_.mutable_optional_nested_message()->clear_bb();
 
-  EXPECT_EQ("added: optional_nested_message: { }\n",
-            Run());
+  EXPECT_EQ("added: optional_nested_message: { }\n", Run());
 }
 
 TEST_F(ComparisonTest, EmbeddedFullDeletionTest) {
   proto2_.clear_optional_nested_message();
 
-  EXPECT_EQ("deleted: optional_nested_message: { bb: 118 }\n",
-            Run());
+  EXPECT_EQ("deleted: optional_nested_message: { bb: 118 }\n", Run());
 }
 
 // Repeated element tests.
@@ -2730,10 +2774,11 @@
   proto2_.add_repeated_int32(502);
   proto2_.add_repeated_int32(504);
 
-  EXPECT_EQ("modified: repeated_int32[1]: 501 -> 509\n"
-            "modified: repeated_int32[3]: 503 -> 504\n"
-            "deleted: repeated_int32[4]: 500\n",
-            Run());
+  EXPECT_EQ(
+      "modified: repeated_int32[1]: 501 -> 509\n"
+      "modified: repeated_int32[3]: 503 -> 504\n"
+      "deleted: repeated_int32[4]: 500\n",
+      Run());
 }
 
 TEST_F(ComparisonTest, BasicRepeatedTest_SetOption) {
@@ -2753,13 +2798,14 @@
   proto2_.add_repeated_int32(502);
   proto2_.add_repeated_int32(504);
 
-  EXPECT_EQ("moved: repeated_int32[1] -> repeated_int32[3] : 502\n"
-            "moved: repeated_int32[3] -> repeated_int32[0] : 500\n"
-            "added: repeated_int32[1]: 509\n"
-            "added: repeated_int32[4]: 504\n"
-            "deleted: repeated_int32[0]: 501\n"
-            "deleted: repeated_int32[4]: 500\n",
-            Run());
+  EXPECT_EQ(
+      "moved: repeated_int32[1] -> repeated_int32[3] : 502\n"
+      "moved: repeated_int32[3] -> repeated_int32[0] : 500\n"
+      "added: repeated_int32[1]: 509\n"
+      "added: repeated_int32[4]: 504\n"
+      "deleted: repeated_int32[0]: 501\n"
+      "deleted: repeated_int32[4]: 500\n",
+      Run());
 }
 
 TEST_F(ComparisonTest, BasicRepeatedTest_SetField) {
@@ -2779,13 +2825,14 @@
   proto2_.add_repeated_int32(502);
   proto2_.add_repeated_int32(504);
 
-  EXPECT_EQ("moved: repeated_int32[1] -> repeated_int32[3] : 502\n"
-            "moved: repeated_int32[3] -> repeated_int32[0] : 500\n"
-            "added: repeated_int32[1]: 509\n"
-            "added: repeated_int32[4]: 504\n"
-            "deleted: repeated_int32[0]: 501\n"
-            "deleted: repeated_int32[4]: 500\n",
-            Run());
+  EXPECT_EQ(
+      "moved: repeated_int32[1] -> repeated_int32[3] : 502\n"
+      "moved: repeated_int32[3] -> repeated_int32[0] : 500\n"
+      "added: repeated_int32[1]: 509\n"
+      "added: repeated_int32[4]: 504\n"
+      "deleted: repeated_int32[0]: 501\n"
+      "deleted: repeated_int32[4]: 500\n",
+      Run());
 }
 
 // Multiple action tests.
@@ -2793,18 +2840,20 @@
   proto1_.clear_optional_int32();
   proto2_.clear_optional_int64();
 
-  EXPECT_EQ("added: optional_int32: 101\n"
-            "deleted: optional_int64: 102\n",
-            Run());
+  EXPECT_EQ(
+      "added: optional_int32: 101\n"
+      "deleted: optional_int64: 102\n",
+      Run());
 }
 
 TEST_F(ComparisonTest, AddDelete_FieldOrderingTest) {
   orderings_proto1_.ClearExtension(unittest::my_extension_string);
   orderings_proto2_.clear_my_int();
 
-  EXPECT_EQ("deleted: my_int: 1\n"
-            "added: (protobuf_unittest.my_extension_string): \"bar\"\n",
-            RunOrder());
+  EXPECT_EQ(
+      "deleted: my_int: 1\n"
+      "added: (protobuf_unittest.my_extension_string): \"bar\"\n",
+      RunOrder());
 }
 
 TEST_F(ComparisonTest, AllThreeTest) {
@@ -2812,10 +2861,11 @@
   proto2_.clear_optional_float();
   proto2_.set_optional_string("hello world!");
 
-  EXPECT_EQ("added: optional_int32: 101\n"
-            "deleted: optional_float: 111\n"
-            "modified: optional_string: \"115\" -> \"hello world!\"\n",
-            Run());
+  EXPECT_EQ(
+      "added: optional_int32: 101\n"
+      "deleted: optional_float: 111\n"
+      "modified: optional_string: \"115\" -> \"hello world!\"\n",
+      Run());
 }
 
 TEST_F(ComparisonTest, SandwhichTest) {
@@ -2824,10 +2874,11 @@
 
   proto2_.clear_optional_uint64();
 
-  EXPECT_EQ("added: optional_int64: 102\n"
-            "added: optional_uint32: 103\n"
-            "deleted: optional_uint64: 104\n",
-            Run());
+  EXPECT_EQ(
+      "added: optional_int64: 102\n"
+      "added: optional_uint32: 103\n"
+      "deleted: optional_uint64: 104\n",
+      Run());
 }
 
 TEST_F(ComparisonTest, IgnoredNoChangeTest) {
@@ -2837,9 +2888,10 @@
 
   ignore_field("v");
 
-  EXPECT_EQ("ignored: v\n"
-            "added: w: \"foo\"\n",
-            RunDiff());
+  EXPECT_EQ(
+      "ignored: v\n"
+      "added: w: \"foo\"\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, IgnoredAddTest) {
@@ -2848,9 +2900,10 @@
 
   ignore_field("v");
 
-  EXPECT_EQ("ignored: v\n"
-            "added: w: \"foo\"\n",
-            RunDiff());
+  EXPECT_EQ(
+      "ignored: v\n"
+      "added: w: \"foo\"\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, IgnoredDeleteTest) {
@@ -2859,9 +2912,10 @@
 
   ignore_field("v");
 
-  EXPECT_EQ("ignored: v\n"
-            "added: w: \"foo\"\n",
-            RunDiff());
+  EXPECT_EQ(
+      "ignored: v\n"
+      "added: w: \"foo\"\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, IgnoredModifyTest) {
@@ -2871,9 +2925,10 @@
 
   ignore_field("v");
 
-  EXPECT_EQ("ignored: v\n"
-            "added: w: \"foo\"\n",
-            RunDiff());
+  EXPECT_EQ(
+      "ignored: v\n"
+      "added: w: \"foo\"\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, IgnoredRepeatedAddTest) {
@@ -2888,9 +2943,10 @@
 
   ignore_field("rv");
 
-  EXPECT_EQ("ignored: rv\n"
-            "added: w: \"foo\"\n",
-            RunDiff());
+  EXPECT_EQ(
+      "ignored: rv\n"
+      "added: w: \"foo\"\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, IgnoredRepeatedDeleteTest) {
@@ -2905,9 +2961,10 @@
 
   ignore_field("rv");
 
-  EXPECT_EQ("ignored: rv\n"
-            "added: w: \"foo\"\n",
-            RunDiff());
+  EXPECT_EQ(
+      "ignored: rv\n"
+      "added: w: \"foo\"\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, IgnoredRepeatedModifyTest) {
@@ -2921,9 +2978,10 @@
 
   ignore_field("rv");
 
-  EXPECT_EQ("ignored: rv\n"
-            "added: w: \"foo\"\n",
-            RunDiff());
+  EXPECT_EQ(
+      "ignored: rv\n"
+      "added: w: \"foo\"\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, IgnoredWholeNestedMessage) {
@@ -2934,9 +2992,10 @@
 
   ignore_field("m");
 
-  EXPECT_EQ("added: w: \"foo\"\n"
-            "ignored: m\n",
-            RunDiff());
+  EXPECT_EQ(
+      "added: w: \"foo\"\n"
+      "ignored: m\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, IgnoredNestedField) {
@@ -2947,9 +3006,10 @@
 
   ignore_field("m.c");
 
-  EXPECT_EQ("added: w: \"foo\"\n"
-            "ignored: m.c\n",
-            RunDiff());
+  EXPECT_EQ(
+      "added: w: \"foo\"\n"
+      "ignored: m.c\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, IgnoredRepeatedNested) {
@@ -2962,10 +3022,11 @@
 
   ignore_field("rm.c");
 
-  EXPECT_EQ("ignored: rm[0].c\n"
-            "ignored: rm[1].c\n"
-            "added: w: \"foo\"\n",
-            RunDiff());
+  EXPECT_EQ(
+      "ignored: rm[0].c\n"
+      "ignored: rm[1].c\n"
+      "added: w: \"foo\"\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, IgnoredNestedRepeated) {
@@ -2977,9 +3038,10 @@
 
   ignore_field("m.rc");
 
-  EXPECT_EQ("added: w: \"foo\"\n"
-            "ignored: m.rc\n",
-            RunDiff());
+  EXPECT_EQ(
+      "added: w: \"foo\"\n"
+      "ignored: m.rc\n",
+      RunDiff());
 }
 
 TEST_F(ComparisonTest, ExtensionTest) {
@@ -3111,8 +3173,8 @@
   unittest::TestMap map_reflection1;
 
   // By setting via reflection, data exists in repeated field.
-  ASSERT_TRUE(parser.ParseFromString(
-      "map_int32_foreign_message { key: 1 }", &map_reflection1));
+  ASSERT_TRUE(parser.ParseFromString("map_int32_foreign_message { key: 1 }",
+                                     &map_reflection1));
 
   // During copy, data is synced from repeated field to map.
   unittest::TestMap map_reflection2 = map_reflection1;
@@ -3224,11 +3286,9 @@
   typedef util::MessageDifferencer MessageDifferencer;
 
  protected:
-  MatchingTest() {
-  }
+  MatchingTest() {}
 
-  ~MatchingTest() {
-  }
+  ~MatchingTest() {}
 
   std::string RunWithResult(MessageDifferencer* differencer,
                             const Message& msg1, const Message& msg2,
@@ -3385,7 +3445,7 @@
       "moved: item[0].rm[1].rc[2] -> item[0].rm[0].rc[0] : 7\n"
       "moved: item[0].rm[1] -> item[0].rm[0] : { c: 4 rc: 5 rc: 6 rc: 7 }\n"
       "matched: item[0] : { rm { c: 1 rc: 2 rc: 3 }"
-                          " rm { c: 4 rc: 5 rc: 6 rc: 7 } }\n"
+      " rm { c: 4 rc: 5 rc: 6 rc: 7 } }\n"
       "matched: item[1].rm[0].c : 8\n"
       "moved: item[1].rm[0].rc[0] -> item[1].rm[0].rc[1] : 10\n"
       "moved: item[1].rm[0].rc[1] -> item[1].rm[0].rc[2] : 11\n"
@@ -3464,13 +3524,13 @@
       "added: item[0].rm[0].rc[1]: 8\n"
       "deleted: item[0].rm[1].rc[1]: 7\n"
       "modified: item[0].rm[1] -> item[0].rm[0]: { c: 5 rc: 6 rc: 7 rc: 8 } ->"
-                                               " { c: 5 rc: 8 rc: 8 rc: 6 }\n"
+      " { c: 5 rc: 8 rc: 8 rc: 6 }\n"
       "added: item[0].rm[1]: { c: 3 rc: 2 rc: 4 }\n"
       "deleted: item[0].rm[0]: { c: 2 rc: 3 rc: 4 }\n"
       "modified: item[0]: { a: 1 rm { c: 2 rc: 3 rc: 4 }"
-                               " rm { c: 5 rc: 6 rc: 7 rc: 8 } } ->"
-                        " { a: 1 rm { c: 5 rc: 8 rc: 8 rc: 6 }"
-                               " rm { c: 3 rc: 2 rc: 4 } }\n"
+      " rm { c: 5 rc: 6 rc: 7 rc: 8 } } ->"
+      " { a: 1 rm { c: 5 rc: 8 rc: 8 rc: 6 }"
+      " rm { c: 3 rc: 2 rc: 4 } }\n"
       "matched: item[1].a : 9\n"
       "matched: item[1].rm[0].c : 10\n"
       "moved: item[1].rm[0].rc[0] -> item[1].rm[0].rc[1] : 11\n"
@@ -3513,20 +3573,20 @@
 
   EXPECT_EQ(
       "matched: (protobuf_unittest.repeated_nested_message_extension)[0].bb ->"
-              " (protobuf_unittest.repeated_nested_message_extension)[2].bb : 7\n"
+      " (protobuf_unittest.repeated_nested_message_extension)[2].bb : 7\n"
       "moved: (protobuf_unittest.repeated_nested_message_extension)[0] ->"
-            " (protobuf_unittest.repeated_nested_message_extension)[2] :"
-                " { bb: 7 }\n"
+      " (protobuf_unittest.repeated_nested_message_extension)[2] :"
+      " { bb: 7 }\n"
       "matched: (protobuf_unittest.repeated_nested_message_extension)[1].bb :"
-                  " 13\n"
+      " 13\n"
       "matched: (protobuf_unittest.repeated_nested_message_extension)[1] :"
-                  " { bb: 13 }\n"
+      " { bb: 13 }\n"
       "matched: (protobuf_unittest.repeated_nested_message_extension)[2].bb ->"
-              " (protobuf_unittest.repeated_nested_message_extension)[0].bb :"
-                  " 11\n"
+      " (protobuf_unittest.repeated_nested_message_extension)[0].bb :"
+      " 11\n"
       "moved: (protobuf_unittest.repeated_nested_message_extension)[2] ->"
-            " (protobuf_unittest.repeated_nested_message_extension)[0] :"
-                " { bb: 11 }\n",
+      " (protobuf_unittest.repeated_nested_message_extension)[0] :"
+      " { bb: 11 }\n",
       RunWithResult(&differencer, msg1, msg2, true));
 }
 
diff --git a/src/google/protobuf/util/time_util.cc b/src/google/protobuf/util/time_util.cc
index 8f9d939..68a3e67 100644
--- a/src/google/protobuf/util/time_util.cc
+++ b/src/google/protobuf/util/time_util.cc
@@ -45,8 +45,8 @@
 namespace protobuf {
 namespace util {
 
-using google::protobuf::Timestamp;
 using google::protobuf::Duration;
+using google::protobuf::Timestamp;
 
 namespace {
 static const int kNanosPerSecond = 1000000000;
diff --git a/src/google/protobuf/util/time_util.h b/src/google/protobuf/util/time_util.h
index bbda538..756e23b 100644
--- a/src/google/protobuf/util/time_util.h
+++ b/src/google/protobuf/util/time_util.h
@@ -224,15 +224,15 @@
   return result -= d2;
 }
 // Multiplicative operators
-template<typename T>
+template <typename T>
 inline Duration operator*(Duration d, T r) {
   return d *= r;
 }
-template<typename T>
+template <typename T>
 inline Duration operator*(T r, Duration d) {
   return d *= r;
 }
-template<typename T>
+template <typename T>
 inline Duration operator/(Duration d, T r) {
   return d /= r;
 }
diff --git a/src/google/protobuf/util/time_util_test.cc b/src/google/protobuf/util/time_util_test.cc
index 285740a..9d6c564 100644
--- a/src/google/protobuf/util/time_util_test.cc
+++ b/src/google/protobuf/util/time_util_test.cc
@@ -32,8 +32,8 @@
 
 #include <ctime>
 
-#include <google/protobuf/timestamp.pb.h>
 #include <google/protobuf/duration.pb.h>
+#include <google/protobuf/timestamp.pb.h>
 #include <google/protobuf/testing/googletest.h>
 #include <gtest/gtest.h>
 
@@ -41,8 +41,8 @@
 namespace protobuf {
 namespace util {
 
-using google::protobuf::Timestamp;
 using google::protobuf::Duration;
+using google::protobuf::Timestamp;
 
 namespace {
 
diff --git a/src/google/protobuf/util/type_resolver_util.cc b/src/google/protobuf/util/type_resolver_util.cc
index 5c71918..b652f9f 100644
--- a/src/google/protobuf/util/type_resolver_util.cc
+++ b/src/google/protobuf/util/type_resolver_util.cc
@@ -40,6 +40,10 @@
 
 #include <google/protobuf/stubs/status.h>
 
+// clang-format off
+#include <google/protobuf/port_def.inc>
+// clang-format on
+
 namespace google {
 namespace protobuf {
 namespace util {
diff --git a/src/google/protobuf/util/type_resolver_util_test.cc b/src/google/protobuf/util/type_resolver_util_test.cc
index 42fb7f6..c453955 100644
--- a/src/google/protobuf/util/type_resolver_util_test.cc
+++ b/src/google/protobuf/util/type_resolver_util_test.cc
@@ -88,8 +88,8 @@
     if (field == NULL) {
       return false;
     }
-    return field->cardinality() == cardinality &&
-        field->kind() == kind && field->number() == number;
+    return field->cardinality() == cardinality && field->kind() == kind &&
+           field->number() == number;
   }
 
   bool CheckFieldTypeUrl(const Type& type, const std::string& name,
@@ -177,156 +177,158 @@
 
 TEST_F(DescriptorPoolTypeResolverTest, TestAllTypes) {
   Type type;
-  ASSERT_TRUE(resolver_->ResolveMessageType(
-      GetTypeUrl<protobuf_unittest::TestAllTypes>(), &type).ok());
+  ASSERT_TRUE(resolver_
+                  ->ResolveMessageType(
+                      GetTypeUrl<protobuf_unittest::TestAllTypes>(), &type)
+                  .ok());
   // Check all optional fields.
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_INT32, "optional_int32", 1));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_INT64, "optional_int64", 2));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_UINT32, "optional_uint32", 3));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_UINT64, "optional_uint64", 4));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_SINT32, "optional_sint32", 5));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_SINT64, "optional_sint64", 6));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_FIXED32, "optional_fixed32", 7));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_FIXED64, "optional_fixed64", 8));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_SFIXED32, "optional_sfixed32", 9));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_SFIXED64, "optional_sfixed64", 10));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_FLOAT, "optional_float", 11));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_DOUBLE, "optional_double", 12));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_BOOL, "optional_bool", 13));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_STRING, "optional_string", 14));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_BYTES, "optional_bytes", 15));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_INT32,
+                       "optional_int32", 1));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_INT64,
+                       "optional_int64", 2));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_UINT32,
+                       "optional_uint32", 3));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_UINT64,
+                       "optional_uint64", 4));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_SINT32,
+                       "optional_sint32", 5));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_SINT64,
+                       "optional_sint64", 6));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_FIXED32,
+                       "optional_fixed32", 7));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_FIXED64,
+                       "optional_fixed64", 8));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_SFIXED32,
+                       "optional_sfixed32", 9));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_SFIXED64,
+                       "optional_sfixed64", 10));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_FLOAT,
+                       "optional_float", 11));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_DOUBLE,
+                       "optional_double", 12));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_BOOL,
+                       "optional_bool", 13));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_STRING,
+                       "optional_string", 14));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_BYTES,
+                       "optional_bytes", 15));
 
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_GROUP, "optionalgroup", 16));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_GROUP,
+                       "optionalgroup", 16));
 
   EXPECT_TRUE(CheckFieldTypeUrl(
       type, "optionalgroup",
       GetTypeUrl<protobuf_unittest::TestAllTypes::OptionalGroup>()));
 
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_MESSAGE, "optional_nested_message", 18));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_MESSAGE, "optional_foreign_message", 19));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_MESSAGE,
+                       "optional_nested_message", 18));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_MESSAGE,
+                       "optional_foreign_message", 19));
 
   EXPECT_TRUE(CheckFieldTypeUrl(
       type, "optional_nested_message",
       GetTypeUrl<protobuf_unittest::TestAllTypes::NestedMessage>()));
-  EXPECT_TRUE(CheckFieldTypeUrl(
-      type, "optional_foreign_message",
-      GetTypeUrl<protobuf_unittest::ForeignMessage>()));
+  EXPECT_TRUE(CheckFieldTypeUrl(type, "optional_foreign_message",
+                                GetTypeUrl<protobuf_unittest::ForeignMessage>()));
 
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_ENUM, "optional_nested_enum", 21));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_ENUM, "optional_foreign_enum", 22));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_ENUM,
+                       "optional_nested_enum", 21));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_ENUM,
+                       "optional_foreign_enum", 22));
 
-  EXPECT_TRUE(CheckFieldTypeUrl(
-      type, "optional_nested_enum",
-      GetTypeUrl("protobuf_unittest.TestAllTypes.NestedEnum")));
-  EXPECT_TRUE(CheckFieldTypeUrl(
-      type, "optional_foreign_enum",
-      GetTypeUrl("protobuf_unittest.ForeignEnum")));
+  EXPECT_TRUE(
+      CheckFieldTypeUrl(type, "optional_nested_enum",
+                        GetTypeUrl("protobuf_unittest.TestAllTypes.NestedEnum")));
+  EXPECT_TRUE(CheckFieldTypeUrl(type, "optional_foreign_enum",
+                                GetTypeUrl("protobuf_unittest.ForeignEnum")));
 
   // Check all repeated fields.
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_INT32, "repeated_int32", 31));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_INT64, "repeated_int64", 32));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_UINT32, "repeated_uint32", 33));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_UINT64, "repeated_uint64", 34));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_SINT32, "repeated_sint32", 35));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_SINT64, "repeated_sint64", 36));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_FIXED32, "repeated_fixed32", 37));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_FIXED64, "repeated_fixed64", 38));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_SFIXED32, "repeated_sfixed32", 39));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_SFIXED64, "repeated_sfixed64", 40));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_FLOAT, "repeated_float", 41));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_DOUBLE, "repeated_double", 42));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_BOOL, "repeated_bool", 43));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_STRING, "repeated_string", 44));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_BYTES, "repeated_bytes", 45));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_INT32,
+                       "repeated_int32", 31));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_INT64,
+                       "repeated_int64", 32));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_UINT32,
+                       "repeated_uint32", 33));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_UINT64,
+                       "repeated_uint64", 34));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_SINT32,
+                       "repeated_sint32", 35));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_SINT64,
+                       "repeated_sint64", 36));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_FIXED32,
+                       "repeated_fixed32", 37));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_FIXED64,
+                       "repeated_fixed64", 38));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_SFIXED32,
+                       "repeated_sfixed32", 39));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_SFIXED64,
+                       "repeated_sfixed64", 40));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_FLOAT,
+                       "repeated_float", 41));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_DOUBLE,
+                       "repeated_double", 42));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_BOOL,
+                       "repeated_bool", 43));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_STRING,
+                       "repeated_string", 44));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_BYTES,
+                       "repeated_bytes", 45));
 
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_GROUP, "repeatedgroup", 46));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_GROUP,
+                       "repeatedgroup", 46));
 
   EXPECT_TRUE(CheckFieldTypeUrl(
       type, "repeatedgroup",
       GetTypeUrl<protobuf_unittest::TestAllTypes::RepeatedGroup>()));
 
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_MESSAGE, "repeated_nested_message", 48));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_MESSAGE, "repeated_foreign_message", 49));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_MESSAGE,
+                       "repeated_nested_message", 48));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_MESSAGE,
+                       "repeated_foreign_message", 49));
 
   EXPECT_TRUE(CheckFieldTypeUrl(
       type, "repeated_nested_message",
       GetTypeUrl<protobuf_unittest::TestAllTypes::NestedMessage>()));
-  EXPECT_TRUE(CheckFieldTypeUrl(
-      type, "repeated_foreign_message",
-      GetTypeUrl<protobuf_unittest::ForeignMessage>()));
+  EXPECT_TRUE(CheckFieldTypeUrl(type, "repeated_foreign_message",
+                                GetTypeUrl<protobuf_unittest::ForeignMessage>()));
 
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_ENUM, "repeated_nested_enum", 51));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_ENUM, "repeated_foreign_enum", 52));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_ENUM,
+                       "repeated_nested_enum", 51));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_ENUM,
+                       "repeated_foreign_enum", 52));
 
-  EXPECT_TRUE(CheckFieldTypeUrl(
-      type, "repeated_nested_enum",
-      GetTypeUrl("protobuf_unittest.TestAllTypes.NestedEnum")));
-  EXPECT_TRUE(CheckFieldTypeUrl(
-      type, "repeated_foreign_enum",
-      GetTypeUrl("protobuf_unittest.ForeignEnum")));
+  EXPECT_TRUE(
+      CheckFieldTypeUrl(type, "repeated_nested_enum",
+                        GetTypeUrl("protobuf_unittest.TestAllTypes.NestedEnum")));
+  EXPECT_TRUE(CheckFieldTypeUrl(type, "repeated_foreign_enum",
+                                GetTypeUrl("protobuf_unittest.ForeignEnum")));
 }
 
 TEST_F(DescriptorPoolTypeResolverTest, TestPackedField) {
   Type type;
-  ASSERT_TRUE(resolver_->ResolveMessageType(
-      GetTypeUrl<protobuf_unittest::TestPackedTypes>(), &type).ok());
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_INT32, "packed_int32", 90));
+  ASSERT_TRUE(resolver_
+                  ->ResolveMessageType(
+                      GetTypeUrl<protobuf_unittest::TestPackedTypes>(), &type)
+                  .ok());
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_INT32,
+                       "packed_int32", 90));
   EXPECT_TRUE(IsPacked(type, "packed_int32"));
 }
 
 TEST_F(DescriptorPoolTypeResolverTest, TestOneof) {
   Type type;
-  ASSERT_TRUE(resolver_->ResolveMessageType(
-      GetTypeUrl<protobuf_unittest::TestAllTypes>(), &type).ok());
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_UINT32, "oneof_uint32", 111));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_MESSAGE, "oneof_nested_message", 112));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_STRING, "oneof_string", 113));
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL,
-                       Field::TYPE_BYTES, "oneof_bytes", 114));
+  ASSERT_TRUE(resolver_
+                  ->ResolveMessageType(
+                      GetTypeUrl<protobuf_unittest::TestAllTypes>(), &type)
+                  .ok());
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_UINT32,
+                       "oneof_uint32", 111));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_MESSAGE,
+                       "oneof_nested_message", 112));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_STRING,
+                       "oneof_string", 113));
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_OPTIONAL, Field::TYPE_BYTES,
+                       "oneof_bytes", 114));
   EXPECT_TRUE(FieldInOneof(type, "oneof_uint32", "oneof_field"));
   EXPECT_TRUE(FieldInOneof(type, "oneof_nested_message", "oneof_field"));
   EXPECT_TRUE(FieldInOneof(type, "oneof_string", "oneof_field"));
@@ -335,17 +337,21 @@
 
 TEST_F(DescriptorPoolTypeResolverTest, TestMap) {
   Type type;
-  ASSERT_TRUE(resolver_->ResolveMessageType(
-      GetTypeUrl<protobuf_unittest::TestMap>(), &type).ok());
-  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED,
-                       Field::TYPE_MESSAGE, "map_int32_int32", 1));
+  ASSERT_TRUE(
+      resolver_
+          ->ResolveMessageType(GetTypeUrl<protobuf_unittest::TestMap>(), &type)
+          .ok());
+  EXPECT_TRUE(HasField(type, Field::CARDINALITY_REPEATED, Field::TYPE_MESSAGE,
+                       "map_int32_int32", 1));
   EXPECT_TRUE(CheckFieldTypeUrl(
       type, "map_int32_int32",
       GetTypeUrl("protobuf_unittest.TestMap.MapInt32Int32Entry")));
 
-  ASSERT_TRUE(resolver_->ResolveMessageType(
-      GetTypeUrl("protobuf_unittest.TestMap.MapInt32Int32Entry"),
-      &type).ok());
+  ASSERT_TRUE(
+      resolver_
+          ->ResolveMessageType(
+              GetTypeUrl("protobuf_unittest.TestMap.MapInt32Int32Entry"), &type)
+          .ok());
   EXPECT_TRUE(HasBoolOption(type.options(), "map_entry", true));
 }
 
@@ -377,8 +383,11 @@
 
 TEST_F(DescriptorPoolTypeResolverTest, TestEnum) {
   Enum type;
-  ASSERT_TRUE(resolver_->ResolveEnumType(
-      GetTypeUrl("protobuf_unittest.TestAllTypes.NestedEnum"), &type).ok());
+  ASSERT_TRUE(
+      resolver_
+          ->ResolveEnumType(
+              GetTypeUrl("protobuf_unittest.TestAllTypes.NestedEnum"), &type)
+          .ok());
   EnumHasValue(type, "FOO", 1);
   EnumHasValue(type, "BAR", 2);
   EnumHasValue(type, "BAZ", 3);
@@ -413,14 +422,16 @@
 
 TEST_F(DescriptorPoolTypeResolverTest, TestJsonName) {
   Type type;
-  ASSERT_TRUE(resolver_->ResolveMessageType(
-                           GetTypeUrl<protobuf_unittest::TestAllTypes>(), &type)
+  ASSERT_TRUE(resolver_
+                  ->ResolveMessageType(
+                      GetTypeUrl<protobuf_unittest::TestAllTypes>(), &type)
                   .ok());
   EXPECT_EQ("optionalInt32", FindField(type, "optional_int32")->json_name());
 
-  ASSERT_TRUE(resolver_->ResolveMessageType(
-                           GetTypeUrl<proto3::TestCustomJsonName>(), &type)
-                  .ok());
+  ASSERT_TRUE(
+      resolver_
+          ->ResolveMessageType(GetTypeUrl<proto3::TestCustomJsonName>(), &type)
+          .ok());
   EXPECT_EQ("@value", FindField(type, "value")->json_name());
 }
 
diff --git a/src/google/protobuf/wire_format.cc b/src/google/protobuf/wire_format.cc
index 7a25207..fe0714b 100644
--- a/src/google/protobuf/wire_format.cc
+++ b/src/google/protobuf/wire_format.cc
@@ -68,8 +68,8 @@
 
 // ===================================================================
 
-bool UnknownFieldSetFieldSkipper::SkipField(
-    io::CodedInputStream* input, uint32 tag) {
+bool UnknownFieldSetFieldSkipper::SkipField(io::CodedInputStream* input,
+                                            uint32 tag) {
   return WireFormat::SkipField(input, tag, unknown_fields_);
 }
 
@@ -77,8 +77,7 @@
   return WireFormat::SkipMessage(input, unknown_fields_);
 }
 
-void UnknownFieldSetFieldSkipper::SkipUnknownEnum(
-    int field_number, int value) {
+void UnknownFieldSetFieldSkipper::SkipUnknownEnum(int field_number, int value) {
   unknown_fields_->AddVarint(field_number, value);
 }
 
@@ -116,15 +115,16 @@
     }
     case WireFormatLite::WIRETYPE_START_GROUP: {
       if (!input->IncrementRecursionDepth()) return false;
-      if (!SkipMessage(input, (unknown_fields == NULL) ?
-                              NULL : unknown_fields->AddGroup(number))) {
+      if (!SkipMessage(input, (unknown_fields == NULL)
+                                  ? NULL
+                                  : unknown_fields->AddGroup(number))) {
         return false;
       }
       input->DecrementRecursionDepth();
       // Check that the ending tag matched the starting tag.
-      if (!input->LastTagWas(WireFormatLite::MakeTag(
-          WireFormatLite::GetTagFieldNumber(tag),
-          WireFormatLite::WIRETYPE_END_GROUP))) {
+      if (!input->LastTagWas(
+              WireFormatLite::MakeTag(WireFormatLite::GetTagFieldNumber(tag),
+                                      WireFormatLite::WIRETYPE_END_GROUP))) {
         return false;
       }
       return true;
@@ -188,63 +188,61 @@
   return true;
 }
 
-
 void WireFormat::SerializeUnknownFields(const UnknownFieldSet& unknown_fields,
                                         io::CodedOutputStream* output) {
   for (int i = 0; i < unknown_fields.field_count(); i++) {
     const UnknownField& field = unknown_fields.field(i);
     switch (field.type()) {
       case UnknownField::TYPE_VARINT:
-        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_VARINT));
+        output->WriteVarint32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_VARINT));
         output->WriteVarint64(field.varint());
         break;
       case UnknownField::TYPE_FIXED32:
-        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_FIXED32));
+        output->WriteVarint32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_FIXED32));
         output->WriteLittleEndian32(field.fixed32());
         break;
       case UnknownField::TYPE_FIXED64:
-        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_FIXED64));
+        output->WriteVarint32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_FIXED64));
         output->WriteLittleEndian64(field.fixed64());
         break;
       case UnknownField::TYPE_LENGTH_DELIMITED:
-        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
+        output->WriteVarint32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
         output->WriteVarint32(field.length_delimited().size());
         output->WriteRawMaybeAliased(field.length_delimited().data(),
                                      field.length_delimited().size());
         break;
       case UnknownField::TYPE_GROUP:
-        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_START_GROUP));
+        output->WriteVarint32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_START_GROUP));
         SerializeUnknownFields(field.group(), output);
-        output->WriteVarint32(WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_END_GROUP));
+        output->WriteVarint32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_END_GROUP));
         break;
     }
   }
 }
 
 uint8* WireFormat::SerializeUnknownFieldsToArray(
-    const UnknownFieldSet& unknown_fields,
-    uint8* target) {
+    const UnknownFieldSet& unknown_fields, uint8* target) {
   for (int i = 0; i < unknown_fields.field_count(); i++) {
     const UnknownField& field = unknown_fields.field(i);
 
     switch (field.type()) {
       case UnknownField::TYPE_VARINT:
-        target = WireFormatLite::WriteInt64ToArray(
-            field.number(), field.varint(), target);
+        target = WireFormatLite::WriteInt64ToArray(field.number(),
+                                                   field.varint(), target);
         break;
       case UnknownField::TYPE_FIXED32:
-        target = WireFormatLite::WriteFixed32ToArray(
-            field.number(), field.fixed32(), target);
+        target = WireFormatLite::WriteFixed32ToArray(field.number(),
+                                                     field.fixed32(), target);
         break;
       case UnknownField::TYPE_FIXED64:
-        target = WireFormatLite::WriteFixed64ToArray(
-            field.number(), field.fixed64(), target);
+        target = WireFormatLite::WriteFixed64ToArray(field.number(),
+                                                     field.fixed64(), target);
         break;
       case UnknownField::TYPE_LENGTH_DELIMITED:
         target = WireFormatLite::WriteBytesToArray(
@@ -263,8 +261,7 @@
 }
 
 void WireFormat::SerializeUnknownMessageSetItems(
-    const UnknownFieldSet& unknown_fields,
-    io::CodedOutputStream* output) {
+    const UnknownFieldSet& unknown_fields, io::CodedOutputStream* output) {
   for (int i = 0; i < unknown_fields.field_count(); i++) {
     const UnknownField& field = unknown_fields.field(i);
     // The only unknown fields that are allowed to exist in a MessageSet are
@@ -288,8 +285,7 @@
 }
 
 uint8* WireFormat::SerializeUnknownMessageSetItemsToArray(
-    const UnknownFieldSet& unknown_fields,
-    uint8* target) {
+    const UnknownFieldSet& unknown_fields, uint8* target) {
   for (int i = 0; i < unknown_fields.field_count(); i++) {
     const UnknownField& field = unknown_fields.field(i);
 
@@ -303,8 +299,8 @@
       // Write type ID.
       target = io::CodedOutputStream::WriteTagToArray(
           WireFormatLite::kMessageSetTypeIdTag, target);
-      target = io::CodedOutputStream::WriteVarint32ToArray(
-          field.number(), target);
+      target =
+          io::CodedOutputStream::WriteVarint32ToArray(field.number(), target);
 
       // Write message.
       target = io::CodedOutputStream::WriteTagToArray(
@@ -328,39 +324,33 @@
 
     switch (field.type()) {
       case UnknownField::TYPE_VARINT:
-        size += io::CodedOutputStream::VarintSize32(
-            WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_VARINT));
+        size += io::CodedOutputStream::VarintSize32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_VARINT));
         size += io::CodedOutputStream::VarintSize64(field.varint());
         break;
       case UnknownField::TYPE_FIXED32:
-        size += io::CodedOutputStream::VarintSize32(
-            WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_FIXED32));
+        size += io::CodedOutputStream::VarintSize32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_FIXED32));
         size += sizeof(int32);
         break;
       case UnknownField::TYPE_FIXED64:
-        size += io::CodedOutputStream::VarintSize32(
-            WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_FIXED64));
+        size += io::CodedOutputStream::VarintSize32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_FIXED64));
         size += sizeof(int64);
         break;
       case UnknownField::TYPE_LENGTH_DELIMITED:
-        size += io::CodedOutputStream::VarintSize32(
-            WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
+        size += io::CodedOutputStream::VarintSize32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_LENGTH_DELIMITED));
         size += io::CodedOutputStream::VarintSize32(
             field.length_delimited().size());
         size += field.length_delimited().size();
         break;
       case UnknownField::TYPE_GROUP:
-        size += io::CodedOutputStream::VarintSize32(
-            WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_START_GROUP));
+        size += io::CodedOutputStream::VarintSize32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_START_GROUP));
         size += ComputeUnknownFieldsSize(field.group());
-        size += io::CodedOutputStream::VarintSize32(
-            WireFormatLite::MakeTag(field.number(),
-            WireFormatLite::WIRETYPE_END_GROUP));
+        size += io::CodedOutputStream::VarintSize32(WireFormatLite::MakeTag(
+            field.number(), WireFormatLite::WIRETYPE_END_GROUP));
         break;
     }
   }
@@ -396,7 +386,7 @@
   const Descriptor* descriptor = message->GetDescriptor();
   const Reflection* message_reflection = message->GetReflection();
 
-  while(true) {
+  while (true) {
     uint32 tag = input->ReadTag();
     if (tag == 0) {
       // End of input.  This is a valid place to end, so return true.
@@ -420,15 +410,14 @@
         if (input->GetExtensionPool() == NULL) {
           field = message_reflection->FindKnownExtensionByNumber(field_number);
         } else {
-          field = input->GetExtensionPool()
-                       ->FindExtensionByNumber(descriptor, field_number);
+          field = input->GetExtensionPool()->FindExtensionByNumber(
+              descriptor, field_number);
         }
       }
 
       // If that failed, but we're a MessageSet, and this is the tag for a
       // MessageSet item, then parse that.
-      if (field == NULL &&
-          descriptor->options().message_set_wire_format() &&
+      if (field == NULL && descriptor->options().message_set_wire_format() &&
           tag == WireFormatLite::kMessageSetItemStartTag) {
         if (!ParseAndMergeMessageSetItem(input, message)) {
           return false;
@@ -448,8 +437,8 @@
                                      UnknownFieldSet* unknown_fields) {
   uint32 length;
   if (!input->ReadVarint32(&length)) return false;
-  return input->ReadString(
-      unknown_fields->AddLengthDelimited(field_number), length);
+  return input->ReadString(unknown_fields->AddLengthDelimited(field_number),
+                           length);
 }
 
 bool WireFormat::ParseAndMergeMessageSetField(uint32 field_number,
@@ -480,9 +469,8 @@
 
 bool WireFormat::ParseAndMergeField(
     uint32 tag,
-    const FieldDescriptor* field,        // May be NULL for unknown
-    Message* message,
-    io::CodedInputStream* input) {
+    const FieldDescriptor* field,  // May be NULL for unknown
+    Message* message, io::CodedInputStream* input) {
   const Reflection* message_reflection = message->GetReflection();
 
   enum { UNKNOWN, NORMAL_FORMAT, PACKED_FORMAT } value_format;
@@ -494,7 +482,7 @@
     value_format = NORMAL_FORMAT;
   } else if (field->is_packable() &&
              WireFormatLite::GetTagWireType(tag) ==
-             WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+                 WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
     value_format = PACKED_FORMAT;
   } else {
     // We don't recognize this field. Either the field number is unknown
@@ -512,30 +500,31 @@
 
     switch (field->type()) {
 #define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD)                      \
-      case FieldDescriptor::TYPE_##TYPE: {                                     \
-        while (input->BytesUntilLimit() > 0) {                                 \
-          CPPTYPE value;                                                       \
-          if (!WireFormatLite::ReadPrimitive<                                  \
-                CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value))          \
-            return false;                                                      \
-          message_reflection->Add##CPPTYPE_METHOD(message, field, value);      \
-        }                                                                      \
-        break;                                                                 \
-      }
+  case FieldDescriptor::TYPE_##TYPE: {                                         \
+    while (input->BytesUntilLimit() > 0) {                                     \
+      CPPTYPE value;                                                           \
+      if (!WireFormatLite::ReadPrimitive<CPPTYPE,                              \
+                                         WireFormatLite::TYPE_##TYPE>(input,   \
+                                                                      &value)) \
+        return false;                                                          \
+      message_reflection->Add##CPPTYPE_METHOD(message, field, value);          \
+    }                                                                          \
+    break;                                                                     \
+  }
 
-      HANDLE_PACKED_TYPE( INT32,  int32,  Int32)
-      HANDLE_PACKED_TYPE( INT64,  int64,  Int64)
-      HANDLE_PACKED_TYPE(SINT32,  int32,  Int32)
-      HANDLE_PACKED_TYPE(SINT64,  int64,  Int64)
+      HANDLE_PACKED_TYPE(INT32, int32, Int32)
+      HANDLE_PACKED_TYPE(INT64, int64, Int64)
+      HANDLE_PACKED_TYPE(SINT32, int32, Int32)
+      HANDLE_PACKED_TYPE(SINT64, int64, Int64)
       HANDLE_PACKED_TYPE(UINT32, uint32, UInt32)
       HANDLE_PACKED_TYPE(UINT64, uint64, UInt64)
 
-      HANDLE_PACKED_TYPE( FIXED32, uint32, UInt32)
-      HANDLE_PACKED_TYPE( FIXED64, uint64, UInt64)
-      HANDLE_PACKED_TYPE(SFIXED32,  int32,  Int32)
-      HANDLE_PACKED_TYPE(SFIXED64,  int64,  Int64)
+      HANDLE_PACKED_TYPE(FIXED32, uint32, UInt32)
+      HANDLE_PACKED_TYPE(FIXED64, uint64, UInt64)
+      HANDLE_PACKED_TYPE(SFIXED32, int32, Int32)
+      HANDLE_PACKED_TYPE(SFIXED64, int64, Int64)
 
-      HANDLE_PACKED_TYPE(FLOAT , float , Float )
+      HANDLE_PACKED_TYPE(FLOAT, float, Float)
       HANDLE_PACKED_TYPE(DOUBLE, double, Double)
 
       HANDLE_PACKED_TYPE(BOOL, bool, Bool)
@@ -545,7 +534,8 @@
         while (input->BytesUntilLimit() > 0) {
           int value;
           if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
-                  input, &value)) return false;
+                  input, &value))
+            return false;
           if (message->GetDescriptor()->file()->syntax() ==
               FileDescriptor::SYNTAX_PROTO3) {
             message_reflection->AddEnumValue(message, field, value);
@@ -558,10 +548,8 @@
               // The enum value is not one of the known values.  Add it to the
               // UnknownFieldSet.
               int64 sign_extended_value = static_cast<int64>(value);
-              message_reflection->MutableUnknownFields(message)
-                  ->AddVarint(
-                      WireFormatLite::GetTagFieldNumber(tag),
-                      sign_extended_value);
+              message_reflection->MutableUnknownFields(message)->AddVarint(
+                  WireFormatLite::GetTagFieldNumber(tag), sign_extended_value);
             }
           }
         }
@@ -584,32 +572,32 @@
     // Non-packed value (value_format == NORMAL_FORMAT)
     switch (field->type()) {
 #define HANDLE_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD)                            \
-      case FieldDescriptor::TYPE_##TYPE: {                                    \
-        CPPTYPE value;                                                        \
-        if (!WireFormatLite::ReadPrimitive<                                   \
-                CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value))         \
-          return false;                                                       \
-        if (field->is_repeated()) {                                           \
-          message_reflection->Add##CPPTYPE_METHOD(message, field, value);     \
-        } else {                                                              \
-          message_reflection->Set##CPPTYPE_METHOD(message, field, value);     \
-        }                                                                     \
-        break;                                                                \
-      }
+  case FieldDescriptor::TYPE_##TYPE: {                                        \
+    CPPTYPE value;                                                            \
+    if (!WireFormatLite::ReadPrimitive<CPPTYPE, WireFormatLite::TYPE_##TYPE>( \
+            input, &value))                                                   \
+      return false;                                                           \
+    if (field->is_repeated()) {                                               \
+      message_reflection->Add##CPPTYPE_METHOD(message, field, value);         \
+    } else {                                                                  \
+      message_reflection->Set##CPPTYPE_METHOD(message, field, value);         \
+    }                                                                         \
+    break;                                                                    \
+  }
 
-      HANDLE_TYPE( INT32,  int32,  Int32)
-      HANDLE_TYPE( INT64,  int64,  Int64)
-      HANDLE_TYPE(SINT32,  int32,  Int32)
-      HANDLE_TYPE(SINT64,  int64,  Int64)
+      HANDLE_TYPE(INT32, int32, Int32)
+      HANDLE_TYPE(INT64, int64, Int64)
+      HANDLE_TYPE(SINT32, int32, Int32)
+      HANDLE_TYPE(SINT64, int64, Int64)
       HANDLE_TYPE(UINT32, uint32, UInt32)
       HANDLE_TYPE(UINT64, uint64, UInt64)
 
-      HANDLE_TYPE( FIXED32, uint32, UInt32)
-      HANDLE_TYPE( FIXED64, uint64, UInt64)
-      HANDLE_TYPE(SFIXED32,  int32,  Int32)
-      HANDLE_TYPE(SFIXED64,  int64,  Int64)
+      HANDLE_TYPE(FIXED32, uint32, UInt32)
+      HANDLE_TYPE(FIXED64, uint64, UInt64)
+      HANDLE_TYPE(SFIXED32, int32, Int32)
+      HANDLE_TYPE(SFIXED64, int64, Int64)
 
-      HANDLE_TYPE(FLOAT , float , Float )
+      HANDLE_TYPE(FLOAT, float, Float)
       HANDLE_TYPE(DOUBLE, double, Double)
 
       HANDLE_TYPE(BOOL, bool, Bool)
@@ -618,7 +606,8 @@
       case FieldDescriptor::TYPE_ENUM: {
         int value;
         if (!WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
-                input, &value)) return false;
+                input, &value))
+          return false;
         if (field->is_repeated()) {
           message_reflection->AddEnumValue(message, field, value);
         } else {
@@ -633,9 +622,9 @@
         std::string value;
         if (!WireFormatLite::ReadString(input, &value)) return false;
         if (strict_utf8_check) {
-          if (!WireFormatLite::VerifyUtf8String(
-                  value.data(), value.length(), WireFormatLite::PARSE,
-                  field->full_name().c_str())) {
+          if (!WireFormatLite::VerifyUtf8String(value.data(), value.length(),
+                                                WireFormatLite::PARSE,
+                                                field->full_name().c_str())) {
             return false;
           }
         } else {
@@ -696,9 +685,8 @@
   return true;
 }
 
-bool WireFormat::ParseAndMergeMessageSetItem(
-    io::CodedInputStream* input,
-    Message* message) {
+bool WireFormat::ParseAndMergeMessageSetItem(io::CodedInputStream* input,
+                                             Message* message) {
   struct MSReflective {
     bool ParseField(int type_id, io::CodedInputStream* input) {
       const FieldDescriptor* field =
@@ -720,9 +708,8 @@
 
 // ===================================================================
 
-void WireFormat::SerializeWithCachedSizes(
-    const Message& message,
-    int size, io::CodedOutputStream* output) {
+void WireFormat::SerializeWithCachedSizes(const Message& message, int size,
+                                          io::CodedOutputStream* output) {
   const Descriptor* descriptor = message.GetDescriptor();
   const Reflection* message_reflection = message.GetReflection();
   int expected_endpoint = output->ByteCount() + size;
@@ -746,14 +733,14 @@
     SerializeUnknownMessageSetItems(
         message_reflection->GetUnknownFields(message), output);
   } else {
-    SerializeUnknownFields(
-        message_reflection->GetUnknownFields(message), output);
+    SerializeUnknownFields(message_reflection->GetUnknownFields(message),
+                           output);
   }
 
   GOOGLE_CHECK_EQ(output->ByteCount(), expected_endpoint)
-    << ": Protocol message serialized to a size different from what was "
-       "originally expected.  Perhaps it was modified by another thread "
-       "during serialization?";
+      << ": Protocol message serialized to a size different from what was "
+         "originally expected.  Perhaps it was modified by another thread "
+         "during serialization?";
 }
 
 static void SerializeMapKeyWithCachedSizes(const FieldDescriptor* field,
@@ -879,10 +866,9 @@
   SerializeMapValueRefWithCachedSizes(value_field, value, output);
 }
 
-void WireFormat::SerializeFieldWithCachedSizes(
-    const FieldDescriptor* field,
-    const Message& message,
-    io::CodedOutputStream* output) {
+void WireFormat::SerializeFieldWithCachedSizes(const FieldDescriptor* field,
+                                               const Message& message,
+                                               io::CodedOutputStream* output) {
   const Reflection* message_reflection = message.GetReflection();
 
   if (field->is_extension() &&
@@ -956,67 +942,68 @@
   const bool is_packed = field->is_packed();
   if (is_packed && count > 0) {
     WireFormatLite::WriteTag(field->number(),
-        WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
+                             WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output);
     const size_t data_size = FieldDataOnlyByteSize(field, message);
     output->WriteVarint32(data_size);
   }
 
   for (int j = 0; j < count; j++) {
     switch (field->type()) {
-#define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD)      \
-      case FieldDescriptor::TYPE_##TYPE: {                                     \
-        const CPPTYPE value = field->is_repeated() ?                           \
-                              message_reflection->GetRepeated##CPPTYPE_METHOD( \
-                                message, field, j) :                           \
-                              message_reflection->Get##CPPTYPE_METHOD(         \
-                                message, field);                               \
-        if (is_packed) {                                                       \
-          WireFormatLite::Write##TYPE_METHOD##NoTag(value, output);            \
-        } else {                                                               \
-          WireFormatLite::Write##TYPE_METHOD(field->number(), value, output);  \
-        }                                                                      \
-        break;                                                                 \
-      }
+#define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD)     \
+  case FieldDescriptor::TYPE_##TYPE: {                                        \
+    const CPPTYPE value =                                                     \
+        field->is_repeated()                                                  \
+            ? message_reflection->GetRepeated##CPPTYPE_METHOD(message, field, \
+                                                              j)              \
+            : message_reflection->Get##CPPTYPE_METHOD(message, field);        \
+    if (is_packed) {                                                          \
+      WireFormatLite::Write##TYPE_METHOD##NoTag(value, output);               \
+    } else {                                                                  \
+      WireFormatLite::Write##TYPE_METHOD(field->number(), value, output);     \
+    }                                                                         \
+    break;                                                                    \
+  }
 
-      HANDLE_PRIMITIVE_TYPE( INT32,  int32,  Int32,  Int32)
-      HANDLE_PRIMITIVE_TYPE( INT64,  int64,  Int64,  Int64)
-      HANDLE_PRIMITIVE_TYPE(SINT32,  int32, SInt32,  Int32)
-      HANDLE_PRIMITIVE_TYPE(SINT64,  int64, SInt64,  Int64)
+      HANDLE_PRIMITIVE_TYPE(INT32, int32, Int32, Int32)
+      HANDLE_PRIMITIVE_TYPE(INT64, int64, Int64, Int64)
+      HANDLE_PRIMITIVE_TYPE(SINT32, int32, SInt32, Int32)
+      HANDLE_PRIMITIVE_TYPE(SINT64, int64, SInt64, Int64)
       HANDLE_PRIMITIVE_TYPE(UINT32, uint32, UInt32, UInt32)
       HANDLE_PRIMITIVE_TYPE(UINT64, uint64, UInt64, UInt64)
 
-      HANDLE_PRIMITIVE_TYPE( FIXED32, uint32,  Fixed32, UInt32)
-      HANDLE_PRIMITIVE_TYPE( FIXED64, uint64,  Fixed64, UInt64)
-      HANDLE_PRIMITIVE_TYPE(SFIXED32,  int32, SFixed32,  Int32)
-      HANDLE_PRIMITIVE_TYPE(SFIXED64,  int64, SFixed64,  Int64)
+      HANDLE_PRIMITIVE_TYPE(FIXED32, uint32, Fixed32, UInt32)
+      HANDLE_PRIMITIVE_TYPE(FIXED64, uint64, Fixed64, UInt64)
+      HANDLE_PRIMITIVE_TYPE(SFIXED32, int32, SFixed32, Int32)
+      HANDLE_PRIMITIVE_TYPE(SFIXED64, int64, SFixed64, Int64)
 
-      HANDLE_PRIMITIVE_TYPE(FLOAT , float , Float , Float )
+      HANDLE_PRIMITIVE_TYPE(FLOAT, float, Float, Float)
       HANDLE_PRIMITIVE_TYPE(DOUBLE, double, Double, Double)
 
       HANDLE_PRIMITIVE_TYPE(BOOL, bool, Bool, Bool)
 #undef HANDLE_PRIMITIVE_TYPE
 
-#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD)                      \
-      case FieldDescriptor::TYPE_##TYPE:                                    \
-        WireFormatLite::Write##TYPE_METHOD(                                 \
-              field->number(),                                              \
-              field->is_repeated() ?                                        \
-                (map_entries.empty() ?                                      \
-                     message_reflection->GetRepeated##CPPTYPE_METHOD(       \
-                                     message, field, j) :                   \
-                     *map_entries[j]) :                                     \
-                message_reflection->Get##CPPTYPE_METHOD(message, field),    \
-              output);                                                      \
-        break;
+#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD)                         \
+  case FieldDescriptor::TYPE_##TYPE:                                           \
+    WireFormatLite::Write##TYPE_METHOD(                                        \
+        field->number(),                                                       \
+        field->is_repeated()                                                   \
+            ? (map_entries.empty()                                             \
+                   ? message_reflection->GetRepeated##CPPTYPE_METHOD(message,  \
+                                                                     field, j) \
+                   : *map_entries[j])                                          \
+            : message_reflection->Get##CPPTYPE_METHOD(message, field),         \
+        output);                                                               \
+    break;
 
-      HANDLE_TYPE(GROUP  , Group  , Message)
+      HANDLE_TYPE(GROUP, Group, Message)
       HANDLE_TYPE(MESSAGE, Message, Message)
 #undef HANDLE_TYPE
 
       case FieldDescriptor::TYPE_ENUM: {
-        const EnumValueDescriptor* value = field->is_repeated() ?
-          message_reflection->GetRepeatedEnum(message, field, j) :
-          message_reflection->GetEnum(message, field);
+        const EnumValueDescriptor* value =
+            field->is_repeated()
+                ? message_reflection->GetRepeatedEnum(message, field, j)
+                : message_reflection->GetEnum(message, field);
         if (is_packed) {
           WireFormatLite::WriteEnumNoTag(value->number(), output);
         } else {
@@ -1064,8 +1051,7 @@
 }
 
 void WireFormat::SerializeMessageSetItemWithCachedSizes(
-    const FieldDescriptor* field,
-    const Message& message,
+    const FieldDescriptor* field, const Message& message,
     io::CodedOutputStream* output) {
   const Reflection* message_reflection = message.GetReflection();
 
@@ -1112,18 +1098,17 @@
 
   if (descriptor->options().message_set_wire_format()) {
     our_size += ComputeUnknownMessageSetItemsSize(
-      message_reflection->GetUnknownFields(message));
+        message_reflection->GetUnknownFields(message));
   } else {
-    our_size += ComputeUnknownFieldsSize(
-      message_reflection->GetUnknownFields(message));
+    our_size +=
+        ComputeUnknownFieldsSize(message_reflection->GetUnknownFields(message));
   }
 
   return our_size;
 }
 
-size_t WireFormat::FieldByteSize(
-    const FieldDescriptor* field,
-    const Message& message) {
+size_t WireFormat::FieldByteSize(const FieldDescriptor* field,
+                                 const Message& message) {
   const Reflection* message_reflection = message.GetReflection();
 
   if (field->is_extension() &&
@@ -1240,9 +1225,8 @@
   return 0;
 }
 
-size_t WireFormat::FieldDataOnlyByteSize(
-    const FieldDescriptor* field,
-    const Message& message) {
+size_t WireFormat::FieldDataOnlyByteSize(const FieldDescriptor* field,
+                                         const Message& message) {
   const Reflection* message_reflection = message.GetReflection();
 
   size_t data_size = 0;
@@ -1278,43 +1262,43 @@
   }
 
   switch (field->type()) {
-#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD)                     \
-    case FieldDescriptor::TYPE_##TYPE:                                     \
-      if (field->is_repeated()) {                                          \
-        for (int j = 0; j < count; j++) {                                  \
-          data_size += WireFormatLite::TYPE_METHOD##Size(                  \
-            message_reflection->GetRepeated##CPPTYPE_METHOD(               \
-              message, field, j));                                         \
-        }                                                                  \
-      } else {                                                             \
-        data_size += WireFormatLite::TYPE_METHOD##Size(                    \
-          message_reflection->Get##CPPTYPE_METHOD(message, field));        \
-      }                                                                    \
-      break;
+#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD)                      \
+  case FieldDescriptor::TYPE_##TYPE:                                        \
+    if (field->is_repeated()) {                                             \
+      for (int j = 0; j < count; j++) {                                     \
+        data_size += WireFormatLite::TYPE_METHOD##Size(                     \
+            message_reflection->GetRepeated##CPPTYPE_METHOD(message, field, \
+                                                            j));            \
+      }                                                                     \
+    } else {                                                                \
+      data_size += WireFormatLite::TYPE_METHOD##Size(                       \
+          message_reflection->Get##CPPTYPE_METHOD(message, field));         \
+    }                                                                       \
+    break;
 
-#define HANDLE_FIXED_TYPE(TYPE, TYPE_METHOD)                               \
-    case FieldDescriptor::TYPE_##TYPE:                                     \
-      data_size += count * WireFormatLite::k##TYPE_METHOD##Size;           \
-      break;
+#define HANDLE_FIXED_TYPE(TYPE, TYPE_METHOD)                   \
+  case FieldDescriptor::TYPE_##TYPE:                           \
+    data_size += count * WireFormatLite::k##TYPE_METHOD##Size; \
+    break;
 
-    HANDLE_TYPE( INT32,  Int32,  Int32)
-    HANDLE_TYPE( INT64,  Int64,  Int64)
-    HANDLE_TYPE(SINT32, SInt32,  Int32)
-    HANDLE_TYPE(SINT64, SInt64,  Int64)
+    HANDLE_TYPE(INT32, Int32, Int32)
+    HANDLE_TYPE(INT64, Int64, Int64)
+    HANDLE_TYPE(SINT32, SInt32, Int32)
+    HANDLE_TYPE(SINT64, SInt64, Int64)
     HANDLE_TYPE(UINT32, UInt32, UInt32)
     HANDLE_TYPE(UINT64, UInt64, UInt64)
 
-    HANDLE_FIXED_TYPE( FIXED32,  Fixed32)
-    HANDLE_FIXED_TYPE( FIXED64,  Fixed64)
+    HANDLE_FIXED_TYPE(FIXED32, Fixed32)
+    HANDLE_FIXED_TYPE(FIXED64, Fixed64)
     HANDLE_FIXED_TYPE(SFIXED32, SFixed32)
     HANDLE_FIXED_TYPE(SFIXED64, SFixed64)
 
-    HANDLE_FIXED_TYPE(FLOAT , Float )
+    HANDLE_FIXED_TYPE(FLOAT, Float)
     HANDLE_FIXED_TYPE(DOUBLE, Double)
 
     HANDLE_FIXED_TYPE(BOOL, Bool)
 
-    HANDLE_TYPE(GROUP  , Group  , Message)
+    HANDLE_TYPE(GROUP, Group, Message)
     HANDLE_TYPE(MESSAGE, Message, Message)
 #undef HANDLE_TYPE
 #undef HANDLE_FIXED_TYPE
@@ -1323,11 +1307,11 @@
       if (field->is_repeated()) {
         for (int j = 0; j < count; j++) {
           data_size += WireFormatLite::EnumSize(
-            message_reflection->GetRepeatedEnum(message, field, j)->number());
+              message_reflection->GetRepeatedEnum(message, field, j)->number());
         }
       } else {
         data_size += WireFormatLite::EnumSize(
-          message_reflection->GetEnum(message, field)->number());
+            message_reflection->GetEnum(message, field)->number());
       }
       break;
     }
@@ -1352,9 +1336,8 @@
   return data_size;
 }
 
-size_t WireFormat::MessageSetItemByteSize(
-    const FieldDescriptor* field,
-    const Message& message) {
+size_t WireFormat::MessageSetItemByteSize(const FieldDescriptor* field,
+                                          const Message& message) {
   const Reflection* message_reflection = message.GetReflection();
 
   size_t our_size = WireFormatLite::kMessageSetItemTagsSize;
diff --git a/src/google/protobuf/wire_format_lite.cc b/src/google/protobuf/wire_format_lite.cc
index db058c2..5189a91 100644
--- a/src/google/protobuf/wire_format_lite.cc
+++ b/src/google/protobuf/wire_format_lite.cc
@@ -50,7 +50,6 @@
 namespace protobuf {
 namespace internal {
 
-
 #if !defined(_MSC_VER) || _MSC_VER >= 1900
 // Old version of MSVC doesn't like definitions of inline constants, GCC
 // requires them.
@@ -63,64 +62,63 @@
 
 // IBM xlC requires prefixing constants with WireFormatLite::
 const size_t WireFormatLite::kMessageSetItemTagsSize =
-  io::CodedOutputStream::StaticVarintSize32<
-      WireFormatLite::kMessageSetItemStartTag>::value +
-  io::CodedOutputStream::StaticVarintSize32<
-      WireFormatLite::kMessageSetItemEndTag>::value +
-  io::CodedOutputStream::StaticVarintSize32<
-      WireFormatLite::kMessageSetTypeIdTag>::value +
-  io::CodedOutputStream::StaticVarintSize32<
-      WireFormatLite::kMessageSetMessageTag>::value;
+    io::CodedOutputStream::StaticVarintSize32<
+        WireFormatLite::kMessageSetItemStartTag>::value +
+    io::CodedOutputStream::StaticVarintSize32<
+        WireFormatLite::kMessageSetItemEndTag>::value +
+    io::CodedOutputStream::StaticVarintSize32<
+        WireFormatLite::kMessageSetTypeIdTag>::value +
+    io::CodedOutputStream::StaticVarintSize32<
+        WireFormatLite::kMessageSetMessageTag>::value;
 
 const WireFormatLite::CppType
-WireFormatLite::kFieldTypeToCppTypeMap[MAX_FIELD_TYPE + 1] = {
-  static_cast<CppType>(0),  // 0 is reserved for errors
+    WireFormatLite::kFieldTypeToCppTypeMap[MAX_FIELD_TYPE + 1] = {
+        static_cast<CppType>(0),  // 0 is reserved for errors
 
-  CPPTYPE_DOUBLE,   // TYPE_DOUBLE
-  CPPTYPE_FLOAT,    // TYPE_FLOAT
-  CPPTYPE_INT64,    // TYPE_INT64
-  CPPTYPE_UINT64,   // TYPE_UINT64
-  CPPTYPE_INT32,    // TYPE_INT32
-  CPPTYPE_UINT64,   // TYPE_FIXED64
-  CPPTYPE_UINT32,   // TYPE_FIXED32
-  CPPTYPE_BOOL,     // TYPE_BOOL
-  CPPTYPE_STRING,   // TYPE_STRING
-  CPPTYPE_MESSAGE,  // TYPE_GROUP
-  CPPTYPE_MESSAGE,  // TYPE_MESSAGE
-  CPPTYPE_STRING,   // TYPE_BYTES
-  CPPTYPE_UINT32,   // TYPE_UINT32
-  CPPTYPE_ENUM,     // TYPE_ENUM
-  CPPTYPE_INT32,    // TYPE_SFIXED32
-  CPPTYPE_INT64,    // TYPE_SFIXED64
-  CPPTYPE_INT32,    // TYPE_SINT32
-  CPPTYPE_INT64,    // TYPE_SINT64
+        CPPTYPE_DOUBLE,   // TYPE_DOUBLE
+        CPPTYPE_FLOAT,    // TYPE_FLOAT
+        CPPTYPE_INT64,    // TYPE_INT64
+        CPPTYPE_UINT64,   // TYPE_UINT64
+        CPPTYPE_INT32,    // TYPE_INT32
+        CPPTYPE_UINT64,   // TYPE_FIXED64
+        CPPTYPE_UINT32,   // TYPE_FIXED32
+        CPPTYPE_BOOL,     // TYPE_BOOL
+        CPPTYPE_STRING,   // TYPE_STRING
+        CPPTYPE_MESSAGE,  // TYPE_GROUP
+        CPPTYPE_MESSAGE,  // TYPE_MESSAGE
+        CPPTYPE_STRING,   // TYPE_BYTES
+        CPPTYPE_UINT32,   // TYPE_UINT32
+        CPPTYPE_ENUM,     // TYPE_ENUM
+        CPPTYPE_INT32,    // TYPE_SFIXED32
+        CPPTYPE_INT64,    // TYPE_SFIXED64
+        CPPTYPE_INT32,    // TYPE_SINT32
+        CPPTYPE_INT64,    // TYPE_SINT64
 };
 
 const WireFormatLite::WireType
-WireFormatLite::kWireTypeForFieldType[MAX_FIELD_TYPE + 1] = {
-  static_cast<WireFormatLite::WireType>(-1),  // invalid
-  WireFormatLite::WIRETYPE_FIXED64,           // TYPE_DOUBLE
-  WireFormatLite::WIRETYPE_FIXED32,           // TYPE_FLOAT
-  WireFormatLite::WIRETYPE_VARINT,            // TYPE_INT64
-  WireFormatLite::WIRETYPE_VARINT,            // TYPE_UINT64
-  WireFormatLite::WIRETYPE_VARINT,            // TYPE_INT32
-  WireFormatLite::WIRETYPE_FIXED64,           // TYPE_FIXED64
-  WireFormatLite::WIRETYPE_FIXED32,           // TYPE_FIXED32
-  WireFormatLite::WIRETYPE_VARINT,            // TYPE_BOOL
-  WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_STRING
-  WireFormatLite::WIRETYPE_START_GROUP,       // TYPE_GROUP
-  WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_MESSAGE
-  WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_BYTES
-  WireFormatLite::WIRETYPE_VARINT,            // TYPE_UINT32
-  WireFormatLite::WIRETYPE_VARINT,            // TYPE_ENUM
-  WireFormatLite::WIRETYPE_FIXED32,           // TYPE_SFIXED32
-  WireFormatLite::WIRETYPE_FIXED64,           // TYPE_SFIXED64
-  WireFormatLite::WIRETYPE_VARINT,            // TYPE_SINT32
-  WireFormatLite::WIRETYPE_VARINT,            // TYPE_SINT64
+    WireFormatLite::kWireTypeForFieldType[MAX_FIELD_TYPE + 1] = {
+        static_cast<WireFormatLite::WireType>(-1),  // invalid
+        WireFormatLite::WIRETYPE_FIXED64,           // TYPE_DOUBLE
+        WireFormatLite::WIRETYPE_FIXED32,           // TYPE_FLOAT
+        WireFormatLite::WIRETYPE_VARINT,            // TYPE_INT64
+        WireFormatLite::WIRETYPE_VARINT,            // TYPE_UINT64
+        WireFormatLite::WIRETYPE_VARINT,            // TYPE_INT32
+        WireFormatLite::WIRETYPE_FIXED64,           // TYPE_FIXED64
+        WireFormatLite::WIRETYPE_FIXED32,           // TYPE_FIXED32
+        WireFormatLite::WIRETYPE_VARINT,            // TYPE_BOOL
+        WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_STRING
+        WireFormatLite::WIRETYPE_START_GROUP,       // TYPE_GROUP
+        WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_MESSAGE
+        WireFormatLite::WIRETYPE_LENGTH_DELIMITED,  // TYPE_BYTES
+        WireFormatLite::WIRETYPE_VARINT,            // TYPE_UINT32
+        WireFormatLite::WIRETYPE_VARINT,            // TYPE_ENUM
+        WireFormatLite::WIRETYPE_FIXED32,           // TYPE_SFIXED32
+        WireFormatLite::WIRETYPE_FIXED64,           // TYPE_SFIXED64
+        WireFormatLite::WIRETYPE_VARINT,            // TYPE_SINT32
+        WireFormatLite::WIRETYPE_VARINT,            // TYPE_SINT64
 };
 
-bool WireFormatLite::SkipField(
-    io::CodedInputStream* input, uint32 tag) {
+bool WireFormatLite::SkipField(io::CodedInputStream* input, uint32 tag) {
   // Field number 0 is illegal.
   if (WireFormatLite::GetTagFieldNumber(tag) == 0) return false;
   switch (WireFormatLite::GetTagWireType(tag)) {
@@ -145,9 +143,9 @@
       if (!SkipMessage(input)) return false;
       input->DecrementRecursionDepth();
       // Check that the ending tag matched the starting tag.
-      if (!input->LastTagWas(WireFormatLite::MakeTag(
-          WireFormatLite::GetTagFieldNumber(tag),
-          WireFormatLite::WIRETYPE_END_GROUP))) {
+      if (!input->LastTagWas(
+              WireFormatLite::MakeTag(WireFormatLite::GetTagFieldNumber(tag),
+                                      WireFormatLite::WIRETYPE_END_GROUP))) {
         return false;
       }
       return true;
@@ -166,8 +164,8 @@
   }
 }
 
-bool WireFormatLite::SkipField(
-    io::CodedInputStream* input, uint32 tag, io::CodedOutputStream* output) {
+bool WireFormatLite::SkipField(io::CodedInputStream* input, uint32 tag,
+                               io::CodedOutputStream* output) {
   // Field number 0 is illegal.
   if (WireFormatLite::GetTagFieldNumber(tag) == 0) return false;
   switch (WireFormatLite::GetTagWireType(tag)) {
@@ -202,9 +200,9 @@
       if (!SkipMessage(input, output)) return false;
       input->DecrementRecursionDepth();
       // Check that the ending tag matched the starting tag.
-      if (!input->LastTagWas(WireFormatLite::MakeTag(
-          WireFormatLite::GetTagFieldNumber(tag),
-          WireFormatLite::WIRETYPE_END_GROUP))) {
+      if (!input->LastTagWas(
+              WireFormatLite::MakeTag(WireFormatLite::GetTagFieldNumber(tag),
+                                      WireFormatLite::WIRETYPE_END_GROUP))) {
         return false;
       }
       return true;
@@ -245,7 +243,7 @@
 }
 
 bool WireFormatLite::SkipMessage(io::CodedInputStream* input,
-    io::CodedOutputStream* output) {
+                                 io::CodedOutputStream* output) {
   while (true) {
     uint32 tag = input->ReadTag();
     if (tag == 0) {
@@ -265,8 +263,7 @@
   }
 }
 
-bool FieldSkipper::SkipField(
-    io::CodedInputStream* input, uint32 tag) {
+bool FieldSkipper::SkipField(io::CodedInputStream* input, uint32 tag) {
   return WireFormatLite::SkipField(input, tag);
 }
 
@@ -274,13 +271,12 @@
   return WireFormatLite::SkipMessage(input);
 }
 
-void FieldSkipper::SkipUnknownEnum(
-    int /* field_number */, int /* value */) {
+void FieldSkipper::SkipUnknownEnum(int /* field_number */, int /* value */) {
   // Nothing.
 }
 
-bool CodedOutputStreamFieldSkipper::SkipField(
-    io::CodedInputStream* input, uint32 tag) {
+bool CodedOutputStreamFieldSkipper::SkipField(io::CodedInputStream* input,
+                                              uint32 tag) {
   return WireFormatLite::SkipField(input, tag, unknown_fields_);
 }
 
@@ -288,8 +284,8 @@
   return WireFormatLite::SkipMessage(input, unknown_fields_);
 }
 
-void CodedOutputStreamFieldSkipper::SkipUnknownEnum(
-    int field_number, int value) {
+void CodedOutputStreamFieldSkipper::SkipUnknownEnum(int field_number,
+                                                    int value) {
   unknown_fields_->WriteVarint32(field_number);
   unknown_fields_->WriteVarint64(value);
 }
@@ -314,11 +310,8 @@
 }
 
 bool WireFormatLite::ReadPackedEnumPreserveUnknowns(
-    io::CodedInputStream* input,
-    int field_number,
-    bool (*is_valid)(int),
-    io::CodedOutputStream* unknown_fields_stream,
-    RepeatedField<int>* values) {
+    io::CodedInputStream* input, int field_number, bool (*is_valid)(int),
+    io::CodedOutputStream* unknown_fields_stream, RepeatedField<int>* values) {
   uint32 length;
   if (!input->ReadVarint32(&length)) return false;
   io::CodedInputStream::Limit limit = input->PushLimit(length);
@@ -385,7 +378,7 @@
     int to_do = std::min(kAtATime, n - i);
     uint8* ptr = buf;
     for (int j = 0; j < to_do; j++) {
-      EncodeFixedSizeValue(a[i+j], ptr);
+      EncodeFixedSizeValue(a[i + j], ptr);
       ptr += sizeof(a[0]);
     }
     output->WriteRaw(buf, to_do * sizeof(a[0]));
@@ -399,12 +392,12 @@
 }
 
 void WireFormatLite::WriteDoubleArray(const double* a, int n,
-                                     io::CodedOutputStream* output) {
+                                      io::CodedOutputStream* output) {
   WriteArray<double>(a, n, output);
 }
 
 void WireFormatLite::WriteFixed32Array(const uint32* a, int n,
-                                     io::CodedOutputStream* output) {
+                                       io::CodedOutputStream* output) {
   WriteArray<uint32>(a, n, output);
 }
 
@@ -414,12 +407,12 @@
 }
 
 void WireFormatLite::WriteSFixed32Array(const int32* a, int n,
-                                       io::CodedOutputStream* output) {
+                                        io::CodedOutputStream* output) {
   WriteArray<int32>(a, n, output);
 }
 
 void WireFormatLite::WriteSFixed64Array(const int64* a, int n,
-                                       io::CodedOutputStream* output) {
+                                        io::CodedOutputStream* output) {
   WriteArray<int64>(a, n, output);
 }
 
@@ -533,16 +526,14 @@
 }
 
 
-void WireFormatLite::WriteGroup(int field_number,
-                                const MessageLite& value,
+void WireFormatLite::WriteGroup(int field_number, const MessageLite& value,
                                 io::CodedOutputStream* output) {
   WriteTag(field_number, WIRETYPE_START_GROUP, output);
   value.SerializeWithCachedSizes(output);
   WriteTag(field_number, WIRETYPE_END_GROUP, output);
 }
 
-void WireFormatLite::WriteMessage(int field_number,
-                                  const MessageLite& value,
+void WireFormatLite::WriteMessage(int field_number, const MessageLite& value,
                                   io::CodedOutputStream* output) {
   WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output);
   const int size = value.GetCachedSize();
@@ -587,7 +578,7 @@
                                      std::string* value) {
   uint32 length;
   return input->ReadVarint32(&length) &&
-      input->InternalReadStringInline(value, length);
+         input->InternalReadStringInline(value, length);
 }
 
 bool WireFormatLite::ReadBytes(io::CodedInputStream* input,
@@ -615,9 +606,7 @@
              << "bytes. " << stacktrace;
 }
 
-bool WireFormatLite::VerifyUtf8String(const char* data,
-                                      int size,
-                                      Operation op,
+bool WireFormatLite::VerifyUtf8String(const char* data, int size, Operation op,
                                       const char* field_name) {
   if (!IsStructurallyValidUTF8(data, size)) {
     const char* operation_str = NULL;
@@ -628,7 +617,7 @@
       case SERIALIZE:
         operation_str = "serializing";
         break;
-      // no default case: have the compiler warn if a case is not covered.
+        // no default case: have the compiler warn if a case is not covered.
     }
     PrintUTF8ErrorLog(field_name, operation_str, false);
     return false;
@@ -638,18 +627,18 @@
 
 // this code is deliberately written such that clang makes it into really
 // efficient SSE code.
-template<bool ZigZag, bool SignExtended, typename T>
+template <bool ZigZag, bool SignExtended, typename T>
 static size_t VarintSize(const T* data, const int n) {
 #if __cplusplus >= 201103L
   static_assert(sizeof(T) == 4, "This routine only works for 32 bit integers");
   // is_unsigned<T> => !ZigZag
-  static_assert((std::is_unsigned<T>::value ^ ZigZag) ||
-                std::is_signed<T>::value,
-                "Cannot ZigZag encode unsigned types");
+  static_assert(
+      (std::is_unsigned<T>::value ^ ZigZag) || std::is_signed<T>::value,
+      "Cannot ZigZag encode unsigned types");
   // is_unsigned<T> => !SignExtended
-  static_assert((std::is_unsigned<T>::value ^ SignExtended) ||
-                std::is_signed<T>::value,
-                "Cannot SignExtended unsigned types");
+  static_assert(
+      (std::is_unsigned<T>::value ^ SignExtended) || std::is_signed<T>::value,
+      "Cannot SignExtended unsigned types");
   static_assert(!(SignExtended && ZigZag),
                 "Cannot SignExtended and ZigZag on the same type");
 #endif
@@ -675,7 +664,7 @@
   return sum;
 }
 
-template<bool ZigZag, typename T>
+template <bool ZigZag, typename T>
 static size_t VarintSize64(const T* data, const int n) {
 #if __cplusplus >= 201103L
   static_assert(sizeof(T) == 8, "This routine only works for 64 bit integers");
@@ -771,7 +760,7 @@
 // enable this.
 #define USE_SSE_FOR_64_BIT_INTEGER_ARRAYS 0
 #if USE_SSE_FOR_64_BIT_INTEGER_ARRAYS
-size_t WireFormatLite::Int64Size (const RepeatedField< int64>& value) {
+size_t WireFormatLite::Int64Size(const RepeatedField<int64>& value) {
   return VarintSize64<false>(value.data(), value.size());
 }
 
@@ -779,13 +768,13 @@
   return VarintSize64<false>(value.data(), value.size());
 }
 
-size_t WireFormatLite::SInt64Size(const RepeatedField< int64>& value) {
+size_t WireFormatLite::SInt64Size(const RepeatedField<int64>& value) {
   return VarintSize64<true>(value.data(), value.size());
 }
 
 #else
 
-size_t WireFormatLite::Int64Size (const RepeatedField< int64>& value) {
+size_t WireFormatLite::Int64Size(const RepeatedField<int64>& value) {
   size_t out = 0;
   const int n = value.size();
   for (int i = 0; i < n; i++) {
@@ -803,7 +792,7 @@
   return out;
 }
 
-size_t WireFormatLite::SInt64Size(const RepeatedField< int64>& value) {
+size_t WireFormatLite::SInt64Size(const RepeatedField<int64>& value) {
   size_t out = 0;
   const int n = value.size();
   for (int i = 0; i < n; i++) {
diff --git a/src/google/protobuf/wire_format_lite.h b/src/google/protobuf/wire_format_lite.h
index 2468163..e0972d9 100644
--- a/src/google/protobuf/wire_format_lite.h
+++ b/src/google/protobuf/wire_format_lite.h
@@ -909,8 +909,7 @@
 
 template <>
 inline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_INT32>(
-    io::CodedInputStream* input,
-    int32* value) {
+    io::CodedInputStream* input, int32* value) {
   uint32 temp;
   if (!input->ReadVarint32(&temp)) return false;
   *value = static_cast<int32>(temp);
@@ -918,8 +917,7 @@
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_INT64>(
-    io::CodedInputStream* input,
-    int64* value) {
+    io::CodedInputStream* input, int64* value) {
   uint64 temp;
   if (!input->ReadVarint64(&temp)) return false;
   *value = static_cast<int64>(temp);
@@ -927,20 +925,17 @@
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<uint32, WireFormatLite::TYPE_UINT32>(
-    io::CodedInputStream* input,
-    uint32* value) {
+    io::CodedInputStream* input, uint32* value) {
   return input->ReadVarint32(value);
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<uint64, WireFormatLite::TYPE_UINT64>(
-    io::CodedInputStream* input,
-    uint64* value) {
+    io::CodedInputStream* input, uint64* value) {
   return input->ReadVarint64(value);
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_SINT32>(
-    io::CodedInputStream* input,
-    int32* value) {
+    io::CodedInputStream* input, int32* value) {
   uint32 temp;
   if (!input->ReadVarint32(&temp)) return false;
   *value = ZigZagDecode32(temp);
@@ -948,8 +943,7 @@
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_SINT64>(
-    io::CodedInputStream* input,
-    int64* value) {
+    io::CodedInputStream* input, int64* value) {
   uint64 temp;
   if (!input->ReadVarint64(&temp)) return false;
   *value = ZigZagDecode64(temp);
@@ -957,20 +951,17 @@
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<uint32, WireFormatLite::TYPE_FIXED32>(
-    io::CodedInputStream* input,
-    uint32* value) {
+    io::CodedInputStream* input, uint32* value) {
   return input->ReadLittleEndian32(value);
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<uint64, WireFormatLite::TYPE_FIXED64>(
-    io::CodedInputStream* input,
-    uint64* value) {
+    io::CodedInputStream* input, uint64* value) {
   return input->ReadLittleEndian64(value);
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<int32, WireFormatLite::TYPE_SFIXED32>(
-    io::CodedInputStream* input,
-    int32* value) {
+    io::CodedInputStream* input, int32* value) {
   uint32 temp;
   if (!input->ReadLittleEndian32(&temp)) return false;
   *value = static_cast<int32>(temp);
@@ -978,8 +969,7 @@
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<int64, WireFormatLite::TYPE_SFIXED64>(
-    io::CodedInputStream* input,
-    int64* value) {
+    io::CodedInputStream* input, int64* value) {
   uint64 temp;
   if (!input->ReadLittleEndian64(&temp)) return false;
   *value = static_cast<int64>(temp);
@@ -987,8 +977,7 @@
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<float, WireFormatLite::TYPE_FLOAT>(
-    io::CodedInputStream* input,
-    float* value) {
+    io::CodedInputStream* input, float* value) {
   uint32 temp;
   if (!input->ReadLittleEndian32(&temp)) return false;
   *value = DecodeFloat(temp);
@@ -996,8 +985,7 @@
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<double, WireFormatLite::TYPE_DOUBLE>(
-    io::CodedInputStream* input,
-    double* value) {
+    io::CodedInputStream* input, double* value) {
   uint64 temp;
   if (!input->ReadLittleEndian64(&temp)) return false;
   *value = DecodeDouble(temp);
@@ -1005,8 +993,7 @@
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<bool, WireFormatLite::TYPE_BOOL>(
-    io::CodedInputStream* input,
-    bool* value) {
+    io::CodedInputStream* input, bool* value) {
   uint64 temp;
   if (!input->ReadVarint64(&temp)) return false;
   *value = temp != 0;
@@ -1014,8 +1001,7 @@
 }
 template <>
 inline bool WireFormatLite::ReadPrimitive<int, WireFormatLite::TYPE_ENUM>(
-    io::CodedInputStream* input,
-    int* value) {
+    io::CodedInputStream* input, int* value) {
   uint32 temp;
   if (!input->ReadVarint32(&temp)) return false;
   *value = static_cast<int>(temp);
@@ -1023,54 +1009,48 @@
 }
 
 template <>
-inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
-  uint32, WireFormatLite::TYPE_FIXED32>(
-    const uint8* buffer,
-    uint32* value) {
+inline const uint8*
+WireFormatLite::ReadPrimitiveFromArray<uint32, WireFormatLite::TYPE_FIXED32>(
+    const uint8* buffer, uint32* value) {
   return io::CodedInputStream::ReadLittleEndian32FromArray(buffer, value);
 }
 template <>
-inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
-  uint64, WireFormatLite::TYPE_FIXED64>(
-    const uint8* buffer,
-    uint64* value) {
+inline const uint8*
+WireFormatLite::ReadPrimitiveFromArray<uint64, WireFormatLite::TYPE_FIXED64>(
+    const uint8* buffer, uint64* value) {
   return io::CodedInputStream::ReadLittleEndian64FromArray(buffer, value);
 }
 template <>
-inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
-  int32, WireFormatLite::TYPE_SFIXED32>(
-    const uint8* buffer,
-    int32* value) {
+inline const uint8*
+WireFormatLite::ReadPrimitiveFromArray<int32, WireFormatLite::TYPE_SFIXED32>(
+    const uint8* buffer, int32* value) {
   uint32 temp;
   buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp);
   *value = static_cast<int32>(temp);
   return buffer;
 }
 template <>
-inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
-  int64, WireFormatLite::TYPE_SFIXED64>(
-    const uint8* buffer,
-    int64* value) {
+inline const uint8*
+WireFormatLite::ReadPrimitiveFromArray<int64, WireFormatLite::TYPE_SFIXED64>(
+    const uint8* buffer, int64* value) {
   uint64 temp;
   buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp);
   *value = static_cast<int64>(temp);
   return buffer;
 }
 template <>
-inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
-  float, WireFormatLite::TYPE_FLOAT>(
-    const uint8* buffer,
-    float* value) {
+inline const uint8*
+WireFormatLite::ReadPrimitiveFromArray<float, WireFormatLite::TYPE_FLOAT>(
+    const uint8* buffer, float* value) {
   uint32 temp;
   buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp);
   *value = DecodeFloat(temp);
   return buffer;
 }
 template <>
-inline const uint8* WireFormatLite::ReadPrimitiveFromArray<
-  double, WireFormatLite::TYPE_DOUBLE>(
-    const uint8* buffer,
-    double* value) {
+inline const uint8*
+WireFormatLite::ReadPrimitiveFromArray<double, WireFormatLite::TYPE_DOUBLE>(
+    const uint8* buffer, double* value) {
   uint64 temp;
   buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp);
   *value = DecodeDouble(temp);
@@ -1080,9 +1060,7 @@
 template <typename CType, enum WireFormatLite::FieldType DeclaredType>
 inline bool WireFormatLite::ReadRepeatedPrimitive(
     int,  // tag_size, unused.
-    uint32 tag,
-    io::CodedInputStream* input,
-    RepeatedField<CType>* values) {
+    uint32 tag, io::CodedInputStream* input, RepeatedField<CType>* values) {
   CType value;
   if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
   values->Add(value);
@@ -1097,14 +1075,11 @@
 
 template <typename CType, enum WireFormatLite::FieldType DeclaredType>
 inline bool WireFormatLite::ReadRepeatedFixedSizePrimitive(
-    int tag_size,
-    uint32 tag,
-    io::CodedInputStream* input,
+    int tag_size, uint32 tag, io::CodedInputStream* input,
     RepeatedField<CType>* values) {
   GOOGLE_DCHECK_EQ(UInt32Size(tag), static_cast<size_t>(tag_size));
   CType value;
-  if (!ReadPrimitive<CType, DeclaredType>(input, &value))
-    return false;
+  if (!ReadPrimitive<CType, DeclaredType>(input, &value)) return false;
   values->Add(value);
 
   // For fixed size values, repeated values can be read more quickly by
@@ -1129,8 +1104,8 @@
         (std::min)(values->Capacity() - values->size(), size / per_value_size);
     int num_read = 0;
     while (num_read < elements_available &&
-           (buffer = io::CodedInputStream::ExpectTagFromArray(
-               buffer, tag)) != NULL) {
+           (buffer = io::CodedInputStream::ExpectTagFromArray(buffer, tag)) !=
+               NULL) {
       buffer = ReadPrimitiveFromArray<CType, DeclaredType>(buffer, &value);
       values->AddAlreadyReserved(value);
       ++num_read;
@@ -1145,18 +1120,16 @@
 
 // Specializations of ReadRepeatedPrimitive for the fixed size types, which use
 // the optimized code path.
-#define READ_REPEATED_FIXED_SIZE_PRIMITIVE(CPPTYPE, DECLARED_TYPE)             \
-template <>                                                                    \
-inline bool WireFormatLite::ReadRepeatedPrimitive<                             \
-  CPPTYPE, WireFormatLite::DECLARED_TYPE>(                                     \
-    int tag_size,                                                              \
-    uint32 tag,                                                                \
-    io::CodedInputStream* input,                                               \
-    RepeatedField<CPPTYPE>* values) {                                          \
-  return ReadRepeatedFixedSizePrimitive<                                       \
-    CPPTYPE, WireFormatLite::DECLARED_TYPE>(                                   \
-      tag_size, tag, input, values);                                           \
-}
+#define READ_REPEATED_FIXED_SIZE_PRIMITIVE(CPPTYPE, DECLARED_TYPE)        \
+  template <>                                                             \
+  inline bool WireFormatLite::ReadRepeatedPrimitive<                      \
+      CPPTYPE, WireFormatLite::DECLARED_TYPE>(                            \
+      int tag_size, uint32 tag, io::CodedInputStream* input,              \
+      RepeatedField<CPPTYPE>* values) {                                   \
+    return ReadRepeatedFixedSizePrimitive<CPPTYPE,                        \
+                                          WireFormatLite::DECLARED_TYPE>( \
+        tag_size, tag, input, values);                                    \
+  }
 
 READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32)
 READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64)
@@ -1169,12 +1142,10 @@
 
 template <typename CType, enum WireFormatLite::FieldType DeclaredType>
 bool WireFormatLite::ReadRepeatedPrimitiveNoInline(
-    int tag_size,
-    uint32 tag,
-    io::CodedInputStream* input,
+    int tag_size, uint32 tag, io::CodedInputStream* input,
     RepeatedField<CType>* value) {
-  return ReadRepeatedPrimitive<CType, DeclaredType>(
-      tag_size, tag, input, value);
+  return ReadRepeatedPrimitive<CType, DeclaredType>(tag_size, tag, input,
+                                                    value);
 }
 
 template <typename CType, enum WireFormatLite::FieldType DeclaredType>
@@ -1255,14 +1226,14 @@
 // Specializations of ReadPackedPrimitive for the fixed size types, which use
 // an optimized code path.
 #define READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE(CPPTYPE, DECLARED_TYPE)      \
-template <>                                                                    \
-inline bool WireFormatLite::ReadPackedPrimitive<                               \
-  CPPTYPE, WireFormatLite::DECLARED_TYPE>(                                     \
-    io::CodedInputStream* input,                                               \
-    RepeatedField<CPPTYPE>* values) {                                          \
-  return ReadPackedFixedSizePrimitive<                                         \
-      CPPTYPE, WireFormatLite::DECLARED_TYPE>(input, values);                  \
-}
+  template <>                                                                  \
+  inline bool                                                                  \
+  WireFormatLite::ReadPackedPrimitive<CPPTYPE, WireFormatLite::DECLARED_TYPE>( \
+      io::CodedInputStream * input, RepeatedField<CPPTYPE> * values) {         \
+    return ReadPackedFixedSizePrimitive<CPPTYPE,                               \
+                                        WireFormatLite::DECLARED_TYPE>(        \
+        input, values);                                                        \
+  }
 
 READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32)
 READ_REPEATED_PACKED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64)
@@ -1280,10 +1251,10 @@
 }
 
 
-template<typename MessageType>
-inline bool WireFormatLite::ReadGroup(
-    int field_number, io::CodedInputStream* input,
-    MessageType* value) {
+template <typename MessageType>
+inline bool WireFormatLite::ReadGroup(int field_number,
+                                      io::CodedInputStream* input,
+                                      MessageType* value) {
   if (!input->IncrementRecursionDepth()) return false;
   if (!value->MergePartialFromCodedStream(input)) return false;
   input->UnsafeDecrementRecursionDepth();
@@ -1293,9 +1264,9 @@
   }
   return true;
 }
-template<typename MessageType>
-inline bool WireFormatLite::ReadMessage(
-    io::CodedInputStream* input, MessageType* value) {
+template <typename MessageType>
+inline bool WireFormatLite::ReadMessage(io::CodedInputStream* input,
+                                        MessageType* value) {
   int length;
   if (!input->ReadVarintSizeAsInt(&length)) return false;
   std::pair<io::CodedInputStream::Limit, int> p =
@@ -1372,7 +1343,7 @@
 
 // See comment on ReadGroupNoVirtual to understand the need for this template
 // parameter name.
-template<typename MessageType_WorkAroundCppLookupDefect>
+template <typename MessageType_WorkAroundCppLookupDefect>
 inline void WireFormatLite::WriteGroupNoVirtual(
     int field_number, const MessageType_WorkAroundCppLookupDefect& value,
     io::CodedOutputStream* output) {
@@ -1380,7 +1351,7 @@
   value.MessageType_WorkAroundCppLookupDefect::SerializeWithCachedSizes(output);
   WriteTag(field_number, WIRETYPE_END_GROUP, output);
 }
-template<typename MessageType_WorkAroundCppLookupDefect>
+template <typename MessageType_WorkAroundCppLookupDefect>
 inline void WireFormatLite::WriteMessageNoVirtual(
     int field_number, const MessageType_WorkAroundCppLookupDefect& value,
     io::CodedOutputStream* output) {
@@ -1392,8 +1363,7 @@
 
 // ===================================================================
 
-inline uint8* WireFormatLite::WriteTagToArray(int field_number,
-                                              WireType type,
+inline uint8* WireFormatLite::WriteTagToArray(int field_number, WireType type,
                                               uint8* target) {
   return io::CodedOutputStream::WriteTagToArray(MakeTag(field_number, type),
                                                 target);
@@ -1405,8 +1375,8 @@
 }
 inline uint8* WireFormatLite::WriteInt64NoTagToArray(int64 value,
                                                      uint8* target) {
-  return io::CodedOutputStream::WriteVarint64ToArray(
-      static_cast<uint64>(value), target);
+  return io::CodedOutputStream::WriteVarint64ToArray(static_cast<uint64>(value),
+                                                     target);
 }
 inline uint8* WireFormatLite::WriteUInt32NoTagToArray(uint32 value,
                                                       uint8* target) {
@@ -1454,19 +1424,16 @@
   return io::CodedOutputStream::WriteLittleEndian64ToArray(EncodeDouble(value),
                                                            target);
 }
-inline uint8* WireFormatLite::WriteBoolNoTagToArray(bool value,
-                                                    uint8* target) {
+inline uint8* WireFormatLite::WriteBoolNoTagToArray(bool value, uint8* target) {
   return io::CodedOutputStream::WriteVarint32ToArray(value ? 1 : 0, target);
 }
-inline uint8* WireFormatLite::WriteEnumNoTagToArray(int value,
-                                                    uint8* target) {
+inline uint8* WireFormatLite::WriteEnumNoTagToArray(int value, uint8* target) {
   return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target);
 }
 
-template<typename T>
+template <typename T>
 inline uint8* WireFormatLite::WritePrimitiveNoTagToArray(
-      const RepeatedField<T>& value,
-      uint8* (*Writer)(T, uint8*), uint8* target) {
+    const RepeatedField<T>& value, uint8* (*Writer)(T, uint8*), uint8* target) {
   const int n = value.size();
   GOOGLE_DCHECK_GT(n, 0);
 
@@ -1479,12 +1446,11 @@
   return target;
 }
 
-template<typename T>
+template <typename T>
 inline uint8* WireFormatLite::WriteFixedNoTagToArray(
-      const RepeatedField<T>& value,
-      uint8* (*Writer)(T, uint8*), uint8* target) {
+    const RepeatedField<T>& value, uint8* (*Writer)(T, uint8*), uint8* target) {
 #if defined(PROTOBUF_LITTLE_ENDIAN)
-  (void) Writer;
+  (void)Writer;
 
   const int n = value.size();
   GOOGLE_DCHECK_GT(n, 0);
@@ -1499,11 +1465,11 @@
 }
 
 inline uint8* WireFormatLite::WriteInt32NoTagToArray(
-    const RepeatedField< int32>& value, uint8* target) {
+    const RepeatedField<int32>& value, uint8* target) {
   return WritePrimitiveNoTagToArray(value, WriteInt32NoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteInt64NoTagToArray(
-    const RepeatedField< int64>& value, uint8* target) {
+    const RepeatedField<int64>& value, uint8* target) {
   return WritePrimitiveNoTagToArray(value, WriteInt64NoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteUInt32NoTagToArray(
@@ -1515,11 +1481,11 @@
   return WritePrimitiveNoTagToArray(value, WriteUInt64NoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteSInt32NoTagToArray(
-    const RepeatedField< int32>& value, uint8* target) {
+    const RepeatedField<int32>& value, uint8* target) {
   return WritePrimitiveNoTagToArray(value, WriteSInt32NoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteSInt64NoTagToArray(
-    const RepeatedField< int64>& value, uint8* target) {
+    const RepeatedField<int64>& value, uint8* target) {
   return WritePrimitiveNoTagToArray(value, WriteSInt64NoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteFixed32NoTagToArray(
@@ -1531,15 +1497,15 @@
   return WriteFixedNoTagToArray(value, WriteFixed64NoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteSFixed32NoTagToArray(
-    const RepeatedField< int32>& value, uint8* target) {
+    const RepeatedField<int32>& value, uint8* target) {
   return WriteFixedNoTagToArray(value, WriteSFixed32NoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteSFixed64NoTagToArray(
-    const RepeatedField< int64>& value, uint8* target) {
+    const RepeatedField<int64>& value, uint8* target) {
   return WriteFixedNoTagToArray(value, WriteSFixed64NoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteFloatNoTagToArray(
-    const RepeatedField< float>& value, uint8* target) {
+    const RepeatedField<float>& value, uint8* target) {
   return WriteFixedNoTagToArray(value, WriteFloatNoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteDoubleNoTagToArray(
@@ -1547,103 +1513,88 @@
   return WriteFixedNoTagToArray(value, WriteDoubleNoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteBoolNoTagToArray(
-    const RepeatedField<  bool>& value, uint8* target) {
+    const RepeatedField<bool>& value, uint8* target) {
   return WritePrimitiveNoTagToArray(value, WriteBoolNoTagToArray, target);
 }
 inline uint8* WireFormatLite::WriteEnumNoTagToArray(
-    const RepeatedField<   int>& value, uint8* target) {
+    const RepeatedField<int>& value, uint8* target) {
   return WritePrimitiveNoTagToArray(value, WriteEnumNoTagToArray, target);
 }
 
-inline uint8* WireFormatLite::WriteInt32ToArray(int field_number,
-                                                int32 value,
+inline uint8* WireFormatLite::WriteInt32ToArray(int field_number, int32 value,
                                                 uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
   return WriteInt32NoTagToArray(value, target);
 }
-inline uint8* WireFormatLite::WriteInt64ToArray(int field_number,
-                                                int64 value,
+inline uint8* WireFormatLite::WriteInt64ToArray(int field_number, int64 value,
                                                 uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
   return WriteInt64NoTagToArray(value, target);
 }
-inline uint8* WireFormatLite::WriteUInt32ToArray(int field_number,
-                                                 uint32 value,
+inline uint8* WireFormatLite::WriteUInt32ToArray(int field_number, uint32 value,
                                                  uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
   return WriteUInt32NoTagToArray(value, target);
 }
-inline uint8* WireFormatLite::WriteUInt64ToArray(int field_number,
-                                                 uint64 value,
+inline uint8* WireFormatLite::WriteUInt64ToArray(int field_number, uint64 value,
                                                  uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
   return WriteUInt64NoTagToArray(value, target);
 }
-inline uint8* WireFormatLite::WriteSInt32ToArray(int field_number,
-                                                 int32 value,
+inline uint8* WireFormatLite::WriteSInt32ToArray(int field_number, int32 value,
                                                  uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
   return WriteSInt32NoTagToArray(value, target);
 }
-inline uint8* WireFormatLite::WriteSInt64ToArray(int field_number,
-                                                 int64 value,
+inline uint8* WireFormatLite::WriteSInt64ToArray(int field_number, int64 value,
                                                  uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
   return WriteSInt64NoTagToArray(value, target);
 }
 inline uint8* WireFormatLite::WriteFixed32ToArray(int field_number,
-                                                  uint32 value,
-                                                  uint8* target) {
+                                                  uint32 value, uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
   return WriteFixed32NoTagToArray(value, target);
 }
 inline uint8* WireFormatLite::WriteFixed64ToArray(int field_number,
-                                                  uint64 value,
-                                                  uint8* target) {
+                                                  uint64 value, uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
   return WriteFixed64NoTagToArray(value, target);
 }
 inline uint8* WireFormatLite::WriteSFixed32ToArray(int field_number,
-                                                   int32 value,
-                                                   uint8* target) {
+                                                   int32 value, uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
   return WriteSFixed32NoTagToArray(value, target);
 }
 inline uint8* WireFormatLite::WriteSFixed64ToArray(int field_number,
-                                                   int64 value,
-                                                   uint8* target) {
+                                                   int64 value, uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
   return WriteSFixed64NoTagToArray(value, target);
 }
-inline uint8* WireFormatLite::WriteFloatToArray(int field_number,
-                                                float value,
+inline uint8* WireFormatLite::WriteFloatToArray(int field_number, float value,
                                                 uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target);
   return WriteFloatNoTagToArray(value, target);
 }
-inline uint8* WireFormatLite::WriteDoubleToArray(int field_number,
-                                                 double value,
+inline uint8* WireFormatLite::WriteDoubleToArray(int field_number, double value,
                                                  uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target);
   return WriteDoubleNoTagToArray(value, target);
 }
-inline uint8* WireFormatLite::WriteBoolToArray(int field_number,
-                                               bool value,
+inline uint8* WireFormatLite::WriteBoolToArray(int field_number, bool value,
                                                uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
   return WriteBoolNoTagToArray(value, target);
 }
-inline uint8* WireFormatLite::WriteEnumToArray(int field_number,
-                                               int value,
+inline uint8* WireFormatLite::WriteEnumToArray(int field_number, int value,
                                                uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_VARINT, target);
   return WriteEnumNoTagToArray(value, target);
 }
 
-template<typename T>
+template <typename T>
 inline uint8* WireFormatLite::WritePrimitiveToArray(
-    int field_number,
-    const RepeatedField<T>& value,
+    int field_number, const RepeatedField<T>& value,
     uint8* (*Writer)(int, T, uint8*), uint8* target) {
   const int n = value.size();
   if (n == 0) {
@@ -1660,11 +1611,11 @@
 }
 
 inline uint8* WireFormatLite::WriteInt32ToArray(
-    int field_number, const RepeatedField< int32>& value, uint8* target) {
+    int field_number, const RepeatedField<int32>& value, uint8* target) {
   return WritePrimitiveToArray(field_number, value, WriteInt32ToArray, target);
 }
 inline uint8* WireFormatLite::WriteInt64ToArray(
-    int field_number, const RepeatedField< int64>& value, uint8* target) {
+    int field_number, const RepeatedField<int64>& value, uint8* target) {
   return WritePrimitiveToArray(field_number, value, WriteInt64ToArray, target);
 }
 inline uint8* WireFormatLite::WriteUInt32ToArray(
@@ -1676,47 +1627,49 @@
   return WritePrimitiveToArray(field_number, value, WriteUInt64ToArray, target);
 }
 inline uint8* WireFormatLite::WriteSInt32ToArray(
-    int field_number, const RepeatedField< int32>& value, uint8* target) {
+    int field_number, const RepeatedField<int32>& value, uint8* target) {
   return WritePrimitiveToArray(field_number, value, WriteSInt32ToArray, target);
 }
 inline uint8* WireFormatLite::WriteSInt64ToArray(
-    int field_number, const RepeatedField< int64>& value, uint8* target) {
+    int field_number, const RepeatedField<int64>& value, uint8* target) {
   return WritePrimitiveToArray(field_number, value, WriteSInt64ToArray, target);
 }
 inline uint8* WireFormatLite::WriteFixed32ToArray(
     int field_number, const RepeatedField<uint32>& value, uint8* target) {
-  return WritePrimitiveToArray(
-      field_number, value, WriteFixed32ToArray, target);
+  return WritePrimitiveToArray(field_number, value, WriteFixed32ToArray,
+                               target);
 }
 inline uint8* WireFormatLite::WriteFixed64ToArray(
     int field_number, const RepeatedField<uint64>& value, uint8* target) {
-  return WritePrimitiveToArray(
-      field_number, value, WriteFixed64ToArray, target);
+  return WritePrimitiveToArray(field_number, value, WriteFixed64ToArray,
+                               target);
 }
 inline uint8* WireFormatLite::WriteSFixed32ToArray(
-    int field_number, const RepeatedField< int32>& value, uint8* target) {
-  return WritePrimitiveToArray(
-      field_number, value, WriteSFixed32ToArray, target);
+    int field_number, const RepeatedField<int32>& value, uint8* target) {
+  return WritePrimitiveToArray(field_number, value, WriteSFixed32ToArray,
+                               target);
 }
 inline uint8* WireFormatLite::WriteSFixed64ToArray(
-    int field_number, const RepeatedField< int64>& value, uint8* target) {
-  return WritePrimitiveToArray(
-      field_number, value, WriteSFixed64ToArray, target);
+    int field_number, const RepeatedField<int64>& value, uint8* target) {
+  return WritePrimitiveToArray(field_number, value, WriteSFixed64ToArray,
+                               target);
 }
 inline uint8* WireFormatLite::WriteFloatToArray(
-    int field_number, const RepeatedField< float>& value, uint8* target) {
+    int field_number, const RepeatedField<float>& value, uint8* target) {
   return WritePrimitiveToArray(field_number, value, WriteFloatToArray, target);
 }
 inline uint8* WireFormatLite::WriteDoubleToArray(
     int field_number, const RepeatedField<double>& value, uint8* target) {
   return WritePrimitiveToArray(field_number, value, WriteDoubleToArray, target);
 }
-inline uint8* WireFormatLite::WriteBoolToArray(
-    int field_number, const RepeatedField<  bool>& value, uint8* target) {
+inline uint8* WireFormatLite::WriteBoolToArray(int field_number,
+                                               const RepeatedField<bool>& value,
+                                               uint8* target) {
   return WritePrimitiveToArray(field_number, value, WriteBoolToArray, target);
 }
-inline uint8* WireFormatLite::WriteEnumToArray(
-    int field_number, const RepeatedField<   int>& value, uint8* target) {
+inline uint8* WireFormatLite::WriteEnumToArray(int field_number,
+                                               const RepeatedField<int>& value,
+                                               uint8* target) {
   return WritePrimitiveToArray(field_number, value, WriteEnumToArray, target);
 }
 inline uint8* WireFormatLite::WriteStringToArray(int field_number,
@@ -1749,7 +1702,7 @@
     int field_number, const MessageType& value, uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
   target = io::CodedOutputStream::WriteVarint32ToArray(
-    static_cast<uint32>(value.GetCachedSize()), target);
+      static_cast<uint32>(value.GetCachedSize()), target);
   return value.InternalSerializeWithCachedSizesToArray(target);
 }
 
@@ -1770,9 +1723,9 @@
     uint8* target) {
   target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target);
   target = io::CodedOutputStream::WriteVarint32ToArray(
-        static_cast<uint32>(
-            value.MessageType_WorkAroundCppLookupDefect::GetCachedSize()),
-        target);
+      static_cast<uint32>(
+          value.MessageType_WorkAroundCppLookupDefect::GetCachedSize()),
+      target);
   return value.MessageType_WorkAroundCppLookupDefect::
       InternalSerializeWithCachedSizesToArray(target);
 }
@@ -1809,23 +1762,23 @@
 }
 
 
-template<typename MessageType>
+template <typename MessageType>
 inline size_t WireFormatLite::GroupSize(const MessageType& value) {
   return value.ByteSizeLong();
 }
-template<typename MessageType>
+template <typename MessageType>
 inline size_t WireFormatLite::MessageSize(const MessageType& value) {
   return LengthDelimitedSize(value.ByteSizeLong());
 }
 
 // See comment on ReadGroupNoVirtual to understand the need for this template
 // parameter name.
-template<typename MessageType_WorkAroundCppLookupDefect>
+template <typename MessageType_WorkAroundCppLookupDefect>
 inline size_t WireFormatLite::GroupSizeNoVirtual(
     const MessageType_WorkAroundCppLookupDefect& value) {
   return value.MessageType_WorkAroundCppLookupDefect::ByteSizeLong();
 }
-template<typename MessageType_WorkAroundCppLookupDefect>
+template <typename MessageType_WorkAroundCppLookupDefect>
 inline size_t WireFormatLite::MessageSizeNoVirtual(
     const MessageType_WorkAroundCppLookupDefect& value) {
   return LengthDelimitedSize(
@@ -1837,8 +1790,8 @@
   // but is not technically correct--if length is too large to fit in a uint32
   // then it will be silently truncated. We will need to fix this if we ever
   // decide to start supporting serialized messages greater than 2 GiB in size.
-  return length + io::CodedOutputStream::VarintSize32(
-      static_cast<uint32>(length));
+  return length +
+         io::CodedOutputStream::VarintSize32(static_cast<uint32>(length));
 }
 
 template <typename MS>
@@ -1885,8 +1838,8 @@
           uint32 length;
           if (!input->ReadVarint32(&length)) return false;
           if (static_cast<int32>(length) < 0) return false;
-          uint32 size = static_cast<uint32>(length +
-              io::CodedOutputStream::VarintSize32(length));
+          uint32 size = static_cast<uint32>(
+              length + io::CodedOutputStream::VarintSize32(length));
           message_data.resize(size);
           auto ptr = reinterpret_cast<uint8*>(&message_data[0]);
           ptr = io::CodedOutputStream::WriteVarint32ToArray(length, ptr);
diff --git a/src/google/protobuf/wire_format_unittest.cc b/src/google/protobuf/wire_format_unittest.cc
index 762aa66..cf0ccdc 100644
--- a/src/google/protobuf/wire_format_unittest.cc
+++ b/src/google/protobuf/wire_format_unittest.cc
@@ -33,14 +33,14 @@
 //  Sanjay Ghemawat, Jeff Dean, and others.
 
 #include <google/protobuf/wire_format.h>
-#include <google/protobuf/descriptor.h>
-#include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/test_util.h>
 #include <google/protobuf/unittest.pb.h>
-#include <google/protobuf/unittest_proto3_arena.pb.h>
 #include <google/protobuf/unittest_mset.pb.h>
 #include <google/protobuf/unittest_mset_wire_format.pb.h>
-#include <google/protobuf/test_util.h>
+#include <google/protobuf/unittest_proto3_arena.pb.h>
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/zero_copy_stream_impl.h>
+#include <google/protobuf/descriptor.h>
 
 #include <google/protobuf/stubs/logging.h>
 #include <google/protobuf/stubs/common.h>
@@ -232,8 +232,7 @@
   unittest::TestAllExtensions message;
   TestUtil::SetAllExtensions(&message);
 
-  EXPECT_EQ(message.ByteSize(),
-            WireFormat::ByteSize(message));
+  EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message));
   message.Clear();
   EXPECT_EQ(0, message.ByteSize());
   EXPECT_EQ(0, WireFormat::ByteSize(message));
@@ -253,8 +252,7 @@
   unittest::TestPackedExtensions message;
   TestUtil::SetPackedExtensions(&message);
 
-  EXPECT_EQ(message.ByteSize(),
-            WireFormat::ByteSize(message));
+  EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message));
   message.Clear();
   EXPECT_EQ(0, message.ByteSize());
   EXPECT_EQ(0, WireFormat::ByteSize(message));
@@ -264,8 +262,7 @@
   unittest::TestOneof2 message;
   TestUtil::SetOneof1(&message);
 
-  EXPECT_EQ(message.ByteSize(),
-  WireFormat::ByteSize(message));
+  EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message));
   message.Clear();
 
   EXPECT_EQ(0, message.ByteSize());
@@ -425,12 +422,16 @@
 TEST(WireFormatTest, SerializeMessageSet) {
   // Set up a TestMessageSet with two known messages and an unknown one.
   proto2_wireformat_unittest::TestMessageSet message_set;
-  message_set.MutableExtension(
-    unittest::TestMessageSetExtension1::message_set_extension)->set_i(123);
-  message_set.MutableExtension(
-    unittest::TestMessageSetExtension2::message_set_extension)->set_str("foo");
-  message_set.mutable_unknown_fields()->AddLengthDelimited(
-    kUnknownTypeId, "bar");
+  message_set
+      .MutableExtension(
+          unittest::TestMessageSetExtension1::message_set_extension)
+      ->set_i(123);
+  message_set
+      .MutableExtension(
+          unittest::TestMessageSetExtension2::message_set_extension)
+      ->set_str("foo");
+  message_set.mutable_unknown_fields()->AddLengthDelimited(kUnknownTypeId,
+                                                           "bar");
 
   std::string data;
   ASSERT_TRUE(message_set.SerializeToString(&data));
@@ -443,11 +444,11 @@
 
   ASSERT_EQ(3, raw.item_size());
   EXPECT_EQ(
-    unittest::TestMessageSetExtension1::descriptor()->extension(0)->number(),
-    raw.item(0).type_id());
+      unittest::TestMessageSetExtension1::descriptor()->extension(0)->number(),
+      raw.item(0).type_id());
   EXPECT_EQ(
-    unittest::TestMessageSetExtension2::descriptor()->extension(0)->number(),
-    raw.item(1).type_id());
+      unittest::TestMessageSetExtension2::descriptor()->extension(0)->number(),
+      raw.item(1).type_id());
   EXPECT_EQ(kUnknownTypeId, raw.item(2).type_id());
 
   unittest::TestMessageSetExtension1 message1;
@@ -468,12 +469,16 @@
   // above.
 
   proto2_wireformat_unittest::TestMessageSet message_set;
-  message_set.MutableExtension(
-    unittest::TestMessageSetExtension1::message_set_extension)->set_i(123);
-  message_set.MutableExtension(
-    unittest::TestMessageSetExtension2::message_set_extension)->set_str("foo");
-  message_set.mutable_unknown_fields()->AddLengthDelimited(
-    kUnknownTypeId, "bar");
+  message_set
+      .MutableExtension(
+          unittest::TestMessageSetExtension1::message_set_extension)
+      ->set_i(123);
+  message_set
+      .MutableExtension(
+          unittest::TestMessageSetExtension2::message_set_extension)
+      ->set_str("foo");
+  message_set.mutable_unknown_fields()->AddLengthDelimited(kUnknownTypeId,
+                                                           "bar");
 
   int size = message_set.ByteSize();
   EXPECT_EQ(size, message_set.GetCachedSize());
@@ -519,8 +524,9 @@
 
   {
     unittest::RawMessageSet::Item* item = raw.add_item();
-    item->set_type_id(
-      unittest::TestMessageSetExtension1::descriptor()->extension(0)->number());
+    item->set_type_id(unittest::TestMessageSetExtension1::descriptor()
+                          ->extension(0)
+                          ->number());
     unittest::TestMessageSetExtension1 message;
     message.set_i(123);
     message.SerializeToString(item->mutable_message());
@@ -528,8 +534,9 @@
 
   {
     unittest::RawMessageSet::Item* item = raw.add_item();
-    item->set_type_id(
-      unittest::TestMessageSetExtension2::descriptor()->extension(0)->number());
+    item->set_type_id(unittest::TestMessageSetExtension2::descriptor()
+                          ->extension(0)
+                          ->number());
     unittest::TestMessageSetExtension2 message;
     message.set_str("foo");
     message.SerializeToString(item->mutable_message());
@@ -548,10 +555,16 @@
   proto2_wireformat_unittest::TestMessageSet message_set;
   ASSERT_TRUE(message_set.ParseFromString(data));
 
-  EXPECT_EQ(123, message_set.GetExtension(
-    unittest::TestMessageSetExtension1::message_set_extension).i());
-  EXPECT_EQ("foo", message_set.GetExtension(
-    unittest::TestMessageSetExtension2::message_set_extension).str());
+  EXPECT_EQ(123,
+            message_set
+                .GetExtension(
+                    unittest::TestMessageSetExtension1::message_set_extension)
+                .i());
+  EXPECT_EQ("foo",
+            message_set
+                .GetExtension(
+                    unittest::TestMessageSetExtension2::message_set_extension)
+                .str());
 
   ASSERT_EQ(1, message_set.unknown_fields().field_count());
   ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED,
@@ -592,8 +605,11 @@
     proto2_wireformat_unittest::TestMessageSet message_set;
     ASSERT_TRUE(message_set.ParseFromString(data));
 
-    EXPECT_EQ(123, message_set.GetExtension(
-        unittest::TestMessageSetExtension1::message_set_extension).i());
+    EXPECT_EQ(123,
+              message_set
+                  .GetExtension(
+                      unittest::TestMessageSetExtension1::message_set_extension)
+                  .i());
   }
   {
     // Test parse the message via Reflection.
@@ -603,8 +619,11 @@
     EXPECT_TRUE(WireFormat::ParseAndMergePartial(&input, &message_set));
     EXPECT_TRUE(input.ConsumedEntireMessage());
 
-    EXPECT_EQ(123, message_set.GetExtension(
-        unittest::TestMessageSetExtension1::message_set_extension).i());
+    EXPECT_EQ(123,
+              message_set
+                  .GetExtension(
+                      unittest::TestMessageSetExtension1::message_set_extension)
+                  .i());
   }
 }
 
@@ -699,11 +718,11 @@
 TEST(WireFormatTest, UnknownFieldRecursionLimit) {
   unittest::TestEmptyMessage message;
   message.mutable_unknown_fields()
-        ->AddGroup(1234)
-        ->AddGroup(1234)
-        ->AddGroup(1234)
-        ->AddGroup(1234)
-        ->AddVarint(1234, 123);
+      ->AddGroup(1234)
+      ->AddGroup(1234)
+      ->AddGroup(1234)
+      ->AddGroup(1234)
+      ->AddVarint(1234, 123);
   std::string data;
   message.SerializeToString(&data);
 
@@ -733,27 +752,27 @@
 #define ZigZagEncode64(x) WireFormatLite::ZigZagEncode64(x)
 #define ZigZagDecode64(x) WireFormatLite::ZigZagDecode64(x)
 
-  EXPECT_EQ(0u, ZigZagEncode32( 0));
+  EXPECT_EQ(0u, ZigZagEncode32(0));
   EXPECT_EQ(1u, ZigZagEncode32(-1));
-  EXPECT_EQ(2u, ZigZagEncode32( 1));
+  EXPECT_EQ(2u, ZigZagEncode32(1));
   EXPECT_EQ(3u, ZigZagEncode32(-2));
   EXPECT_EQ(0x7FFFFFFEu, ZigZagEncode32(0x3FFFFFFF));
   EXPECT_EQ(0x7FFFFFFFu, ZigZagEncode32(0xC0000000));
   EXPECT_EQ(0xFFFFFFFEu, ZigZagEncode32(0x7FFFFFFF));
   EXPECT_EQ(0xFFFFFFFFu, ZigZagEncode32(0x80000000));
 
-  EXPECT_EQ( 0, ZigZagDecode32(0u));
+  EXPECT_EQ(0, ZigZagDecode32(0u));
   EXPECT_EQ(-1, ZigZagDecode32(1u));
-  EXPECT_EQ( 1, ZigZagDecode32(2u));
+  EXPECT_EQ(1, ZigZagDecode32(2u));
   EXPECT_EQ(-2, ZigZagDecode32(3u));
   EXPECT_EQ(0x3FFFFFFF, ZigZagDecode32(0x7FFFFFFEu));
   EXPECT_EQ(0xC0000000, ZigZagDecode32(0x7FFFFFFFu));
   EXPECT_EQ(0x7FFFFFFF, ZigZagDecode32(0xFFFFFFFEu));
   EXPECT_EQ(0x80000000, ZigZagDecode32(0xFFFFFFFFu));
 
-  EXPECT_EQ(0u, ZigZagEncode64( 0));
+  EXPECT_EQ(0u, ZigZagEncode64(0));
   EXPECT_EQ(1u, ZigZagEncode64(-1));
-  EXPECT_EQ(2u, ZigZagEncode64( 1));
+  EXPECT_EQ(2u, ZigZagEncode64(1));
   EXPECT_EQ(3u, ZigZagEncode64(-2));
   EXPECT_EQ(ULL(0x000000007FFFFFFE), ZigZagEncode64(LL(0x000000003FFFFFFF)));
   EXPECT_EQ(ULL(0x000000007FFFFFFF), ZigZagEncode64(LL(0xFFFFFFFFC0000000)));
@@ -762,9 +781,9 @@
   EXPECT_EQ(ULL(0xFFFFFFFFFFFFFFFE), ZigZagEncode64(LL(0x7FFFFFFFFFFFFFFF)));
   EXPECT_EQ(ULL(0xFFFFFFFFFFFFFFFF), ZigZagEncode64(LL(0x8000000000000000)));
 
-  EXPECT_EQ( 0, ZigZagDecode64(0u));
+  EXPECT_EQ(0, ZigZagDecode64(0u));
   EXPECT_EQ(-1, ZigZagDecode64(1u));
-  EXPECT_EQ( 1, ZigZagDecode64(2u));
+  EXPECT_EQ(1, ZigZagDecode64(2u));
   EXPECT_EQ(-2, ZigZagDecode64(3u));
   EXPECT_EQ(LL(0x000000003FFFFFFF), ZigZagDecode64(ULL(0x000000007FFFFFFE)));
   EXPECT_EQ(LL(0xFFFFFFFFC0000000), ZigZagDecode64(ULL(0x000000007FFFFFFF)));
@@ -775,22 +794,22 @@
 
   // Some easier-to-verify round-trip tests.  The inputs (other than 0, 1, -1)
   // were chosen semi-randomly via keyboard bashing.
-  EXPECT_EQ(    0, ZigZagDecode32(ZigZagEncode32(    0)));
-  EXPECT_EQ(    1, ZigZagDecode32(ZigZagEncode32(    1)));
-  EXPECT_EQ(   -1, ZigZagDecode32(ZigZagEncode32(   -1)));
+  EXPECT_EQ(0, ZigZagDecode32(ZigZagEncode32(0)));
+  EXPECT_EQ(1, ZigZagDecode32(ZigZagEncode32(1)));
+  EXPECT_EQ(-1, ZigZagDecode32(ZigZagEncode32(-1)));
   EXPECT_EQ(14927, ZigZagDecode32(ZigZagEncode32(14927)));
   EXPECT_EQ(-3612, ZigZagDecode32(ZigZagEncode32(-3612)));
 
-  EXPECT_EQ(    0, ZigZagDecode64(ZigZagEncode64(    0)));
-  EXPECT_EQ(    1, ZigZagDecode64(ZigZagEncode64(    1)));
-  EXPECT_EQ(   -1, ZigZagDecode64(ZigZagEncode64(   -1)));
+  EXPECT_EQ(0, ZigZagDecode64(ZigZagEncode64(0)));
+  EXPECT_EQ(1, ZigZagDecode64(ZigZagEncode64(1)));
+  EXPECT_EQ(-1, ZigZagDecode64(ZigZagEncode64(-1)));
   EXPECT_EQ(14927, ZigZagDecode64(ZigZagEncode64(14927)));
   EXPECT_EQ(-3612, ZigZagDecode64(ZigZagEncode64(-3612)));
 
-  EXPECT_EQ(LL(856912304801416), ZigZagDecode64(ZigZagEncode64(
-            LL(856912304801416))));
-  EXPECT_EQ(LL(-75123905439571256), ZigZagDecode64(ZigZagEncode64(
-            LL(-75123905439571256))));
+  EXPECT_EQ(LL(856912304801416),
+            ZigZagDecode64(ZigZagEncode64(LL(856912304801416))));
+  EXPECT_EQ(LL(-75123905439571256),
+            ZigZagDecode64(ZigZagEncode64(LL(-75123905439571256))));
 }
 
 TEST(WireFormatTest, RepeatedScalarsDifferentTagSizes) {
@@ -1029,8 +1048,8 @@
   // contains exactly the given bytes, which may be invalid.
   std::string MakeInvalidEmbeddedMessage(const char* bytes, int size) {
     const FieldDescriptor* field =
-      unittest::TestAllTypes::descriptor()->FindFieldByName(
-        "optional_nested_message");
+        unittest::TestAllTypes::descriptor()->FindFieldByName(
+            "optional_nested_message");
     GOOGLE_CHECK(field != NULL);
 
     std::string result;
@@ -1052,8 +1071,7 @@
   std::string MakeInvalidGroup(const char* bytes, int size,
                                bool include_end_tag) {
     const FieldDescriptor* field =
-      unittest::TestAllTypes::descriptor()->FindFieldByName(
-        "optionalgroup");
+        unittest::TestAllTypes::descriptor()->FindFieldByName("optionalgroup");
     GOOGLE_CHECK(field != NULL);
 
     std::string result;
@@ -1066,7 +1084,7 @@
       output.WriteString(std::string(bytes, size));
       if (include_end_tag) {
         output.WriteVarint32(WireFormatLite::MakeTag(
-          field->number(), WireFormatLite::WIRETYPE_END_GROUP));
+            field->number(), WireFormatLite::WIRETYPE_END_GROUP));
       }
     }
 
@@ -1115,7 +1133,6 @@
   }
 }
 
-
 TEST_F(WireFormatInvalidInputTest, InvalidGroup) {
   unittest::TestAllTypes message;
 
@@ -1191,10 +1208,10 @@
 // ReadValidUTF8String:  fine.
 // WriteAnyBytes: fine.
 // ReadAnyBytes: fine.
-const char * kInvalidUTF8String = "Invalid UTF-8: \xA0\xB0\xC0\xD0";
+const char* kInvalidUTF8String = "Invalid UTF-8: \xA0\xB0\xC0\xD0";
 // This used to be "Valid UTF-8: \x01\x02\u8C37\u6B4C", but MSVC seems to
 // interpret \u differently from GCC.
-const char * kValidUTF8String = "Valid UTF-8: \x01\x02\350\260\267\346\255\214";
+const char* kValidUTF8String = "Valid UTF-8: \x01\x02\350\260\267\346\255\214";
 
 template <typename T>
 bool WriteMessage(const char* value, T* message, std::string* wire_buffer) {
diff --git a/src/google/protobuf/wrappers.pb.cc b/src/google/protobuf/wrappers.pb.cc
index c7277d9..bedf4e1 100644
--- a/src/google/protobuf/wrappers.pb.cc
+++ b/src/google/protobuf/wrappers.pb.cc
@@ -180,18 +180,6 @@
 PROTOBUF_EXPORT ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_BytesValue_google_2fprotobuf_2fwrappers_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsBytesValue_google_2fprotobuf_2fwrappers_2eproto}, {}};
 
-void InitDefaults_google_2fprotobuf_2fwrappers_2eproto() {
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_DoubleValue_google_2fprotobuf_2fwrappers_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FloatValue_google_2fprotobuf_2fwrappers_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Int64Value_google_2fprotobuf_2fwrappers_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_UInt64Value_google_2fprotobuf_2fwrappers_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Int32Value_google_2fprotobuf_2fwrappers_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_UInt32Value_google_2fprotobuf_2fwrappers_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_BoolValue_google_2fprotobuf_2fwrappers_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_StringValue_google_2fprotobuf_2fwrappers_2eproto.base);
-  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_BytesValue_google_2fprotobuf_2fwrappers_2eproto.base);
-}
-
 static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_google_2fprotobuf_2fwrappers_2eproto[9];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_google_2fprotobuf_2fwrappers_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_google_2fprotobuf_2fwrappers_2eproto = nullptr;
@@ -297,8 +285,7 @@
   "\006proto3"
   ;
 static ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_google_2fprotobuf_2fwrappers_2eproto = {
-  false, InitDefaults_google_2fprotobuf_2fwrappers_2eproto, 
-  descriptor_table_protodef_google_2fprotobuf_2fwrappers_2eproto,
+  false, descriptor_table_protodef_google_2fprotobuf_2fwrappers_2eproto,
   "google/protobuf/wrappers.proto", &assign_descriptors_table_google_2fprotobuf_2fwrappers_2eproto, 447,
 };
 
@@ -306,6 +293,15 @@
   static constexpr ::PROTOBUF_NAMESPACE_ID::internal::InitFunc deps[1] =
   {
   };
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_DoubleValue_google_2fprotobuf_2fwrappers_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_FloatValue_google_2fprotobuf_2fwrappers_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Int64Value_google_2fprotobuf_2fwrappers_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_UInt64Value_google_2fprotobuf_2fwrappers_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_Int32Value_google_2fprotobuf_2fwrappers_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_UInt32Value_google_2fprotobuf_2fwrappers_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_BoolValue_google_2fprotobuf_2fwrappers_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_StringValue_google_2fprotobuf_2fwrappers_2eproto.base);
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_BytesValue_google_2fprotobuf_2fwrappers_2eproto.base);
  ::PROTOBUF_NAMESPACE_ID::internal::AddDescriptors(&descriptor_table_google_2fprotobuf_2fwrappers_2eproto, deps, 0);
 }
 
@@ -385,16 +381,17 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* DoubleValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // double value = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 9) goto handle_unusual;
-        set_value(::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<double>(ptr));
+        value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<double>(ptr);
         ptr += sizeof(double);
         break;
       }
@@ -402,15 +399,20 @@
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool DoubleValue::MergePartialFromCodedStream(
@@ -665,16 +667,17 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* FloatValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // float value = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 13) goto handle_unusual;
-        set_value(::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<float>(ptr));
+        value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<float>(ptr);
         ptr += sizeof(float);
         break;
       }
@@ -682,15 +685,20 @@
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool FloatValue::MergePartialFromCodedStream(
@@ -945,32 +953,38 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Int64Value::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // int64 value = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_value(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Int64Value::MergePartialFromCodedStream(
@@ -1227,32 +1241,38 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* UInt64Value::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // uint64 value = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_value(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool UInt64Value::MergePartialFromCodedStream(
@@ -1509,32 +1529,38 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* Int32Value::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // int32 value = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_value(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool Int32Value::MergePartialFromCodedStream(
@@ -1791,32 +1817,38 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* UInt32Value::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // uint32 value = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_value(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool UInt32Value::MergePartialFromCodedStream(
@@ -2073,32 +2105,38 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* BoolValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // bool value = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 8) goto handle_unusual;
-        set_value(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr));
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool BoolValue::MergePartialFromCodedStream(
@@ -2360,32 +2398,38 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* StringValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // string value = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParserUTF8(mutable_value(), ptr, ctx, "google.protobuf.StringValue.value");
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool StringValue::MergePartialFromCodedStream(
@@ -2663,32 +2707,38 @@
 
 #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 const char* BytesValue::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
   ::PROTOBUF_NAMESPACE_ID::Arena* arena = GetArenaNoVirtual(); (void)arena;
   while (!ctx->Done(&ptr)) {
     ::PROTOBUF_NAMESPACE_ID::uint32 tag;
     ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
-    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    CHK_(ptr);
     switch (tag >> 3) {
       // bytes value = 1;
       case 1: {
         if (static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) != 10) goto handle_unusual;
         ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(mutable_value(), ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        CHK_(ptr);
         break;
       }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
           ctx->SetLastTag(tag);
-          return ptr;
+          goto success;
         }
         ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
-        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        CHK_(ptr != nullptr);
         break;
       }
     }  // switch
   }  // while
+success:
   return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
 }
 #else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
 bool BytesValue::MergePartialFromCodedStream(